WMI-szkript létrehozása
A WMI-ben elérhető információkat szkriptek használatával tekintheti meg vagy módosíthatja. A szkriptek bármilyen olyan szkriptelési nyelven írhatók, amely támogatja a Microsoft ActiveX-szkriptek üzemeltetését, beleértve a Visual Basic Scripting Editiont (VBScript), a PowerShellt és a Perl-t. A Windows-szkriptgazda (WSH), az Active Server Pages és az Internet Explorer minden WMI-szkriptet képes üzemeltetni.
Jegyzet
A WMI által jelenleg támogatott elsődleges szkriptnyelv a PowerShell. A WMI azonban a VBScript és más nyelvek szkriptelési támogatásának robusztus törzsét is tartalmazza, amely hozzáfér a WMI Scripting API-hoz.
WMI-szkriptnyelvek
A WMI által támogatott két fő nyelv a PowerShell és a VBScript (a Windows szkriptgazda vagy a WSH segítségével).
PowerShell- a WMI-vel való szoros integrációval tervezték. Így a WMI mögöttes elemeinek nagy része a WMI-parancsmagokba van beépítve: Get-WmiObject, Set-WmiInstance, Invoke-WmiMethodés Remove-WmiObject. Az alábbi táblázat a WMI-információk eléréséhez használt általános folyamatokat ismerteti. Vegye figyelembe, hogy bár a példák többsége Get-WMIObject parancsmagot használ, a PowerShell WMI-parancsmagok közül sok ugyanazokkal a paraméterekkel rendelkezik, például -Class vagy -Credentials. Ezért ezen folyamatok közül sok más objektumok esetében is működik. A PowerShell és a WMI részletesebb ismertetését a A Get-WMiObject parancsmag és Windows PowerShell használata – a WMI-kapcsolat– című témakörben talál.
VBScriptezzel szemben kifejezetten meghívja a wmi-Scripting API-t, ahogy azt fentebb említettük. Más nyelvek, például a Perl is használhatják a WMI-hez készült szkriptelési API-t. A dokumentáció alkalmazásában azonban a legtöbb, a WMI-hez készült szkriptelési API-t bemutató minta VBScriptet fog használni. Ha azonban egy programozási technika kifejezetten a VBScriptre jellemző, akkor kiemelve lesz.
A VBScript alapvetően két különböző módon érhető el a WMI-hez. Az első egy SWbemLocator objektum használata a WMI-hez való csatlakozáshoz. Másik lehetőségként használhatja GetObject és egy monikert is. A moniker egy sztring, amely számos elemet ír le: a hitelesítő adatokat, a megszemélyesítési beállításokat, a csatlakoztatni kívánt számítógépet, a WMI-t névteret (azaz azt az általános helyet, ahol a WMI objektumcsoportokat tárol), és hogy milyen WMI-objektumot szeretne lekérni. Az alábbi példák közül sok mindkét technikát ismerteti. További információért lásd a Moniker-sztring létrehozása és a WMI-objektum helyének leírása.
Függetlenül attól, hogy milyen technikával csatlakozik a WMI-hez, valószínűleg egy vagy több objektumot fog lekérni a Scripting API-ból. A leggyakoribb az SWbemObject, amelyet a WMI egy WMI-objektum leírására használ. Alternatív megoldásként használhat egy SWbemServices objektumot a WMI-szolgáltatás leírásához, vagy egy SWbemObjectPath objektumot a WMI-objektumok helyének leírásához. További információ: Szkriptelés SWbemObject és szkriptelési segédobjektumokkal.
A WMI és a szkriptelési nyelv használata, hogyan...
-
... csatlakozik a WMI-hez?
-
A VBScripthez és a WMI-hez készült Scripting API-hoz lekérhet egy SWbemServices objektumot egy monikerrel és egy GetObjecthívásával. Másik lehetőségként csatlakozhat a kiszolgálóhoz az SWbemLocator.ConnectServerhívásával. Ezután az objektum használatával hozzáférhet egy adott WMI-névtérhez vagy WMI-osztálypéldányhoz.
A PowerShell esetében a WMI-hez való csatlakozás általában közvetlenül a parancsmaghívásban történik; ezért nincs szükség további lépésekre.
További információ: WMI-objektum helyének leírása, Moniker karakterlánc létrehozása, valamint Csatlakozás a WMI-hez VBScript.
Set objLocator = CreateObject("WbemScripting.SWbemLocator") Set objService = objLocator.ConnectServer(".", "root\cimv2") ' Second example: implicitly uses the local compuer (.) and default namespace ("root\cimv2") Set objWMIService = GetObject("winmgmts:")
#Already has all the defaults set get-WmiObject Win32_LogicalDisk #Or, to be explicit, get-WmiObject -class Win32_LogicalDisk -Computer "." -Namespace "root\cimv2" -Impersonation Impersonate
-
... adatokat kér le a WMI-ből?
-
A VBScripthez és a WMI-hez készült Scripting API-hoz használjon lekéréses függvényt, például WbemServices.Get vagy WbemServices.InstancesOf. A lekérendő objektum osztálynevét is elhelyezheti egy monikerben, ami hatékonyabb lehet.
PowerShell esetén használja a -Class paramétert. Vegye figyelembe, hogy a -Class az alapértelmezett paraméter; ezért nem kell explicit módon megadnia.
További információért tekintse meg: WMI-osztály vagy példányadatok beolvasása.
Set objLocator = CreateObject("WbemScripting.SWbemLocator") Set objService = objLocator.ConnectServer(".", "root\cimv2") Set colScheduledJobs = objService.InstancesOf("Win32_ScheduledJob") ' Second example SSet Service = GetObject("WinMgmts:{impersonationLevel=impersonate}!Win32_Service=""ALERTER""")
#default - you don't actually need to use the -Class parameter Get-WMIObject Win32_WmiSetting #but you can if you want to Get-WMIObject -Class Win32_WmiSetting
-
... WMI-lekérdezést hoz létre?
-
A VBScripthez és a WMI-hez készült Scripting API-hoz használja az SWbemServices.ExecQuery metódust.
PowerShell esetén használja a -Query paramétert. A -Filter paraméterrel is szűrhet.
További információ: WMI-lekérdezése.
strComputer = "." Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") Set colScheduledJobs = objWMIService.ExecQuery("Select * from Win32_ScheduledJob") For Each objJob in colScheduledJobs Wscript.Echo "Job ID: " & objJob.JobId & "Command: " & objJob.Command & VBNewLine
Get-WmiObject -query "SELECT * FROM Win32_logicalDisk WHERE DeviceID = 'C:'" #or get-wmiObject -Class Win32_LogicalDisk -Filter "DeviceID = 'C:'"
-
... felsorolni a WMI-objektumok listáját?
-
A VBScripthez és a WMI-hez készült Scripting API-hoz használja a SWbemObjectSet tárolóobjektumot, amely a szkriptben enumerálható gyűjteményként van kezelve. SWbemObjectSet gyűjthető be egy hívással a SWbemServices.InstancesOf vagy a SWbemServices.ExecQueryfüggvényből.
A PowerShell ugyanúgy képes enumerálásokat lekérni és kezelni, mint bármely más objektumot; a WMI-nek nincs különösebben egyedi tulajdonsága.
További információért lásd: Gyűjteményelérése.
For Each Disk In GetObject("winmgmts:").InstancesOf ("CIM_LogicalDevice")
$logicalDevices = Get-WmiObject CIM_LogicalDevice foreach ($device in $logicalDevices) { $device.name } #or, to be more compact Get-WmiObject cim_logicalDevice | ForEach-Object { $_.name }
-
... egy másik WMI-névtér elérése?
-
A VBScript és a WMI-hez készült Scripting API esetében adja meg a névteret a monikerben, vagy máskülönben explicit módon megadhatja a névteret a SwbemLocator.ConnectServerhívásában.
PowerShell esetén használja a -Namespace paramétert. Az alapértelmezett névtér a "root\cimV2"; azonban számos régebbi osztály a "root\default" mappában van tárolva.
Egy adott WMI-osztály helyének megkereséséhez tekintse meg a referenciaoldalt. Másik lehetőségként manuálisan is felfedezhet egy névteret a get-WmiObject használatával.
Set objLocator = CreateObject("WbemScripting.SWbemLocator") Set objService = objLocator.ConnectServer(".", "root\cimv2") ' Second example Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & "." & "\root\cimv2")
Get-WmiObject -list * -Namespace root\default #or, to retrieve all namespaces, Get-WmiObject -Namespace root -Class __Namespace
-
... egy osztály összes gyermekpéldányának lekérése?
-
A WMI-hez és a PowerShellhez közvetlenül használó szkriptelési API-t használó nyelvek esetében a WMI támogatja az alaposztály gyermekosztályainak lekérését. Így a gyermekpéldányok lekéréséhez csak a szülőosztályt kell keresnie. Az alábbi példa CIM_LogicalDiskkeres, amely egy előre telepített WMI-osztály, amely egy Windows-alapú számítógéprendszer logikai lemezeit jelöli. Ezért a szülőosztály keresése a Win32_LogicalDiskpéldányait is visszaadja, amelyet a Windows a merevlemezek leírására használ. További információ: Common Information Model. A WMI az ilyen előre telepített osztályok teljes sémáját biztosítja, amelyek lehetővé teszik a felügyelt objektumok elérését és vezérlését. További információ: Win32 osztályok és WMI osztályok.
For Each Disk In GetObject("winmgmts:").InstancesOf ("CIM_LogicalDisk") WScript.Echo "Instance:", Disk.Name
Get-WmiObject CIM_LogicalDisk | ForEach-Object { "Instance: " + $_.Name }
-
... megtalálni egy WMI-objektumot?
-
A WMI-hez és a PowerShellhez készült Scripting API esetében a WMI a névtér, az osztálynév és a kulcstulajdonságok kombinációját használja egy adott WMI-példány egyedi azonosításához. Ezt együtt WMI-objektum elérési útjaként ismerjük. A VBScript esetében a SWbemObject.Path_ tulajdonság a szkriptelési API által visszaadott adott objektumok elérési útját írja le. A PowerShell esetében minden WMI-objektumnak __PATH tulajdonsága lesz. További információ: WMI-objektum helyének leírása
A névtér és az osztálynév mellett a WMI-objektumok kulcstulajdonságokkal is rendelkeznek, amelyek egyedileg azonosítják ezt a példányt a gép többi példányához képest. A DeviceID tulajdonság például a Win32_LogicalDisk osztály kulcstulajdonsága. További információ: Felügyelt objektumformátum (MOF).
Végül a Relatív elérési út egyszerűen az elérési út rövidített formája, és tartalmazza az osztály nevét és kulcsértékét. Az alábbi példákban az elérési út lehet "\\computerName\root\cimv2:Win32_LogicalDisk.DeviceID="D:"", míg a relatív elérési út ""Win32LogicalDisk.DeviceID="D"".
For Each Disk In GetObject("winmgmts:").InstancesOf ("CIM_LogicalDisk") WScript.Echo "Instance:", Disk.Path_.Relpath 'or to get the path For Each Disk In GetObject("winmgmts:").InstancesOf ("CIM_LogicalDisk") WScript.Echo "Instance:", Disk.Path_
#retrieving the path Get-WmiObject CIM_LogicalDisk | ForEach-Object { "Instance: " + $_.__PATH } #retrieving the relative path Get-WmiObject CIM_LogicalDisk | ForEach-Object { "Instance: " + $_.__RELPATH }
-
... be lehet állítani az információkat a WMI-ben?
-
A VBScripthez és a WMI-hez készült Scripting API-hoz használja a SWbemObject.Put_ metódust.
PowerShell esetén használhatja a Put metódust, vagy Set-WmiInstance.
További információ: Példánytulajdonság módosítása.
wbemCimtypeString = 8 Set objSWbemService = GetObject("Winmgmts:root\default") Set objClass = objSWbemService.Get() objClass.Path_.Class = "NewClass" ' Add a property ' String property objClass.Properties_.add "PropertyName", wbemCimtypeString ' Make the property a key property objClass.Properties_("PropertyName").Qualifiers_.add "key", true ' Write the new class to the root\default namespace in the repository Set objClassPath = objClass.Put_ WScript.Echo objClassPath.Path 'Create an instance of the new class using SWbemObject.SpawnInstance Set objNewInst = GetObject("Winmgmts:root\default:NewClass").Spawninstance_ objNewInst.PropertyName = "My Instance" ' Write the instance into the repository Set objInstancePath = objNewInst.Put_ WScript.Echo objInstancePath.Path
$mySettings = get-WMIObject Win32_WmiSetting $mySettings.LoggingLevel = 1 $mySettings.Put() #or Set-WMIInstance -class Win32_WMISetting -argument @{LoggingLevel=1}
-
... különböző hitelesítő adatokat használ?
-
A VBScripthez és a WMI-hez készült Scripting API-hoz használja a UserName és Password paramétereket az SWbemLocator.ConnectServer metódusban.
PowerShell esetén használja a -Credential paramétert.
Vegye figyelembe, hogy csak másodlagos hitelesítő adatokat használhat távoli rendszeren. További információ: Szkriptelési ügyfelek biztonságossá tétele.
strComputer = "remoteComputerName" strDomain = "DOMAIN" Wscript.StdOut.Write "Please enter your user name:" strUser = Wscript.StdIn.ReadLine Set objPassword = CreateObject("ScriptPW.Password") Wscript.StdOut.Write "Please enter your password:" strPassword = objPassword.GetPassword() Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator") Set objSWbemServices = objSWbemLocator.ConnectServer(strComputer, _ "Root\CIMv2", _ strUser, _ strPassword, _ "MS_409", _ "ntlmdomain:" + strDomain) Set colSwbemObjectSet = objSWbemServices.ExecQuery("Select * From Win32_Process") For Each objProcess in colSWbemObjectSet Wscript.Echo "Process Name: " & objProcess.Name Next
$Computer = "atl-dc-01" Get-WmiObject -Namespace "root\cimv2" -Class Win32_Process -Credential FABRIKAM\administrator ` -ComputerName $Computer
-
... Hogyan lehet egy távoli számítógéphez hozzáférni?
-
A VBScript és a WMI Scripting API esetében explicit módon adja meg a számítógép nevét vagy a monikerben, vagy a SWbemLocator.ConnectServer (,,) hívásakor. További információért lásd: Csatlakozás a távoli WMI-hez VBScript használatával.
PowerShell esetén használja a -ComputerName paramétert. További információkért lásd: Csatlakozás a WMI-hez távolról PowerShell használatával.
Set objLocator = CreateObject("WbemScripting.SWbemLocator") Set objService = objLocator.ConnectServer("myRemoteServerName", "root\cimv2") Set colScheduledJobs = objService.ExecQuery("SELECT * FROM Win32_ScheduledJob") For Each objJob in colScheduledJobs Wscript.Echo "Job ID: " & objJob.JobId & "Command: " & objJob.Command & VBNewLine 'example 2 strComputer = "myRemoteServerName" Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") Set colScheduledJobs = objWMIService.ExecQuery("Select * from Win32_ScheduledJob") For Each objJob in colScheduledJobs Wscript.Echo "Job ID: " & objJob.JobId & "Command: " & objJob.Command & VBNewLine
$Computer = "atl-dc-01" Get-WmiObject -Namespace "root\cimv2" -Class Win32_logicalDisk -ComputerName $Computer
-
... beállítja a hitelesítési és megszemélyesítési szinteket?
-
A VBScript és a WMI-hez készült Scripting API esetében használja a SWbemServices.Security_ tulajdonságot a visszaadott kiszolgálóobjektumon, vagy állítsa be a megfelelő értékeket a monikerben.
PowerShell esetén használja a -Authentication és -Impersonation paramétereket. További információ: Szkriptelési ügyfelek biztonságossá tétele.
További információ: Szkriptelési ügyfelek biztonságossá tétele.
' First example Set Service = GetObject("WinMgmts:{impersonationLevel=impersonate}!Win32_Service=""ALERTER""") ' Second example Set Locator = CreateObject("WbemScripting.SWbemLocator") Set Service = Locator.ConnectServer service.Security_.ImpersonationLevel = wbemImpersonationLevelImpersonate Set objinstance = Service.Get("Win32_Service=""ALERTER""")
$Computer = "atl-dc-01" Get-WmiObject -Namespace "root\cimv2" -Class Win32_Process -Impersonation Impersonate ` -Authentication PacketIntegrity -Credential FABRIKAM\administrator -ComputerName $Computer
-
... hogyan kezeli a WMI hibáit?
-
A WMI-hez készült Scripting API-hoz a szolgáltató megadhat egy SWbemLastError objektumot, amely további információt nyújt egy hibáról.
A VBScriptben a hibakezelés a natív Err objektummal is támogatott. Az SWbemLastErrorobjektumot is elérheti a fent leírtak szerint. További információ: A hibakód lekérése.
A PowerShellhez használhatja a szabványos PowerShell-hibakezelési technikákat. További információ: A PowerShell-hibakezelésének bemutatása.
'using Err On Error Resume Next Set objProcess = GetObject("winmgmts:root\cimv2:Win32_Process.Handle='one'") Wscript.Echo Err.Number 'using SWbemLastError On Error Resume Next Set obj = GetObject("winmgmts:root\cimv2:Win32_Process.Handle='one'") Set LastError = createobject("wbemscripting.swbemlasterror") Wscript.Echo "Operation = " & LastError.operation & VBCRLF & "ParameterInfo = " _ & LastError.ParameterInfo & VBCRLF & "ProviderName = " & LastError.ProviderName