preloader
14 January 2011 / #P2v

Suppression des périphériques cachés

post-thumb

Dans le cas d’une conversion d’une machine (physique ou virtuelle) vers une image VMware, certaines étapes post-conversion peuvent être réalisées afin de purger la machine des traces des anciens périphériques systèmes.

Par exemple, prenons un P2V (Physical-to-Virtual) d’un serveur IBM.

Une fois la conversion terminée, tous les périphériques qui sont liés au hardware IBM sont toujours présents dans le gestionnaire de périphériques Windows.

Pour les afficher, il suffit d’aller dans le gestionnaire de périphériques et de cliquer sur View > Show hidden devices

HiddenDevices01

Cependant, dans le cas d’une conversion, vous ne verrez pas tout les anciens périphériques systèmes. Pour tout faire apparaitre, il faut rajouter une variable d’environnement devmgr_show_nonpresent_devices = 1

Vous pouvez l’ajouter automatiquement en Powershell avec cette commande :

[Environment]::SetEnvironmentVariable("devmgr_show_nonpresent_devices", "1", "Machine")

Une fois positionnée (pensez à vous déconnecter/reconnecter pour que la nouvelle variable d’environnement soit prise en compte), vous verrez apparaitre tous les anciens périphériques systèmes avec leurs icones grisés.

HiddenDevices02

Pour purger ces anciens périphériques qui n’ont plus lieu d’exister en machine virtuelle, soit vous pouvez le faire en cliquodrome, soit en scripting (^^).

Voici donc le script Powershell que nous utilisons dans le cas de P2V (ou même de V2V/P2P).

Note : Ce script utilise d’outil de Microsoft devcon.exe qui permet de gérer les périphériques systèmes en ligne de commande, vous pouvez le récupérer ici : http://support.microsoft.com/kb/311272

<#
.SYNOPSIS
    Remove hidden disconnected devices from device manager
.DESCRIPTION
    The script will delete all disconnected devices from
    windows device manager.
    It will be helpfull after P2V tasks to remove old physical
    devices that appears hidden in device manager
.NOTES
    Authors:    www.cloudydude.fr
#>

# Variables
[boolean]$NoDevcon = $true
$ExeDevcon = "devcon.exe"

# Cache les retours erreurs
$ErrorAction = SilentlyContinue

# Vérification de la présence de l'outil devcon
if (-Not (test-path ".\$ExeDevcon") {
    $startinfo = new-object System.Diagnostics.ProcessStartInfo
    $startinfo.FileName = $ExeDevcon
    $startinfo.Arguments = "\?"
    $startinfo.WindowStyle = "Hidden"
    $startinfo.CreateNoWindow = $TRUE
    $process = new-object System.Diagnostics.Process
    $process = [System.Diagnostics.Process]::Start($startinfo)
    $process.WaitForExit()
    if ($process.Id) { $NoDevcon = $false }
}

if ($NoDevcon) {
    Write-Host -ForegroundColor Red "L'utilitaire $ExeDevcon n'a pas été trouvé, vous pouvez le télécharger ici :"
    Write-Host -ForegroundColor Red `t "http://support.microsoft.com/kb/311272"
    Break
} else {
    Write-Host -ForegroundColor Green "L'utilitaire devcon.exe est accessible, poursuite de l'exécution du script ..."
}

# Confirmation de l'exécution de la commande
Write-Host -ForegroundColor Yellow "Le script va supprimer tous les périphériques PnP qui ne sont pas connectés."
$ReponseContinue = Read-Host "Etes-vous sûr de vouloir effectuer cette action ? (oui/non)"

if ($ReponseContinue -ne "oui") { Break }

# Sauvegarde de la liste de tous les device dans un fichier temporaire
DEVCON Find * | FIND /I /V "matching device(s)" > "$env:temp\DevconFind.txt"

# Vérification du fichier d'export
if (-Not (test-path "$env:temp\DevconFind.txt") {
    Write-Host -ForegroundColor Red "Erreur d'accès au fichier $env:temp\DevconFind.txt"
    Break
}

# Parcours des périphériques et suppression de ceux qui ne sont pas dans le fichier d'export
Foreach ($device in (DEVCON FindAll * ^| FIND /I /V "matching device(s)") {
    $devID = [regex]::escape($device.Split(":")[0].Trim()
    $devLibelle = $device.Split(":")[1].Trim()
    if (-Not (Select-String -Pattern "$devID" -Path "$env:temp\DevconFind.txt") {
        #Write-Host -ForegroundColor Red "$devLibelle plus connecté, suppression en cours de ..."$device.Split(":")[0]"..."
        $tempDevice = $device.Split(":")[0].Trim()
        DEVCON Remove "@$tempDevice"
    }
}

# Suppression du fichier temporaire
Remove-Item -Path "$env:temp\DevconFind.txt" -Force -Confirm:$false

Note : A la base, le script était en BATCH Windows, mais ça nous coutait tellement de publier du batch qu’on l’a remis à jour en Powershell.

Si vous n’avez pas Powershell ou n’aimez pas ce langage (ça existe ??? ^^), voici le script original en BATCH :

:: Sauvegarde de la liste de tous les device dans un fichier temporaire  
DEVCON Find * | FIND /I /V "matching device(s)" > "%Temp%\DevconFind.txt"

:: Parcours des périphériques et suppression de ceux qui ne sont pas dans le fichier d'export  
FOR /F "tokens=1 delims=: " %%A IN ('DEVCON FindAll * ^| FIND /I /V "matching device(s)"') DO (  
TYPE "%Temp%\DevconFind.txt" | FIND "%%~A" >NUL  
IF ERRORLEVEL 1 %Debug% DEVCON Remove "@%%~A"  
)

:: Suppression du fichier temporaire  
DEL "%Temp%\DevconFind.txt"

> Frederic MARTIN