Windows - Csökkentett módban fut a gép? Mi a tartományi szerepköre és a tulajdonosának neve?

WMI 14. rész

forráskód letöltése
A fenti kérdésekre néhány egérkattintás után megkaphatjuk a választ, de az is lehet, hogy elég csak a monitorra tekinteni. De mi van akkor, ha programból kell hozzájutni az információhoz? Ekkor az egyik legegyszerűbb megoldás a Windows Management Instrumentation (WMI) szolgáltatás használata, amelyben egy rendszerosztály három tulajdonságát kell elérni. Az alábbiakban bemutatjuk hogyan.
Cikkünkhöz mellékeltük a tárgyalásra kerülő szkripteket az alábbiak szerint:
"BootState.vbs" -Kiírja, hogy milyen üzemmódban fut az operációs rendszer (normál, csökkentett vagy csökkentett mód hálózattal).
"DomainRole.vbs" - Megjeleníti az adott gép Active Directory tartományon belüli szerepkörét (tartományvezérlő, munkaállomás, backup szerver, stb.).
"Owner.vbs" - Visszaadja a Windows bejegyzett tulajdonosának nevét.
Cikksorozatunk előző részeiben már használtuk a "Win32_ComputerSystem" osztályt. Most ismét elővesszük és három érdeklődésre számot tartó tulajdonságot ismertetünk. Maga az osztály néhány általános beállítást tárol az operációs rendszer és a számítógép különböző területeiről. Windows NT 4.0-tól kezdve elérhető, de minimum Service Pack 4 szükséges hozzá. Windows 9x/ME rendszereken nem áll rendelkezésre. A WMI adatbázisán belül az alapértelmezett \root\cimv2 névtérben kapott helyet, így nem igényli az elérési út megadását (kivéve, ha megváltoztattuk az alapértelmezett névteret). Az öröklődési szerkezetben egyedül a "CIM_UnitaryComputerSystem" osztály áll felette.
Milyen módban lett indítva a gép?
Windows 95-től kezdve többféle üzemmódban lehetett elindítani az operációs rendszert. Ennek elsősorban diagnosztikai, hibakeresési és javítási funkciói voltak - vannak. A lehetőség megmaradt a Windows rendszerek későbbi verzióiban is. Alapesetben rendszerindításkor a bootszektor betöltése után az F8 funkcióbillentyű lenyomásakor megjelenik egy indítómenü, ahol lehetőség nyílik az üzemmódok közül választani. Leggyakrabban az úgynevezett csökkentett módot szokás használni, hálózattal vagy anélkül. Lényege, hogy ilyenkor csak annyi illesztőprogramot tölt be, amennyi a rendszer elindításához feltétlenül szükséges. Így a hibásan működő illesztőkből származó problémák orvosolhatók. Általában ránézésre megmondható, hogy egy gép csökkentett módban fut (erre utaló felirat az asztalon, 640 x 480-as képernyőfelbontás, stb.), de az már csak némi keresgélés után, hogy ilyenkor van-e hálózat. A WMI "Win32_ComputerSystem" osztályának "BootupState" tulajdonsága szöveges formában tárolja az aktuális üzemmódot a Windows nyelvi beállításaitól függetlenül angolul. A dolog előnye, hogy bármelyik ismertebb programozási nyelvből elérhető és így programból eldönthető az üzemmód típusa. A következőkben Visual Basic szkriptbeli megvalósítást mutatjuk be.
Első lépés, mint minden hasonló WMI szkript esetében a megfelelő osztály elérése az aktuális névtérben. Készítünk egy WQL lekérdezést, ahol a "Win32_ComputerSystem" osztályból csak a " BootupState" tulajdonság tartalmát olvassuk ki.
Set BootState = GetObject ("winmgmts: {impersonationLevel = impersonate}").ExecQuery ("select BootupState from Win32_ComputerSystem")
Ezután nincs más dolgunk, mint feldolgozni az eredményt. Mivel ez angol nyelven áll rendelkezésünkre, ezért egyszerű fordítást alkalmazunk, ahol IF THEN parancsokkal döntjük el az adott üzemmódhoz tartozó kiírandó szöveget.
Text="A számítógép indításának módja: "
for each State in BootState
 if State.BootupState="Normal boot" then WScript.Echo Text & "Normál indítás (=" & State.BootupState & ")"
 if State.BootupState="Fail-safe boot" then WScript.Echo Text & "Csökkentett módú indítás (=" & State.BootupState & ")"
 if State.BootupState="Fail-safe with network boot" then WScript.Echo Text & "Csökkentett módú indítás hálózattal (=" & State.BootupState & ")"
