Flash VBScript

Introduction

Il m’arrive encore de devoir faire du VBScript pour plusieurs de mes clients. Cette demande était un peu spécifique car le client souhaitait pouvoir éteindre une machine Windows XP Embedded (Oui, il y en existe encore) si la session Citrix été déconnectée par stratégie de groupe Active Directory.

Ces postes sont utilisés en mode Kiosque, il était donc nécessaire d’éteindre la machine en cas de coupure de la session Citrix.

Il y a donc deux scripts : un batch pour la stratégie de groupe et un VBS dans le SYSVOL de l’Active Directory.

 

Extinction par VBS et stratégie de groupe

Le script batch est très simple, c’est juste un appel de script distant :

@echo off
cscript \\nwtraders.msft\SYSVOL\nwtraders.msft\scripts\Shutdown-WfcRun32.vbs

Pour le script VBS, il faut d’abord créer un objet Shell. Cet objet Shell sera utilisé par la suite pour lancer l’extinction de la machine :

Set WshShell = WScript.CreateObject("WScript.Shell")

Ensuite on demande au script d’attendre 60 secondes. Cette attente est utilisée lors du démarrage de la machine, permettant ainsi à la session Citrix de se connecter :

Wscript.Sleep 60000

On rentre ensuite dans une boucle Do/Loop. Cette boucle sera utilisée tant que la machine est démarrée permettant ainsi de contrôler si le processus wfcrun32.exe est présent :

Do

.........

Loop

Dans la boucle Do/Loop, il faut créer un objet WMI. Cet objet WMI permet de contrôler la présence du processus wfcrun32.exe sur le système Windows.

Il faut récupérer la présence du processus dans la classe WIN32_Process :

Set wmiSearch = GetObject("WinMgmts:root/cimv2").ExecQuery("SELECT * FROM WIN32_Process WHERE Name = 'wfcrun32.exe'")

Ensuite, il est nécessaire de vérifier le contenu de l’objet wmiSearch avec la méthode Count. Si wmiSearch.Count est égal 0, cela veut dire que le processus wfcrun32.exe n’est pas démarré :

If wmiSearch.Count = 0 Then        
   Call WshShell.Run("shutdown /s /t 0 /f", 1, True)                           
   WScript.Quit(0)        
End If

Pour la fin, on remet une attente de 10 secondes. Cette attente évite le bouclage permanent de la boucle Do/Loop :

WScript.Sleep 10000

 

Script complet

 

WshShellSet WshShell = WScript.CreateObject("WScript.Shell")
Wscript.Sleep 60000

Do
   Set wmiSearch = GetObject("WinMgmts:root/cimv2").ExecQuery("SELECT * FROM WIN32_Process WHERE Name = 'wfcrun32.exe'")         
   If wmiSearch.Count = 0 Then        
      Call WshShell.Run("shutdown /s /t 0 /f", 1, True)
      WScript.Quit(0)        
   End If
   WScript.Sleep 10000
Loop

Votre commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l’aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google

Vous commentez à l’aide de votre compte Google. Déconnexion /  Changer )

Image Twitter

Vous commentez à l’aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l’aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s