WMI スクリプトの作成

スクリプトを使用して、WMI を使用して使用可能になった情報を表示または操作できます。 スクリプトは、Visual Basic Scripting Edition (VBScript)、PowerShell、Perl など、Microsoft ActiveX スクリプト ホスティングをサポートする任意のスクリプト言語で記述できます。 Windows スクリプト ホスト (WSH)、Active Server Pages、Internet Explorer では、すべての WMI スクリプトをホストできます。

注意

WMI で現在サポートされている主要なスクリプト言語は PowerShell です。 ただし、WMI には、VBScript および WMI 用スクリプト API にアクセスする他の言語に対する堅牢なスクリプトのサポート本文も含まれています。

 

WMI スクリプト言語

WMI でサポートされる 2 つの主要な言語は、PowerShell と VBScript (Windows スクリプト ホストまたは WSH 経由) です。

  • PowerShell は、WMI との緊密な統合を念頭に置いて設計されています。 そのため、WMI の基になる要素の多くは、WMI コマンドレット (Get-WmiObject、Set-WmiInstanceInvoke-WmiMethodRemove-WmiObject) に組み込まれています。 次の表では、WMI 情報へのアクセスに使用される一般的なプロセスについて説明します。 これらの例のほとんどは Get-WMIObject を使用していますが、PowerShell WMI コマンドレットの多くは、 -Class-Credentials などの同じパラメーターを持つことに注意してください。 そのため、これらのプロセスの多くは他のオブジェクトでも機能します。 PowerShell と WMI の詳細については、「Get-WMiObject コマンドレットWindows PowerShellの使用 - WMI 接続」を参照してください。

  • これに対し、VBScript では、前述のように、WMI 用スクリプト API を明示的に呼び出します。 Perl などの他の言語でも、WMI 用のスクリプト API を使用できます。 ただし、このドキュメントでは、WMI のスクリプト API を示すほとんどのサンプルで VBScript を使用します。 ただし、プログラミング手法が VBScript に固有の場合は、呼び出されます。

    VBScript には、基本的に WMI にアクセスするための 2 つの異なる方法があります。 1 つ目は、 SWbemLocator オブジェクトを使用して WMI に接続することです。 または、 GetObject とモニカーを使用することもできます。 モニカーは、資格情報、偽装設定、接続先のコンピューター、WMI 名前空間 (つまり、WMI がオブジェクトのグループを格納する一般的な場所)、取得する WMI オブジェクトなど、さまざまな要素を記述できる文字列です。 以下の例の多くは、両方の手法について説明しています。 詳細については、「 モニカー文字列の構築WMI オブジェクトの場所の記述」を参照してください。

    WMI への接続に使用する手法に関係なく、スクリプト API から 1 つ以上のオブジェクトを取得する可能性があります。 最も一般的なのは、WMI が WMI オブジェクトを記述するために使用する SWbemObject です。 または、 SWbemServices オブジェクトを使用して WMI サービス自体を記述するか、 SWbemObjectPath オブジェクトを使用して WMI オブジェクトの場所を記述することもできます。 詳細については、「 SWbemObject を使用したスクリプト作成 」および「 ヘルパー オブジェクトのスクリプト作成」を参照してください

WMI とスクリプト言語を使用する方法

...WMI に接続しますか?

VBScript と WMI 用スクリプト API の場合は、モニカーと GetObject の呼び出しを使用して SWbemServices オブジェクトを取得します。 または、 SWbemLocator.ConnectServer を呼び出してサーバーに接続することもできます。 その後、オブジェクトを使用して、特定の WMI 名前空間または WMI クラス インスタンスにアクセスできます。

PowerShell の場合、WMI への接続は通常、コマンドレット呼び出しで直接行われます。そのため、追加の手順は必要ありません。

詳細については、「 WMI オブジェクトの場所の説明モニカー文字列の構築および VBScript を使用した WMI への接続」を参照してください。

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

...WMI から情報を取得しますか?

VBScript と WMI 用のスクリプト API の場合は、 WbemServices.GetWbemServices.InstancesOf などの取得関数を使用します。 取得するオブジェクトのクラス名をモニカーに配置することもできます。これは、より効率的な場合があります。

PowerShell の場合は、 -Class パラメーターを使用します。 Class が既定のパラメーターであることに注意してください。そのため、明示的に指定する必要はありません。

詳細については、「 WMI クラスまたはインスタンス データの取得」を参照してください。

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 クエリを作成しますか?

VBScript と WMI 用スクリプト API の場合は、 SWbemServices.ExecQuery メソッドを使用します。

PowerShell の場合は、 -Query パラメーターを使用します。 -Filter パラメーターを使用して フィルター処理 することもできます。

詳細については、「 WMI のクエリ」を参照してください。

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:'"

...WMI オブジェクトの一覧を列挙しますか?

VBScript と WMI 用スクリプト API の場合は、 SWbemObjectSet コンテナー オブジェクトを使用します。このコンテナー オブジェクトは、列挙可能なコレクションとしてスクリプトで扱われます。 SWbemServices.InstancesOf または SWbemServices.ExecQuery からの呼び出しから SWbemObjectSet を取得できます。

PowerShell は、他のオブジェクトと同様に、列挙型を取得して処理できます。WMI に特に固有の情報はありません。

