간단한 설명
PowerShell에서 WMI 개체를 가져오는 데 사용할 수 있는 WQL(WMI 쿼리 언어)에 대해 설명합니다.
긴 설명
WQL은 WMI(Windows Management Instrumentation) 쿼리 언어로, WMI에서 정보를 가져오는 데 사용되는 언어입니다.
PowerShell에서 WQL을 사용하여 WMI 쿼리를 수행할 필요는 없습니다. 대신 CIM cmdlet의 매개 변수를 사용할 수 있습니다. WQL 쿼리는 표준 CIM 명령보다 다소 빠르며 명령이 수백 개의 시스템에서 실행될 때 향상된 성능이 분명합니다. 그러나 성공적인 WQL 쿼리를 작성하는 데 소요되는 시간이 성능 향상보다 크지 않은지 확인합니다.
WQL을 사용해야 하는 기본 WQL 문은 SELECT, WHERE및 FROM.
WQL을 사용하는 경우
WMI, 특히 WQL로 작업할 때 PowerShell을 사용한다는 사실을 잊지 마세요. WQL 쿼리가 예상대로 작동하지 않는 경우 WQL 쿼리를 디버그하는 것보다 표준 PowerShell 명령을 사용하는 것이 더 쉽습니다.
쿼리가 대량의 데이터를 반환하지 않는 한, 동일한 작업을 수행하는 허용되는 PowerShell cmdlet이 있을 때 복잡한 WQL 쿼리를 완벽하게 만드는 데 몇 시간을 할애하는 것은 거의 생산적이지 않습니다.
SELECT 문 사용
일반적인 WMI 쿼리는 SELECT WMI 클래스의 모든 속성 또는 특정 속성을 가져오는 문으로 시작합니다. WMI 클래스의 모든 속성을 선택하려면 별표(*)를 사용합니다. 키워드는 FROM WMI 클래스를 지정합니다.
SELECT 문 형식은 다음과 같습니다.
SELECT <property> FROM <WMI-class>
예를 들어 다음 SELECT 문은 * WMI 클래스의 인스턴스에서 모든 속성()을 선택합니다.
SELECT * FROM Win32_BIOS
비고
PowerShell은 기본 개체 속성만 표시합니다. 이러한 속성은 파일에 정의 Types.ps1xml 됩니다.
Select-Object cmdlet 또는 cmdlet을 Format-* 사용하여 추가 속성을 표시합니다.
WMI 클래스의 특정 속성을 선택하려면 속성 이름을 키워드와 SELECT 키워드 사이에 FROM 배치합니다.
다음 쿼리는 Win32_BIOS WMI 클래스에서 BIOS의 이름만 선택합니다. 이 명령은 변수에 쿼리를 $queryName 저장합니다.
SELECT Name FROM Win32_BIOS
둘 이상의 속성을 선택하려면 쉼표로 속성 이름을 구분합니다.
다음 WMI 쿼리는 Win32_BIOS WMI 클래스의 이름과 버전을 선택합니다. 이 명령은 변수에 쿼리를 $queryNameVersion 저장합니다.
SELECT name, version FROM Win32_BIOS
WQL 쿼리 사용
PowerShell 명령에서 WQL 쿼리를 사용하는 방법에는 두 가지가 있습니다.
- CIM cmdlet 사용
- 형식 가속기
[wmisearcher]사용
Get-CimInstance cmdlet 사용
Get-CimInstance 는 WMI 클래스를 포함하여 CIM 규격 클래스의 인스턴스를 가져옵니다. PowerShell 3.0을 도입한 CIM cmdlet은 WMI cmdlet과 동일한 작업을 수행합니다. CIM cmdlet은 WSMan(WS-Management) 표준 및 CIM(공용 정보 모델) 표준을 준수하므로 cmdlet은 동일한 기술을 사용하여 다른 운영 체제를 실행하는 Windows 컴퓨터 및 컴퓨터를 관리할 수 있습니다.
다음 명령은 cmdlet을 Get-CimInstance 사용하여 WQL 쿼리를 실행합니다.
함께 Get-WmiObject 사용할 수 있는 모든 WQL 쿼리를 함께 사용할 Get-CimInstance수도 있습니다.
Get-CimInstance -Query "SELECT * FROM Win32_BIOS"
SMBIOSBIOSVersion : S03KT39A
Manufacturer : LENOVO
Name : S03KT39A
SerialNumber : MJ0AETTX
Version : LENOVO - 1270
Get-CimInstance는 반환하는 ManagementObject 대신 CimInstance 개체를 Get-WmiObject 반환하지만 개체는 매우 유사합니다.
PS> (Get-CimInstance -Query "SELECT * FROM Win32_BIOS").GetType().FullName
Microsoft.Management.Infrastructure.CimInstance
PS> (Get-WmiObject -Query "SELECT * FROM Win32_BIOS").GetType().FullName
System.Management.ManagementObject
[wmisearcher] 형식 가속기 사용
[wmisearcher] 형식 가속기는 WQL 문 문자열에서 ManagementObjectSearcher 개체를 만듭니다.
ManagementObjectSearcher 개체에는 많은 속성과 메서드가 있지만 가장 기본적인 방법은 지정된 WMI 쿼리를 호출하고 결과 개체를 반환하는 Get 메서드입니다.
사용하면 [wmisearcher]ManagementObjectSearcher .NET 클래스에 쉽게 액세스할 수 있습니다. 이렇게 하면 WMI를 쿼리하고 쿼리가 수행되는 방식을 구성할 수 있습니다.
형식 가속기를 사용하려면 다음을 [wmisearcher] 수행합니다.
- WQL 문자열을 ManagementObjectSearcher 개체로 캐스팅합니다.
- ManagementObjectSearcher 개체의 Get 메서드를 호출합니다.
예를 들어 다음 명령은 "모두 선택" 쿼리를 캐스팅하고 결과를 변수에 $bios 저장한 다음 변수에서 ManagementObjectSearcherGet()메서드를 호출 $bios 합니다.
$bios = [wmisearcher]"SELECT * FROM Win32_BIOS"
$bios.Get()
SMBIOSBIOSVersion : 8BET56WW (1.36 )
Manufacturer : LENOVO
Name : Default System BIOS
SerialNumber : R9FPY3P
Version : LENOVO - 1360
형식 가속기를 [wmisearcher] 사용하여 쿼리 또는 변수를 캐스팅할 수 있습니다. 다음 예제 [wmisearcher] 에서는 형식 가속기를 사용하여 변수를 캐스팅합니다. 결과는 동일합니다.
[wmisearcher]$bios = "SELECT * FROM Win32_BIOS"
$bios.Get()
SMBIOSBIOSVersion : S03KT39A
Manufacturer : LENOVO
Name : S03KT39A
SerialNumber : MJ0AETTX
Version : LENOVO - 1270
형식 가속기를 [wmisearcher] 사용하면 다음 명령과 같이 쿼리 문자열 을 ManagementObjectSearcher 개체로 변경합니다.
$a = "SELECT * FROM Win32_BIOS"
$a.GetType().FullName
System.String
$a = [wmisearcher]"SELECT * FROM Win32_BIOS"
$a.GetType().FullName
System.Management.ManagementObjectSearcher
이 명령 형식은 모든 쿼리에서 작동합니다. 다음 명령은 Win32_BIOS WMI 클래스의 Name 속성 값을 가져옵니다.
$biosName = [wmisearcher]"Select Name from Win32_BIOS"
$biosName.Get()
__GENUS : 2
__CLASS : Win32_BIOS
__SUPERCLASS :
__DYNASTY :
__RELPATH :
__PROPERTY_COUNT : 1
__DERIVATION : {}
__SERVER :
__NAMESPACE :
__PATH :
Name : S03KT39A
PSComputerName :
기본 WQL WHERE 문 사용
문은 WHERE 문이 반환하는 SELECT 데이터에 대한 조건을 설정합니다.
문 형식은 WHERE 다음과 같습니다.
WHERE <property> <operator> <value>
다음은 그 예입니다.
WHERE Name = 'Notepad.exe'
이 WHERE 문은 다음 예제와 같이 문과 함께 SELECT 사용됩니다.
SELECT * FROM Win32_Process WHERE Name = 'Notepad.exe'
문을 사용할 WHERE 때는 속성 이름과 값이 정확해야 합니다.
예를 들어 다음 명령은 로컬 컴퓨터에서 메모장 프로세스를 가져옵니다.
Get-CimInstance -Query "SELECT * FROM Win32_Process WHERE name='Notepad.exe'"
그러나 프로세스 이름에 파일 확장명을 포함하므로 다음 명령이 .exe 실패합니다.
Get-CimInstance -Query "SELECT * FROM Win32_Process WHERE name='Notepad'"
WHERE 문 비교 연산자
다음 연산자는 WQL WHERE 문에서 유효합니다.
Operator Description
-----------------------
= Equal
!= Not equal
<> Not equal
< Less than
> Greater than
<= Less than or equal
>= Greater than or equal
LIKE Wildcard match
IS Evaluates null
ISNOT Evaluates not null
ISA Evaluates a member of a WMI class
다른 연산자가 있지만 비교하는 데 사용되는 연산자입니다.
예를 들어 다음 쿼리는 프로세스 우선 순위가 11보다 크거나 같은 Win32_Process 클래스의 프로세스에서 Name 및 Priority 속성을 선택합니다. cmdlet은 Get-WmiObject 쿼리를 실행합니다.
$highPriority = "Select Name, Priority from Win32_Process " +
"WHERE Priority >= 11"
Get-CimInstance -Query $highPriority
-Filter 매개 변수에서 WQL 연산자 사용
WQL 연산자는 cmdlet의 Filter 매개 변수 Get-CimInstance 값과 이러한 cmdlet의 쿼리 매개 변수 값에도 사용할 수 있습니다.
예를 들어 다음 명령은 Name 가져오고 1004보다 큰 값이 마지막 5개 프로세스의 ProcessId 속성을 가져옵니다. 이 명령은 Filter 매개 변수를 사용하여 ProcessId 조건을 지정합니다.
$getCimInstance = @{
Class = 'Win32_Process'
Property = 'Name', 'ProcessId'
Filter = "ProcessId >= 1004"
}
Get-CimInstance @getCimInstance |
Sort-Object ProcessId |
Select-Object Name, ProcessId -Last 5
Name ProcessId
---- ---------
SROSVC.exe 4220
WINWORD.EXE 4664
TscHelp.exe 4744
SnagIt32.exe 4748
WmiPrvSE.exe 5056
LIKE 연산자 사용
연 LIKE 산자를 사용하면 와일드카드 문자를 사용하여 WQL 쿼리의 결과를 필터링할 수 있습니다.
Like Operator Description
--------------------------------------------------
[] Character in a range [a-f] or a set
of characters [abcdef]. The items in
a set don't need to be consecutive or
listed in alphabetical order.
^ Character not in a range [^a-f] or
not in a set [^abcdef]. The items in
a set don't need to be consecutive or
listed in alphabetical order.
% A string of zero or more characters
_ One character.
(underscore) NOTE: To use a literal underscore
in a query string, enclose it in
square brackets [_].
LIKE 와일드카드 문자나 범위 연산자 없이 연산자를 사용하면 같음 연산자(=)처럼 동작하며 패턴과 정확히 일치하는 경우에만 개체를 반환합니다.
범위 연산을 백분율(%) 와일드카드 문자와 결합하여 단순하면서도 강력한 필터를 만들 수 있습니다.
LIKE 연산자 예제
예제 1: [<range>]
다음 명령은 메모장을 시작하고 "H"와 "N" 사이의 문자로 시작하는 이름이 있는 Win32_Process 클래스의 인스턴스를 검색합니다(대/소문자를 구분하지 않습니다).
쿼리는 모든 프로세스를 Hotepad.exe 반환 Notepad.exe해야 합니다.
Notepad # Starts Notepad
$query = "SELECT * FROM Win32_Process WHERE Name LIKE '[H-N]otepad.exe'"
Get-CimInstance -Query $query | select Name, ProcessId
Name ProcessId
---- ---------
notepad.exe 1740
예제 2: [<range>] 및 %
다음 명령은 A와 P(대/소문자를 구분하지 않는) 사이의 문자로 시작하는 이름이 있는 모든 프로세스와 0개 이상의 문자를 조합하여 선택합니다.
Get-CimInstance cmdlet은 쿼리를 실행하고, Select-Object cmdlet은 Name 가져오고 ProcessId 속성을, Sort-Object cmdlet은 이름을 기준으로 결과를 사전순으로 정렬합니다.
$query = "SELECT * FROM Win32_Process WHERE name LIKE '[A-P]%'"
Get-CimInstance -Query $query |
Select-Object -Property Name, ProcessId |
Sort-Object -Property Name
예제 3: 범위에 없음(^)
다음 명령은 이름이 A, S, W, P, R, C, U, N 문자로 시작되지 않는 프로세스를 가져옵니다.
그리고 0개 이상의 문자를 따랐습니다.
$query = "SELECT * FROM Win32_Process WHERE name LIKE '[^ASWPRCUN]%'"
Get-CimInstance -Query $query |
Select-Object -Property Name, ProcessId |
Sort-Object -Property Name
예제 4: 모든 문자 -- 또는 없음(%)
다음 명령은 이름이 .로 calc시작하는 프로세스를 가져옵니다.
백분율 기호(%)는 WQL 와일드카드 문자입니다. PowerShell의 별표(*) 와일드카드와 동일합니다.
$query = "SELECT * FROM Win32_Process WHERE Name LIKE 'calc%'"
Get-CimInstance -Query $query | Select-Object -Property Name, ProcessId
Name ProcessId
---- ---------
calc.exe 4424
예제 5: 한 문자(_)
다음 명령은 밑줄 문자가 한 문자를 나타내는 다음 패턴 c_lc.exe 의 이름을 가진 프로세스를 가져옵니다. 이 패턴은 "calc.execzlc.exec" 및 "l"을 둘 이상의 문자로 구분하는 이름과 일치하지 c9lc.exe 않습니다.
$query = "SELECT * FROM Win32_Process WHERE Name LIKE 'c_lc.exe'"
Get-CimInstance -Query $query | Select-Object -Property Name, ProcessId
Name ProcessId
---- ---------
calc.exe 4424
예제 6: 정확한 일치
다음 명령은 명명된 WLIDSVC.exe프로세스를 가져옵니다. 쿼리에서 키워드를 LIKE 사용하더라도 값에 와일드카드 문자가 포함되지 않으므로 정확히 일치해야 합니다.
$query = "SELECT * FROM Win32_Process WHERE name LIKE 'WLIDSVC.exe'"
Get-CimInstance -Query $query | Select-Object -Property Name, ProcessId
Name ProcessId
---- ---------
WLIDSVC.exe 84
OR 연산자 사용
여러 독립 조건을 지정하려면 키워드를 OR 사용합니다. 키워드가 OR 절에 WHERE 나타납니다. 두 개 이상의 조건에 대해 포괄 OR 연산을 수행하고 조건을 충족하는 항목을 반환합니다.
OR 연산자의 형식은 다음과 같습니다.
WHERE <property> <operator> <value> OR <property> <operator> <value> ...
예를 들어 다음 명령은 Win32_Process WMI 클래스의 모든 인스턴스를 가져올 수 있지만 프로세스 이름이 winword.exe 있는 excel.exe경우에만 반환합니다.
$q = "SELECT * FROM Win32_Process WHERE Name='winword.exe'" +
" OR Name='excel.exe'"
Get-CimInstance -Query $q
이 문은 OR 두 개 이상의 조건에서 사용할 수 있습니다. 다음 쿼리에서 문은 OR 또는 Winword.exeExcel.exepowershell.exe.
$q = "SELECT * FROM Win32_Process WHERE Name='winword.exe'" +
" OR Name='excel.exe' OR Name='powershell.exe'"
AND 연산자 사용
여러 관련 조건을 지정하려면 키워드를 AND 사용합니다. 키워드가 AND 절에 WHERE 나타납니다. 모든 조건을 충족하는 항목을 반환합니다.
AND 연산자의 형식은 다음과 같습니다.
WHERE <property> <operator> <value> `AND` <property> <operator> <value> ...
예를 들어 다음 명령은 이름 Winword.exe 및 프로세스 ID가 6512인 프로세스를 가져옵니다.
명령은 cmdlet을 Get-CimInstance 사용합니다.
$q = "SELECT * FROM Win32_Process WHERE Name = 'winword.exe' " +
"AND ProcessId =6512"
Get-CimInstance -Query $q
ProcessId Name HandleCount WorkingSetSize VirtualSize
--------- ---- ----------- -------------- -----------
# 6512 WINWORD.EXE 768 117170176 633028608
연산자를 LIKE 포함한 모든 연산자는 해당 연산자와 ORAND 함께 유효합니다. 또한 단일 쿼리의 OR 연산자와 AND 연산자를 먼저 처리할 절을 WMI에 알려주는 괄호와 결합할 수 있습니다.
이 명령은 PowerShell 연속 문자(`)를 사용하여 명령을 두 줄로 나눕니다.
null 값 검색
WMI에서 null 값을 검색하는 것은 예측할 수 없는 결과를 초래할 수 있기 때문에 어려운 일입니다.
Null 가 0이 아니고 빈 문자열과 동일하지 않습니다. 일부 WMI 클래스 속성은 초기화되고 다른 속성은 초기화되지 않으므로 null에 대한 검색이 일부 속성에 대해 작동하지 않을 수 있습니다.
null 값을 검색하려면 값 null이 있는 Is 연산자를 사용합니다.
예를 들어 다음 명령은 InstallDate 속성에 대해 null 값이 있는 프로세스를 가져옵니다. 명령은 많은 프로세스를 반환합니다.
$q = "SELECT * FROM Win32_Process WHERE InstallDate is null"
Get-CimInstance -Query $q
반면, 다음 명령은 Description 속성에 대한 null 값이 있는 사용자 계정을 가져옵니다. 대부분의 사용자 계정에 Description 속성에 대한 값이 없더라도 이 명령은 사용자 계정을 반환하지 않습니다.
$q = "SELECT * FROM Win32_UserAccount WHERE Description is null"
Get-CimInstance -Query $q
Description 속성에 대한 값이 없는 사용자 계정을 찾으려면 같음 연산자를 사용하여 빈 문자열을 가져옵니다. 빈 문자열을 나타내려면 두 개의 연속된 작은따옴표를 사용합니다.
$q = "SELECT * FROM Win32_UserAccount WHERE Description = '' "
true 또는 false 사용
WMI 개체의 속성에서 부울 값을 얻으려면 다음을 사용합니다 TrueFalse.
대/소문자를 구분하지 않습니다.
다음 WQL 쿼리는 도메인에 가입된 컴퓨터의 로컬 사용자 계정만 반환합니다.
$q = "SELECT * FROM Win32_UserAccount WHERE LocalAccount = True"
Get-CimInstance -Query $q
도메인 계정을 찾으려면 다음 예제와 같이 False 값을 사용합니다.
$q = "SELECT * FROM Win32_UserAccount WHERE LocalAccount = False"
Get-CimInstance -Query $q
이스케이프 문자 사용
WQL은 백슬래시(\)를 이스케이프 문자로 사용합니다. 이는 백틱 문자(`)를 사용하는 PowerShell과 다릅니다.
따옴표와 따옴표에 사용되는 문자는 잘못 해석되지 않도록 이스케이프해야 하는 경우가 많습니다.
이름에 작은따옴표가 포함된 사용자를 찾으려면 다음 명령과 같이 백슬래시를 사용하여 작은따옴표를 이스케이프합니다.
$q = "SELECT * FROM Win32_UserAccount WHERE Name = 'Tim O\'Brian'"
Get-CimInstance -Query $q
Name Caption AccountType SID Domain
---- ------- ----------- --- ------
Tim O'Brian FABRIKAM\TimO 512 S-1-5-21-1457... FABRIKAM
경우에 따라 백슬래시도 이스케이프해야 합니다. 예를 들어 다음 명령은 캡션 값의 백슬래시로 인해 잘못된 쿼리 오류를 생성합니다.
$q = "SELECT * FROM Win32_UserAccount WHERE Caption = 'Fabrikam\TimO'"
Get-CimInstance -Query $q
Get-CimInstance : Invalid query
At line:1 char:1
+ Get-CimInstance -Query $q
+ ~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Get-CimInstance], CimExcep
+ FullyQualifiedErrorId : HRESULT 0x80041017,Microsoft.Management.Infrastr
백슬래시를 이스케이프하려면 다음 명령과 같이 두 번째 백슬래시 문자를 사용합니다.
$q = "SELECT * FROM Win32_UserAccount WHERE Caption = 'Fabrikam\\TimO'"
Get-CimInstance -Query $q
참고하십시오
PowerShell