Next
Tartományi szerepkörök
Néhánygépes hálózatoknál munkacsoportos rendszerben a gépek egyenrangú (peer to peer) szerepet töltenek be. Továbblépést jelent, ha valamelyiket kinevezzük nyomtató kiszolgálónak és ez csak ekként működik, vagy az egyik gépen csak a raktárkészlet nyilvántartás fut, míg a másikon csak faxolás történik. Hálózati szempontból még ilyenkor is egyenrangúságról beszélünk, mert hardvertől (és telepített szoftvertől) függően bármelyik gép átveheti a másik feladatát, az operációs rendszer nem gördít elé akadályt. Nem ez a helyzet a Windows tartományok esetében. Itt nem lehet egy munkaállomásból tartományvezérlő, web- vagy terminálkiszolgáló. A tartományvezérlők sem egyenrangúak, az egyik tárol globális katalógust a másik nem, stb. Ránézésre nem mindig mondható meg egy gépről, hogy tulajdonképpen milyen fő feladat elvégzésére szolgál. Ezen segít a fent említett WMI osztály "DomainRole" (=tartományi szerep) tulajdonsága.
A tulajdonság tartalmának kiolvasása ugyanúgy történik, mint az előző esetben, csak most a "DomainRole" nevet kell használni.
Set RoleSet = GetObject ("winmgmts: {impersonationLevel = impersonate}").ExecQuery ("select DomainRole from Win32_ComputerSystem")
A visszakapott eredmény egy nullától ötig terjedő szám, ami az alábbiakat jelenti. Ebben az esetben az előzőekkel ellentétben magyarul nem, hanem csak angolul jelenítjük meg a szerepkört.

Text="A számítógép tartományi szerepköre: "
for each Role in RoleSet
 if Role.DomainRole = 0 then WScript.Echo Text & "Standalone Workstation"
 if Role.DomainRole = 1 then WScript.Echo Text & "Member Workstation"  
 if Role.DomainRole = 2 then WScript.Echo Text & "Standalone Server"  
 if Role.DomainRole = 3 then WScript.Echo Text & "Member Server"  
 if Role.DomainRole = 4 then WScript.Echo Text & "Backup Domain Controller"  
 if Role.DomainRole = 5 then WScript.Echo Text & "Primary Domain Controller"  
Next
Az operációs rendszer tulajdonosának neve
A Windows telepítéskor kéri, hogy adjuk meg nevünket. Nem kell egyedinek lenni a hálózatban és nem kell valós nevet sem beírni, nem történik erre vonatkozóan ellenőrzés. A dolognak jogi oldala van (részletek a licence szerződésben), ezért célszerű mégis helyesen megadni. Programfejlesztők egyedi megrendelésre készített programok esetében a kódba rejthetik a név kiolvasását és ellenőrzését, megakadályozandó, hogy más gépekre is felkerüljön az alkalmazásuk. Ez ugyan nem a tökéletes védelem, de más módszerekkel társítva növeli a biztonságot. Az alábbi szkript példa arra, hogy lehet a rendszerből kiolvasni és megjeleníteni. Programozás technikailag az előző két megoldáshoz képest nincs különbség.
Set Owners = GetObject ("winmgmts: {impersonationLevel = impersonate}").ExecQuery ("select PrimaryOwnerName from Win32_ComputerSystem")
for each Owner in Owners
  WScript.Echo "A gép bejegyzett tulajdonosának neve: " & Owner.PrimaryOwnerName
Next

WMI cikksorozat