Get-WmiObject: 컴퓨터 정보를 위한 WMI 쿼리

Windows 컴퓨터 및 해당 구성 요소에 대한 정보를 얻을 때, Get-WmiObject를 사용할 수 있습니다.

WMI 메서드를 활용하여, Get-WmiObject는 로컬 또는 원격 시스템에서도 작업을 실행할 수 있습니다. 이 cmdlet은 PowerShell에서 WMI 저장소와 함께 작업하여 여러 시스템을 관리하는 것을 훨씬 쉽게 만들어주는 몇 가지 중 하나입니다.

Get-WmiObject를 사용하여 클래스 검색

이 cmdlet은 기본적으로 로컬 컴퓨터에서 정보를 쿼리할 수 있습니다. 알아야 할 것은 네임스페이스(기본값으로는 root\cimv2)와 원하는 정보가 있는 WMI 클래스입니다.

수천 개의 클래스가 있으며, 아직 사용할 클래스를 모를 수도 있습니다. Get-WmiObject를 사용하여 네임스페이스의 모든 사용 가능한 클래스를 쿼리할 수 있습니다. Get-WmiObject -List를 사용하면 root\cimv2 네임스페이스의 모든 클래스를 볼 수 있습니다. 다른 네임스페이스의 클래스를 확인해야 하는 경우, Namespace 매개변수를 사용할 수도 있습니다.

PS> Get-WmiObject -List

NameSpace: ROOT\cimv2

Name				Methods	Properties
CIM_Indication		{}		{CorrelatedIndications, IndicationFilterName, IndicationIde...
CIM_ClassIndication	{}    	{ClassDefinition, CorrelatedIndications, IndicationFilterNa........

WMI 속성 가져오기

클래스를 가져왔으면, 이제 해당 클래스에 어떤 속성이 있는지 조사해야 합니다. 예를 들어, 컴퓨터의 운영 체제를 확인하고 싶을 수 있습니다. 보고서를 작성하고 원격 컴퓨터에서 어떤 운영 체제가 실행되는지 확인하고 싶을 수도 있습니다. Get-WmiObject에는 ComputerName 매개변수가 있어 로컬이 아닌 하나 이상의 원격 컴퓨터를 지정할 수 있습니다.

제 원격 컴퓨터는 DC라는 도메인 컨트롤러입니다. Win32_OperatingSystem 클래스를 살펴보겠습니다.

PS> Get-WmiObject -ComputerName DC -Class Win32_OperatingSystem

SystemDirectory : C:\Windows\system32
Organization    :
BuildNumber     : 9600
RegisteredUser  : Windows User
SerialNumber    : 00252-00108-14656-AA864
Version         : 6.3.9600

유용한 정보이지만 운영 체제 이름을 볼 수는 없습니다. 다른 PowerShell 출력과 마찬가지로 모든 속성을 볼 수는 없습니다. 이를 위해 Select-Object를 사용하여 모든 속성을 반환해야합니다.

Get-WmiObject -ComputerName DC -Class Win32_OperatingSystem | Select-Object -Property *

I can now see a property called Caption that lets me know the version of Windows.

PS> (Get-WmiObject -ComputerName DC -Class Win32_OperatingSystem | Select-Object -Property *).Caption Microsoft Windows Server 2012 R2 Standard

WMI 속성 찾기

특정 속성이 아닌 특정 값과 일치하는 속성을 찾으려는 경우는 어떻게 할까요? 예를 들어 CIM_DataFile 클래스의 모든 인스턴스를 쿼리 할 수 있지만, 이는 시스템의 모든 파일을 반환합니다! 대신에, Filter 또는 Query 매개 변수를 사용하여 값에 따라 인스턴스를 필터링할 수 있습니다. 둘 다 알아보겠습니다.

예를 들어 CIM_DataFile을 사용하여 압축된 파일을 나타내는 인스턴스만 찾고 싶다고 가정해보겠습니다. Compressed 속성은 각 인스턴스의 속성이며 부울 값입니다. 따라서 Filter 매개 변수를 사용하여 WMI 제공자로 직접 필터를 보내어 Compressed 속성이 True인 인스턴스만 반환할 수 있습니다.

Get-WmiObject -Class CIM_DataFile -Filter "Compressed = 'True'"

WQL을 알고 있다면, 직접 클래스를 선택하고 “필터”를 지정하여 직접 WQL 쿼리를 작성할 수도 있습니다.

Get-WmiObject -Query "SELECT * FROM CIM_DataFile WHERE Compressed = 'True'"

WMI 메서드 호출

Get-WmiObject은 WMI에서 정보를 읽을 뿐만 아니라 WMI 메서드를 호출하는 데에도 사용될 수 있습니다. 호출되는 일반적인 WMI 메서드는 Win32_Process 클래스의 Create 메서드입니다. Invoke-WmiMethod을 사용하여 WMI 메서드를 호출하는 몇 가지 다른 방법이 있지만, Get-WmiObject로도 가능합니다. WMI 인스턴스를 캡처한 후 해당 개체에서 메서드를 호출하기만 하면 됩니다.

다음은 원격 컴퓨터에서 메모장(notepad.exe)을 시작하는 예입니다. 보너스로, 대체 자격 증명을 사용하여 이 작업을 수행합니다!

$cred = get-credential
$process = Get-WmiObject -Query "SELECT * FROM Meta_Class WHERE __Class = 'Win32_Process'" -namespace "root\cimv2" -computername 'FOO' -credential $cred $process.Create( "notepad.exe" )

WMI, DCOM 및 PowerShell Remoting

마지막으로 언급할 사항은 이 cmdlet의 후속 제품인 Get-CimInstance입니다. Get-CimInstance는 기본 원격 연결 프로토콜로 PowerShell Remoting을 사용하기 때문에 일부 이점을 제공하지만, Get-WmiObject를 사용하는 것이 때로는 더 간편합니다.

Get-WmiObject는 원격 컴퓨터와 통신하기 위해 DCOM을 사용하며, 일반적으로 사용 가능합니다. 그렇지 않은 경우에는 Get-CimInstance을 사용하려면 원격 엔드포인트에서 PowerShell Remoting을 활성화해야 합니다.

자세한 내용은 Microsoft 문서를 참조하세요.

Source:
https://adamtheautomator.com/get-wmiobject/