Suppression des périphériques cachés
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
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.
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"