詳細については、「 コレクションへのアクセス」を参照してください。

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 }

...別の WMI 名前空間にアクセスしますか?

VBScript と WMI 用スクリプト API の場合は、モニカーで名前空間を指定するか、 SwbemLocator.ConnectServer の呼び出しで名前空間を明示的に指定できます。

PowerShell の場合は、 -Namespace パラメーターを使用します。 既定の名前空間は "root\cimV2" です。ただし、多くの古いクラスは "root\default" に格納されています。

特定の WMI クラスの場所を見つけるには、参照ページを参照してください。 または、get-WmiObject を使用して名前空間を手動で探索することもできます。

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

...クラスのすべての子インスタンスを取得しますか?

WMI および PowerShell 用のスクリプト API を直接使用する言語の場合、WMI では基底クラスの子クラスの取得がサポートされます。 そのため、子インスタンスを取得するには、親クラスのみを検索する必要があります。 次の例では、CIM_LogicalDiskを検索します。これは、Windows ベースのコンピューター システム上の論理ディスクを表す、プレインストールされた WMI クラスです。 そのため、この親クラスを検索すると、Win32_LogicalDiskのインスタンスも返されます。これは、ハード ドライブを記述するために使用Windowsです。 詳細については、「 共通情報モデル」を参照してください。 WMI には、マネージド オブジェクトにアクセスして制御できる、このようなプレインストールされたクラスのスキーマ全体が用意されています。 詳細については、「 Win32 クラスWMI クラス」を参照してください。

For Each Disk In GetObject("winmgmts:").InstancesOf ("CIM_LogicalDisk")
  WScript.Echo "Instance:", Disk.Name
Get-WmiObject CIM_LogicalDisk | ForEach-Object { "Instance: " + $_.Name  }

...WMI オブジェクトを見つけますか?

WMI 用スクリプト API と PowerShell の両方で、WMI は名前空間、クラス名、およびキー プロパティの組み合わせを使用して、特定の WMI インスタンスを一意に識別します。 これらを組み合わせると、WMI オブジェクト パスと呼ばれます。 VBScript の場合、 SWbemObject.Path_ プロパティは、スクリプト API によって返される特定のオブジェクトのパスを記述します。 PowerShell の場合、すべての WMI オブジェクトには__PATHプロパティがあります。 詳細については、「WMI オブジェクトの場所の説明」を参照してください。

WMI オブジェクトには、名前空間とクラス名に加えて、マシン上の他のインスタンスと比較してそのインスタンスを一意に識別するキー プロパティもあります。 たとえば、 DeviceID プロパティは 、Win32_LogicalDisk クラスのキー プロパティです。 詳細については、「 マネージド オブジェクト形式 (MOF)」を参照してください。

最後に、相対パスはパスの短縮形であり、クラス名とキー値が含まれます。 次の例では、パスは "\\computerName\root\cimv2:Win32_LogicalDisk.DeviceID="D:""、相対パスは "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  }

...WMI で情報を設定しますか?

VBScript と WMI 用スクリプト API の場合は、 SWbemObject.Put_ メソッドを使用します。

PowerShell の場合は、Put メソッドを使用するか、 Set-WmiInstance を使用できます。

詳細については、「 インスタンス プロパティの変更」を参照してください。

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}

...別の資格情報を使用しますか?

VBScript と WMI 用スクリプト API の場合は、SWbemLocator.ConnectServer メソッドで UserName パラメーターと Password パラメーターを使用します。

PowerShell の場合は、 -Credential パラメーターを使用します。

リモート システムでのみ代替資格情報を使用できることに注意してください。 詳細については、「 スクリプト クライアントのセキュリティ保護」を参照してください。

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

...リモート コンピューターにアクセスしますか?

VBScript と WMI 用スクリプト API の場合は、モニカーまたは SWbemLocator.ConnectServer の呼び出しでコンピューターの名前を明示的に指定します。 詳細については、「 VBScript を使用して WMI にリモートで接続する」を参照してください。

PowerShell の場合は、 -ComputerName パラメーターを使用します。 詳細については、「 PowerShell を使用して WMI にリモートで接続する」を参照してください。

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

...認証レベルと偽装レベルを設定しますか?

VBScript と WMI 用スクリプト API の場合は、返されたサーバー オブジェクトで SWbemServices.Security_ プロパティを使用するか、モニカーに関連する値を設定します。

PowerShell の場合は、 それぞれ -Authentication パラメーターと -Impersonation パラメーターを 使用します。 詳細については、「 スクリプト クライアントのセキュリティ保護」を参照してください。

詳細については、「 スクリプト クライアントのセキュリティ保護」を参照してください。

' 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

...WMI でエラーを処理しますか?

WMI 用スクリプト API の場合、プロバイダーは SWbemLastError オブジェクトを指定して、エラーに関する詳細情報を提供できます。

特に VBScript では、ネイティブ の Err オブジェクトを使用したエラー処理もサポートされています。 前述のように 、SWbemLastErrorオブジェクトにアクセスすることもできます。 詳細については、「 エラー コードの取得」を参照してください。

PowerShell の場合は、標準の PowerShell エラー処理手法を使用できます。 詳細については、「 PowerShell でのエラー処理の概要」を参照してください。

'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