다음을 통해 공유


WMI 스크립트 만들기

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

메모

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

 

WMI 스크립팅 언어

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

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

  • 반면 VBScript위에서 설명한 대로 WMI 대한Scripting 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용 Scripting 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용 Scripting 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용 Scripting API를 직접 사용하는 언어의 경우 WMI는 기본 클래스의 자식 클래스 검색을 지원합니다. 따라서 자식 인스턴스를 검색하려면 부모 클래스만 검색해야 합니다. 다음 예제에서는 windows 기반 컴퓨터 시스템의 논리 디스크를 나타내는 미리 설치된 WMI 클래스인 CIM_LogicalDisk검색합니다. 따라서 이 부모 클래스를 검색하면 windows에서 하드 드라이브를 설명하는 데 사용하는 Win32_LogicalDisk인스턴스도 반환됩니다. 자세한 내용은 일반 정보 모델참조하세요. 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(관리 개체 형식) 참조하세요.

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

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용 Scripting 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용 Scripting 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