WMI スクリプトの作成

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

注意

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

 

WMI スクリプト言語

WMI でサポートされる 2 つのメイン言語は、PowerShell と VBScript です (Windows スクリプト ホスト (WSH) を使用します)。

  • PowerShell は、WMI との緊密な統合を念頭に置いて設計されています。 そのため、WMI の基になる要素の多くが WMI コマンドレット (Get-WmiObjectSet-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 用スクリプト API を直接使用する言語と PowerShell の場合、WMI は、基底クラスの子クラスの取得をサポートします。 そのため、子インスタンスを取得するために、検索する必要があるのは親クラスのみです。 次の例では、Windows ベースのコンピューター システム上の論理ディスクを表すプレインストール WMI クラスである CIM_LogicalDisk を検索します。 そのため、この親クラスを検索すると、Windows がハード ドライブを記述するために使用する Win32_LogicalDisk のインスタンスも返されます。 詳細については、「Common Information Model」を参照してください。 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