Suppression des périphériques cachés

HiddenDevices_06

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 :

[bat]:: 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"[/bat]

4 comments

  1. 9 lignes en BATCH Windows pour + de 60 en powershell
    Je cherche encore le cote pratique du powershell, bien que je l’avoue c’est quand meme plus puissant :)

  2. Forcement pour le coup l’exemple est pas trop parlant ^^

    Pour la défense, le script Powershell est très (trop) détaillé avec plus de commentaires.
    Au minimum le script pourrait faire une 15aine de ligne :p

    Mais vu que l’action finale est fait par l’outil devcon.exe, le Powershell n’a pas vraiment d’avantage ici (surtout qu’il faut Powershell installé pour l’exécuter), mais faire un billet avec uniquement un script batch nous coûtait beaucoup ^^

  3. Pingback: [Mémento] Préparation P2V : adresse IP

  4. Pingback: [Memento] P2V preparation : IP address

Laisser un commentaire

Required fields are marked *.

*