WMI 스크립트 만들기

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

참고

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

WMI 스크립팅 언어

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

  • PowerShell 은 WMI와 긴밀 하 게 통합 되어 설계 되었습니다. 따라서 WMI의 기본 요소 대부분은 WMI cmdlet ( get-wmiobject, set-wmiinstance, invoke-wmimethodget-wmiobject)에 기본 제공 됩니다. 다음 표에서는 WMI 정보에 액세스 하는 데 사용 되는 일반적인 프로세스에 대해 설명 합니다. 이러한 예제의 대부분은 Get-wmiobject를 사용 하지만 대부분의 PowerShell WMI cmdlet에는 동일한 매개 변수 (예: 클래스 또는 -자격 증명)가 있습니다. 따라서 이러한 프로세스는 대부분 다른 개체 에서도 작동 합니다. PowerShell 및 WMI에 대 한 자세한 내용은 Get-WMiObject CmdletWindows POWERSHELL 사용-WMI 연결을 참조 하세요.

  • 이와 대조적으로 VBScript 는 위에서 설명한 대로 WMI 용 Scripting API를 명시적으로 호출 합니다. Perl과 같은 다른 언어 에서도 WMI 용 scripting API를 사용할 수 있습니다. 그러나이 설명서의 목적상 WMI 용 스크립팅 API를 보여 주는 대부분의 샘플은 VBScript를 사용 합니다. 그러나 프로그래밍 기술은 VBScript와 관련 된 경우 호출 됩니다.

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

    WMI에 연결 하는 데 사용 하는 방법에 관계 없이 스크립팅 API에서 하나 이상의 개체를 검색할 가능성이 높습니다. 가장 일반적인 것은 WMI에서 WMI 개체를 설명 하는 데 사용 하는 SWbemObject입니다. 또는 SWbemServices 개체를 사용 하 여 wmi 서비스 자체를 설명 하거나 SWbemObjectPath 개체를 사용 하 여 wmi 개체의 위치를 설명할 수 있습니다. 자세한 내용은 SWbemObject 및 Scripting Helper 개체사용 하 여 스크립팅 을 참조 하세요.

WMI 및 스크립트 언어를 사용 하 여 어떻게 할까요?

... WMI에 연결 할까요?

VBScript 및 WMI 용 스크립팅 API의 경우 모니커와 GetObject를 호출 하 여 SWbemServices 개체를 검색 합니다. 또는 SWbemLocator 서버에 대 한 호출을 사용 하 여 서버에 연결할 수 있습니다. 그런 다음 개체를 사용 하 여 특정 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 또는 WbemServices와 같은 검색 함수를 사용 합니다. 모니커에서 검색할 개체의 클래스 이름을 지정할 수도 있습니다 .이는 더 효율적일 수 있습니다.

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 container 개체를 사용 합니다. 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 서버호출에서 네임 스페이스의 상태를 명시적으로 지정할 수 있습니다.

PowerShell의 경우 -Namespace 매개 변수를 사용 합니다. 기본 네임 스페이스는 "root \ cimV2" 이지만 대부분의 이전 클래스는 "루트 기본값"에 저장 됩니다 \ .

지정 된 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 _ 논리 디스크을 검색 합니다. 따라서이 부모 클래스를 검색 하면 Windows에서 하드 드라이브를 설명 하는 데 사용 하는 Win32 _ 논리 디스크의 인스턴스도 반환 됩니다. 자세한 내용은 CIM(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 _ 속성은 스크립팅 API에서 반환 하는 지정 된 개체의 경로를 설명 합니다. PowerShell의 경우 모든 WMI 개체에는 _ _ PATH 속성이 있습니다. 자세한 내용은 WMI 개체의 위치 설명 을 참조 하세요.

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

마지막으로 상대 경로는 단순히 경로의 축약 된 형식이 며 클래스 이름 및 키 값을 포함 합니다. 아래 예제에서 경로는 " \ \ computerName \ Root \ cimv2: Win32 _ 논리 디스크 =" d: "" 일 수 있지만 상대 경로는 "" Win32LogicalDisk = "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 용 Scripting API의 경우에는 SWbemObject _ 메서드를 사용 합니다.

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 서버 메서드에서 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 서버호출에서 컴퓨터 이름을 명시적으로 명시 합니다. 자세한 내용은 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 _ 속성을 사용 하거나 모니커에 관련 값을 설정 합니다.

PowerShell의 경우 각각 -Authentication-가장 매개 변수를 사용 합니다. 자세한 내용은 스크립팅 클라이언트 보안설정을 참조 하세요.

자세한 내용은 스크립팅 클라이언트 보안설정을 참조 하세요.

' 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