Megosztás a következőn keresztül:


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