Windows - Programfuttatás a hálózati egy távoli gépén

forráskód letöltése
Indítsunk el a hálózat egyik gépén egy programot. Megtehetjük azt is, hogy odaballagunk és helyben futtatjuk, de sokkal elegánsabb, ha fel sem kelünk a székből. A Windows Management Instrumentation (WMI) szolgáltatás használatával bármelyik gépről elindíthatunk egy új folyamatot bármelyik másik gépen. Egyetlen kikötés van csupán: megfelelő szintű jogosultsággal kell rendelkeznünk.
Cikkünkhöz mellékeltük az alábbi szkriptet. Futtatása után a megadott nevű hálózati gépen elindítja a Jegyzettömb (Notepad) programot. Használata előtt módosítani kell az első sorokban szereplő változók tartalmát, érvényes gép- és felhasználói név, valamint jelszó megadásával.
Mit jelent a megfelelő szintű jogosultság? Nem feltétlenül rendszergazdai jogokat, de mindenképpen be kell tudnunk jelentkezni a távoli gépre hálózaton keresztül és ott tudnunk kell futtatni a kiválasztott programot. Eddigi szkriptjeinkben az aktuálisan bejelentkezett felhasználó nevével és jelszavával értünk el különböző helyi és távoli rendszerobjektumokat. Most szakítunk ezzel a hagyománnyal és egy olyan szkriptet fogunk készíteni, amely önmagában tárolja a hitelesítési információkat. Vegyük figyelembe, hogy a szkriptek olvasható állományok és a jelszó titkosítás nélkül tárolódik bennük.
Definiáljunk néhány változót. Első és legfontosabb annak meghatározása, hogy melyik gépen akarjuk futtatni a programot. Készítsünk egy "RemoteMachine" nevű sztringet és adjuk meg a távoli gép nevét vagy IP címét. Ezt követi a felhasználói ("Username") név és jelszó ("Password"). Ha a hálózaton Active Directory tartomány működik, akkor a névnél alkalmazzuk a tartomány\felhasználó formulát. Leendő programunknak lehetnek argumentumai ("Arguments") és aktuális futási könyvtára ("CurrentDir"). Ami biztos hogy kell, az a futtatandó program neve ("ExeName").
RemoteMachine = "server"
Username = "animare\rendszergazda"
Password = "123abc"
Arguments = ""
ExeName = "notepad.exe"
CurrentDir = "C:\"
A WMI "SWbemLocator" szolgáltatásának "ConnectServer" metódusával fogunk a távoli géphez kapcsolódni. Paraméterként meg kell adni a gép nevét, elérendő WMI névterét, felhasználói nevet és végül a jelszót.
Set objLocator = CreateObject("WbemScripting.SWbemLocator")
Set objService = objLocator.ConnectServer (RemoteMachine, "root/cimv2", Username, Password)
A folyamatok kezelése a "Win32_Process" osztály feladata. Mellette létezik egy másik absztrakt osztály "Win32_ ProcessStartup" névvel. Első a folyamatokról általános információkat szolgáltat. Utóbbi csak egy folyamat elindításával, azon belüli is az indítási konfigurálással foglalkozik. A "PriorityClass" tulajdonság 2 hatványaival a futtatási prioritást állítja be, a 32-es érték jelenti a normál prioritást. A "ShowWindow" tulajdonsággal szabályozható, hogy a program ablaka rejtett legyen (1), látható (2), összecsukott (3), maximális méretű (4), stb.
Set objProcess = objService.Get("Win32_Process")
Set objProcessStartup = objService.Get("Win32_ProcessStartup")
objProcessStartup.PriorityClass = 32
objProcessStartup.ShowWindow = 2
Hívjuk meg az előkészített új folyamat "Create" metódusát és adjuk át a szkript elején meghatározott paramétereket.
Set objMethod = objProcess.Methods_("Create")
Set objInParameters = objMethod.inParameters.SpawnInstance_()
objInParameters.CommandLine = ExeName & Arguments
objInParameters.CurrentDirectory = CurrentDir
Set objInParameters.ProcessStartupInformation = objProcessStartup
Set objOutParameters = objProcess.ExecMethod_("Create", objInParameters)
Mint látható az "objOutParameters" tárolja az indítás utáni visszakapott értékeket. Ha nullát ad, akkor minden rendben zajlott, kérjük le a folyamatazonosítót (process ID) és jelenítsük meg a képernyőn. Minden nullától különböző szám azt jelenti, hogy sikertelen volt az indítás, ez esetben egy hibaüzenetet jelenítünk meg.
If objOutParameters.returnValue = 0 Then
 WScript.Echo "Sikerült elindítani az alkalmazást. Folymamatazonosítója:" & objOutParameters.ProcessID
Else
 WScript.Echo "Nem sikerült elindítani az alkalmazást."
End If