WMI 메서드 호출
WMI는 COM API 및 스크립팅 API 의 메서드를 제공하여 정보를 가져오거나 엔터프라이즈 시스템에서 개체를 조작합니다. 예를 들어 WMI 스크립팅 메서드 SWbemServices.ExecQuery는 데이터를 쿼리합니다. 공급자는 자신이 등록하는 클래스에 정의된 메서드도 포함합니다. 대표적인 예는 Win32 공급자에서 제공하는 Win32_LogicalDisk 메서드인 Chkdsk와 ScheduleAutoChk입니다.
이 항목에서 다루는 섹션은 다음과 같습니다.
WMI 메서드와 공급자 메서드 비교
WMI 메서드 호출을 공급자 메서드 호출과 함께 사용하면, 호출을 사용하여 엔터프라이즈 관련 정보를 검색하고 조작할 수 있습니다. 자세한 내용은 WMI 메서드 호출 및 공급자 메서드 호출을 참조하세요.
WMI 스크립팅 개체 SWbemObject 의 메서드는 특별한 상태가 적용됩니다. 모든 WMI 데이터 클래스에 적용할 수 있기 때문입니다. 자세한 내용은 SWbemObject를 사용한 스크립팅을 참조하세요.
다음 코드 예제에서는 WMI와 공급자 메서드를 모두 호출합니다.
다음 WMI와 공급자 메서드는 WMI용 스크립팅 API에 있습니다.
- objWMIService.ExecQuery는 WMI 스크립팅 메서드 SWbemServices.ExecQuery를 호출합니다.
- objService.StopService()는 공급자 메서드 Win32_Service.StopService를 호출합니다.
Win32_Service에 대한 반환 코드 섹션의 "반환"에 표시할 수 있는 코드를 조회할 수 있습니다.
strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colServices = objWMIService.ExecQuery ("Select * from Win32_Service where Name='Alerter'")
For Each objService in colServices
Return = objService.StopService()
If Return <> 0 Then
Wscript.Echo "Failed " &VBNewLine & "Error code = " & Return
Else
WScript.Echo "Succeeded"
End If
Next
$colServices= Get-WmiObject -Class Win32_Service -Filter 'Name = "Alerter"'
foreach ($objService in $colServices)
{
$objService.StopService()
}
WMI에서의 메서드 호출 모드
반동기 호출 모드는 대부분의 경우 보안과 성능 간의 가장 적절한 균형을 제공합니다.
사용 가능한 각 모드에 대한 자세한 내용은 다음을 참조하세요.
동기 모드
동기 모드는 메서드 호출이 SWbemObjectSet 컬렉션 개체를 반환하기 전까지 프로그램 또는 스크립트가 일시 중지될 때 발생합니다. WMI는 호출 프로그램 또는 스크립트에 컬렉션 개체를 반환하기 전에 메모리에서 이 컬렉션을 빌드합니다.
동기 모드는 프로그램 또는 스크립트를 실행하는 컴퓨터의 프로그램 또는 스크립트 성능에 부정적인 영향을 미칠 수 있습니다. 예를 들어 이벤트 로그에서 수천 가지 이벤트를 동기적으로 검색하느라 시간이 오래 걸리고 많은 메모리를 사용할 수 있습니다. WMI는 각 이벤트에서 개체를 생성한 다음, 컬렉션을 메서드에 전달하기 전에 이러한 개체를 컬렉션에 배치하기 때문입니다.
큰 데이터 집합을 동기 모드로 반환하지 않는 메서드만 호출해야 합니다. 다음 SWbemServices 메서드는 동기 모드에서 안전하게 호출할 수 있습니다.
이름에 "Async"라는 단어가 없는 모든 SWbemServices 메서드는 iFlags 매개 변수에서 wbemFlagReturnWhenComplete 값을 설정하면 동기 모드로 호출할 수 있습니다.
비동기 모드
비동기 모드는 메서드를 호출한 후 프로그램 또는 스크립트가 계속 실행될 때 발생합니다. WMI는 각 개체를 만들 때 메서드의 모든 개체를 SWbemSink 개체로 반환합니다. 호출하는 프로그램 또는 스크립트에는 SWbemSink 개체와 SWbemSink.OnObjectReady 이벤트 처리기가 있어야 반환된 개체를 처리할 수 있습니다. 비동기 모드를 위한 이벤트 처리기를 만드는 자세한 방법은 WMI 이벤트 수신을 참조하세요.
이 모드에는 동기 모드의 성능 및 리소스 페널티가 적용되지 않지만, 비동기 모드는 SWbemSink 개체에 저장된 결과가 호출 프로그램 또는 스크립트에서 제공되지 않을 수 있어 심각한 보안 위험을 초래할 수 있습니다. WMI는 메서드가 성공할 때까지 SWbemSink 개체에서의 인증 수준을 낮춥니다. 이러한 보안 위험을 완화하는 자세한 방법은 비동기 호출에서 보안 설정을 참조하세요.
Async라는 단어가 추가된 메서드는 비동기 모드용 메서드입니다. 다음 메서드는 비동기 호출입니다.
- SWbemServices.AssociatorsOfAsync
- SWbemServices.DeleteAsync
- SWbemServices.ExecMethodAsync
- SWbemServices.ExecNotificationQueryAsync
- SWbemServices.ExecQueryAsync
- SWbemServices.InstancesOfAsync
- SWbemServices.ReferencesToAsync
- SWbemServices.SubclassesOfAsync
비동기 모드에 대한 자세한 내용은 다음을 참조하세요.
반동기 모드
반동기 모드는 메서드를 호출한 후에도 프로그램 또는 스크립트가 계속 실행된다는 점에서 비동기 모드와 유사합니다. 반동기 모드에서 WMI는 스크립트 또는 프로그램이 계속 실행될 때 백그라운드에서 개체를 검색합니다. WMI는 호출 메서드로 반환된 각 개체를 개체 생성이 끝나는 즉시 반환합니다.
WMI가 개체를 관리하므로 비동기 모드보다 반동기 모드가 더 안전합니다. 그러나 인스턴스가 1,000개 이상인 반동기 모드를 사용하는 경우, 인스턴스 검색이 가용 리소스를 독점하여 프로그램 또는 스크립트와 프로그램 또는 스크립트를 사용하는 컴퓨터의 성능이 저하될 수 있습니다. 각 개체는 메모리가 해제될 때까지 필요한 리소스를 차지합니다.
이 조건을 해결하려면 wbemFlagForwardOnly 및 wbemFlagReturnImmediately 플래그로 설정된 iFlags 매개 변수로 메서드를 호출하여 WMI에 정방향 전용 SWbemObjectSet를 반환하도록 지시합니다. 정방향 전용 SWbemObjectSet는 개체가 열거된 후 메모리를 해제하기 때문에 큰 데이터 집합으로 인한 성능 문제가 발생하지 않습니다.
동기 또는 비동기 모드에서 호출할 수 없는 모든 SWbemServices 메서드는 반동기 모드에서 호출됩니다.
다음 메서드는 반동기 모드에서 호출됩니다.
- SWbemServices.AssociatorsOf
- SWbemServices.Delete
- SWbemServices.ExecMethod
- SWbemServices.ExecNotificationQuery
- SWbemServices.ExecQuery
- SWbemServices.Get
- SWbemServices.InstancesOf
- SWbemServices.ReferencesTo
- SWbemServices.SubclassesOf
- SWbemServices.Put
반동기 모드에 대한 자세한 내용은 C++를 사용하여 반동기 호출 만들기 및 VBScript를 사용하여 반동기 호출 만들기를 참조하세요.
관련 항목