WMI 스크립트 만들기

스크립트를 사용하면 WMI를 통해 제공되는 모든 정보를 보거나 조작할 수 있습니다. 스크립트는 VBScript(Visual Basic Scripting Edition), PowerShell 및 Perl을 포함한, Microsoft ActiveX 스크립트 호스팅을 지원하는 모든 스크립팅 언어로 작성할 수 있습니다. WSH(Windows 스크립트 호스트), Active Server Pages 및 Internet Explorer는 모두 WMI 스크립트를 호스트할 수 있습니다.

참고

현재 WMI에서 지원되는 기본 스크립팅 언어는 PowerShell입니다. 그러나 WMI에는 VBScript 및 WMI용 스크립팅 API에 액세스하는 다른 언어에 대한 강력한 스크립팅 지원 본문도 포함되어 있습니다.

 

WMI 스크립팅 언어

WMI에서 (Windows 스크립트 호스트, 즉 WSH를 통해) 지원하는 두 가지 주요 언어는 PowerShell과 VBScript입니다.

  • PowerShell은 WMI와의 긴밀한 통합을 고려하여 설계되었습니다. 따라서 WMI의 기본 요소 대부분은 Get-WmiObject, Set-WmiInstance, Invoke-WmiMethodRemove-WmiObject 같은 WMI cmdlet에 내장됩니다. 다음 표에서는 WMI 정보에 액세스하는 데 사용하는 일반 프로세스에 대해 설명합니다. 이러한 예제 대부분은 Get-WMIObject를 사용하지만, 대부분의 PowerShell WMI cmdlet에는 -Class-Credentials 같은 동일한 매개 변수가 있습니다. 따라서 이러한 프로세스의 대부분은 다른 개체에서도 작동합니다. PowerShell 및 WMI에 대한 자세한 논의는 Get-WMiObject Cmdlet 사용Windows PowerShell - WMI 연결을 참조하세요.

  • 반면 VBScript는 위에서 설명한 것처럼 WMI용 스크립팅 API를 명시적으로 호출합니다. Perl 같은 다른 언어도 WMI용 스크립팅 API를 사용할 수 있습니다. 그러나 이 문서의 목적상, WMI용 스크립팅 API를 시연하는 대부분의 샘플은 VBScript를 사용합니다. 하지만 VBScript와 관련된 프로그래밍 기법은 호출됩니다.

    VBScript에는 기본적으로 별도의 두 가지 방법으로 WMI에 액세스할 수 있습니다. 첫 번째는 SWbemLocator 개체를 사용하여 WMI에 연결하는 것입니다. 다른 방법은 GetObject와 모니커를 사용하는 것입니다. 모니커는 사용자의 자격 증명, 가장 설정, 연결할 컴퓨터, WMI 네임스페이스(WMI가 개체 그룹을 저장하는 일반 위치) 및 검색할 WMI 개체 등의 다양한 요소를 설명할 수 있는 문자열입니다. 아래 예제에서는 대부분 두 기법을 모두 설명합니다. 자세한 내용은 모니커 문자열 생성WMI 개체의 위치 설명을 참조하세요.

    WMI에 연결하는 데 사용하는 기법에 상관없이, 스크립팅 API에서 하나 이상의 개체를 검색할 수 있습니다. 가장 일반적인 개체는 WMI가 WMI 개체를 설명하는 데 사용하는 SWbemObject입니다. SWbemServices 개체를 사용하여 WMI 서비스 자체를 설명하거나, SWbemObjectPath 개체를 사용하여 WMI 개체의 위치를 설명할 수도 있습니다. 자세한 내용은 SWbemObject를 사용하여 스크립팅도우미 개체 스크립팅을 참조하세요.

WMI 및 스크립팅 언어를 사용하여...

...WMI에 연결하려면 어떻게 해야 합니까?

VBScript 및 WMI용 스크립팅 API의 경우, 모니커와 GetObject 호출을 사용하여 SWbemServices 개체를 검색합니다. 또는 SWbemLocator.ConnectServer를 호출하여 서버에 연결합니다. 이렇게 하면 개체를 사용하여 특정 WMI 네임스페이스 또는 WMI 클래스 인스턴스에 액세스할 수 있습니다.

PowerShell의 경우 WMI에 대한 연결은 일반적으로 cmdlet 호출에서 직접 수행되며, 따라서 추가 단계를 수행하지 않아도 됩니다.

자세한 내용은 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.Get 또는 WbemServices.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는 기본 클래스의 자식 클래스 검색을 지원합니다. 따라서 자식 인스턴스를 검색하려면 부모 클래스만 검색해야 합니다. 다음 예제에서는 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 및 PowerShell용 스크립팅 API의 경우 WMI는 네임스페이스, 클래스 이름 및 키 속성의 조합을 사용하여 지정된 WMI 인스턴스를 고유하게 식별합니다. 이 모든 요소를 WMI 개체 경로라고 합니다. VBScript의 경우 SWbemObject.Path_ 속성은 스크립팅 API에서 반환하는 지정된 개체의 경로를 설명합니다. PowerShell의 경우 모든 WMI 개체에는 __PATH 속성이 있습니다. 자세한 내용은 WMI 개체의 위치 설명을 참조하세요.

네임스페이스 및 클래스 이름 외에, WMI 개체에는 컴퓨터에 있는 다른 인스턴스와 비교하여 해당 인스턴스를 고유하게 식별하는 키 속성도 있습니다. 예를 들어 DeviceID 속성은 Win32_LogicalDisk 클래스의 키 속성입니다. 자세한 내용은 MOF(Managed Object Format)를 참조하세요.

마지막으로, 상대 경로는 경로의 단순한 축약된 형태이며 클래스 이름 및 키 값을 포함합니다. 아래 예제에서는 경로가 "\\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 메서드에서 UserNamePassword 매개 변수를 사용합니다.

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