
Mellékeltük az alábbi szkriptet "Autologoff.vbs" néven. Futtatása után elindítja a "Jegyzettömb" ("Notepad") alkalmazást, bezárása után kilépteti a felhasználót. A futtatandó programot az első sor "Program" változójában lehet módosítani, a bezárási műveletet pedig a második sor "Action" változójában az alábbiak figyelembevételével.
Akkor is hasznát vehetjük egy ilyen vagy hasonló szkriptnek, ha elindítunk egy hosszabb letöltést az Internetről és nem akarjuk megvárni a végét. Figyeltetjük, hogy mikor záródik be a letöltő alkalmazás, majd kikapcsoltatjuk a számítógépet egyben bontva a vonalat. Ugyancsak hasznos lehet egy alkalmazás feltelepítését követő újraindításnál is.
Nézzük a szkriptet és működésének magyarázatát:
Két dolgot adunk meg az elején lévő változókban: az egyik az elindítandó alkalmazás ("Program"), jelen esetben a NOTEPAD.EXE, másik a bezárás után végrehajtandó művelet: kijelentkezés (logoff), leállítás (shutdown), újraindítás (reboot), újraindítás anélkül, hogy megvárnánk a nem mentett adatok mentését (force), végül a számítógép kikapcsolása (poweroff).
Program = "notepad.exe"
Action = "Logoff"
A műveletet végrehajtó programkódot helyezzük el egy szubrutinban és definiáljuk a fenti parancsokat. Mindegyikhez tartozik egy szám mellyel a WMI (Windows Management Instrumentation) szolgáltatáson belül hivatkozhatunk rá.
Sub ShutDown(sNode, sCmd)
Const EWX_LOGOFF = 0
Const EWX_SHUTDOWN = 1
Const EWX_REBOOT = 2
Const EWX_FORCE = 4
Const EWX_POWEROFF = 8
A \root\cimv2 névtérben lévő "Win32_OperatingSystem" osztály "Win32shutdown" metódusával lehet az operációs rendszer kilépési, leállítási műveleteit végrehajtani. Elsőként létre kell hoznunk egy kapcsolat objektumot az osztállyal, majd a kapott eredményen végrehajtani a megfelelő parancsot.
Set WMI = GetObject("winmgmts:" & "{impersonationLevel=impersonate,(Shutdown)}!\\" & sNode & "\root\cimv2")
Set colOperatingSystems = WMI.ExecQuery ("Select * from Win32_OperatingSystem")
For Each obj in colOperatingSystems
Set oOS = obj : Exit For
Next
Az "iCmd" változóban a fenti konstansok összegeként állítsuk elő a végrehajtandó műveletet.
sCmd = LCase(sCmd)
Select Case sCmd
Case "logoff"
iCmd = EWX_LOGOFF
Case "logoff_force"
iCmd = EWX_LOGOFF + EWX_FORCE
Case "shutdown"
iCmd = EWX_SHUTDOWN
Case "shutdown_force"
iCmd = EWX_SHUTDOWN + EWX_FORCE
Case "reboot"
iCmd = EWX_REBOOT
Case "reboot_force"
iCmd = EWX_REBOOT + EWX_FORCE
Case "poweroff"
iCmd = EWX_POWEROFF
Case "poweroff_force"
iCmd = EWX_POWEROFF + EWX_FORCE
Case Else
iCmd = EWX_POWEROFF
End Select
Végül hívjuk meg a "Win32shutdown" metódust, paraméterként átadva a végrehajtandó műveletet.
oOS.Win32shutdown iCmd
End Sub
Logikailag nem a fenti szubrutin jelenti a szkript elejét, hanem a most következő sorok. A "WScript.Shell" osztály "Run" metódusával lehet VBScript-ből külső programokat indítani. A "Program" változóban szereplő alkalmazást fogjuk futtatni.
Set oShell = CreateObject("WScript.Shell")
oShell.Run Program
A WMI "Win32_Process" osztálya kezeli a rendszerben futó folyamatokat. Lekérjük a "Program" adatait és ellenőrizzük, hogy hány példányban fut ("WMIResult.Count"), ha nulla, akkor a felhasználó bezárta vagy egyéb módon, de befejeződött és következhet a fenti szubrutin meghívása. Az "Action" változóban megadott feladat kerül végrehajtásra, alapértelmezésben a helyi gépen ("."). Ha a pont helyett egy másik gép nevét adjuk meg, akkor azon fog végrehajtódni a művelet. Fél másodpercenként ellenőrizzük, hogy fut-e még az alkalmazásunk (Sleep 500).
Set WMI = GetObject("winmgmts:")
Do While True
sWmiq = "select Name from Win32_Process where name='" & Program & "'"
Set WMIResult = WMI.Execquery(sWmiq)
If WMIResult.Count = 0 Then
ShutDown ".", Action
Exit Do
End If
WScript.Sleep 500
Loop