about_WQL
간단한 설명
Windows PowerShell에서 WMI 개체를 가져오는 데 사용할 수 있는 WQL(WMI Query Language)에 대해 설명합니다.
자세한 설명
WQL은 WMI(Windows Management Instrumentation) 쿼리 언어로, WMI에서 정보를 가져오는 데 사용되는 언어입니다.
WQL을 사용하여 Windows PowerShell에서 WMI 쿼리를 수행할 필요는 없습니다.
대신, 또는 Get-CimInstance
cmdlet의 매개 변수를 Get-WmiObject
사용할 수 있습니다. WQL 쿼리는 표준 Get-WmiObject
명령보다 다소 빠르며 명령이 수백 개의 시스템에서 실행될 때 향상된 성능이 분명합니다. 그러나 성공적인 WQL 쿼리를 작성하는 데 소요되는 시간이 성능 향상보다 크지 않은지 확인합니다.
WQL을 사용해야 하는 기본 WQL 문은 SELECT
, WHERE
및 FROM
.
WQL을 사용하는 경우
WMI, 특히 WQL을 사용하는 경우 Windows PowerShell도 사용 중이라는 사실을 잊지 마세요. WQL 쿼리가 예상대로 작동하지 않는 경우 WQL 쿼리를 디버그하는 것보다 표준 Windows PowerShell 명령을 사용하는 것이 더 쉽습니다.
대역폭이 제한된 원격 시스템에서 대량의 데이터를 반환하지 않는 한, 동일한 작업을 수행하는 허용 가능한 PowerShell cmdlet이 있을 때 복잡한 WQL 쿼리를 완성하는 데 몇 시간을 할애하는 것은 거의 생산적이지 않습니다.
SELECT 문 사용
일반적인 WMI 쿼리는 SELECT
WMI 클래스의 모든 속성 또는 특정 속성을 가져오는 문으로 시작합니다. WMI 클래스의 모든 속성을 선택하려면 별표(*
)를 사용합니다. 키워드는 FROM
WMI 클래스를 지정합니다.
SELECT
문 형식은 다음과 같습니다.
SELECT <property> FROM <WMI-class>
예를 들어 다음 SELECT
문은 Win32_Bios WMI 클래스의 인스턴스에서 모든 속성(*
)을 선택합니다.
SELECT * FROM Win32_Bios
참고 항목
PowerShell은 기본 개체 속성만 표시합니다. 이러한 속성은 파일에 정의 Types.ps1xml
됩니다. Select-Object
cmdlet 또는 cmdlet을 Format-*
사용하여 추가 속성을 표시합니다.
WMI 클래스의 특정 속성을 선택하려면 속성 이름을 키워드와 FROM
키워드 사이에 SELECT
배치합니다.
다음 쿼리는 Win32_Bios WMI 클래스에서 BIOS의 이름만 선택합니다. 이 명령은 변수에 쿼리를 $queryName
저장합니다.
SELECT Name FROM Win32_Bios
둘 이상의 속성을 선택하려면 쉼표로 속성 이름을 구분합니다.
다음 WMI 쿼리는 Win32_Bios WMI 클래스의 이름과 버전을 선택합니다. 이 명령은 변수에 쿼리를 $queryNameVersion
저장합니다.
SELECT name, version FROM Win32_Bios
WQL 쿼리 사용
Windows PowerShell 명령에서 WQL 쿼리를 사용하는 세 가지 방법이 있습니다.
Get-WmiObject
cmdlet 사용Get-CimInstance
cmdlet 사용- 형식 가속기를
[wmisearcher]
사용합니다.
Get-WmiObject cmdlet 사용
WQL 쿼리를 사용하는 가장 기본적인 방법은 다음 예제와 같이 따옴표(문자열)로 묶은 다음 쿼리 문자열을 cmdlet의 Get-WmiObject
쿼리 매개 변수 값으로 사용하는 것입니다.
Get-WmiObject -Query "SELECT * FROM Win32_Bios"
SMBIOSBIOSVersion : 8BET56WW (1.36 )
Manufacturer : LENOVO
Name : Default System BIOS
SerialNumber : R9FPY3P
Version : LENOVO - 1360
다음 명령과 같이 WQL 문을 변수에 저장한 다음 쿼리 매개 변수의 값으로 사용할 수도 있습니다.
$query = "SELECT * FROM Win32_Bios"
Get-WmiObject -Query $query
WQL 문과 함께 두 형식 중 하나를 사용할 수 있습니다. 다음 명령은 변수의 쿼리를 $queryName
사용하여 시스템 BIOS의 이름 및 버전 속성만 가져옵니다.
$queryNameVersion = "SELECT Name, Version FROM Win32_Bios"
Get-WmiObject -Query $queryNameVersion
__GENUS : 2
__CLASS : Win32_BIOS
__SUPERCLASS :
__DYNASTY :
__RELPATH :
__PROPERTY_COUNT : 2
__DERIVATION : {}
__SERVER :
__NAMESPACE :
__PATH :
Name : S03KT39A
Version : LENOVO - 1270
PSComputerName :
cmdlet의 매개 변수를 Get-WmiObject
사용하여 동일한 결과를 얻을 수 있습니다. 예를 들어 다음 명령은 Win32_Bios WMI 클래스 인스턴스의 Name 및 Version 속성 값도 가져옵니다.
Get-WmiObject -Class Win32_Bios -Property Name, Version
__GENUS : 2
__CLASS : Win32_BIOS
__SUPERCLASS :
__DYNASTY :
__RELPATH :
__PROPERTY_COUNT : 2
__DERIVATION : {}
__SERVER :
__NAMESPACE :
__PATH :
Name : S03KT39A
Version : LENOVO - 1270
PSComputerName :
Get-CimInstance cmdlet 사용
Windows PowerShell 3.0부터 cmdlet을 Get-CimInstance
사용하여 WQL 쿼리를 실행할 수 있습니다.
Get-CimInstance
는 WMI 클래스를 포함하여 CIM 규격 클래스의 인스턴스를 가져옵니다. Windows 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
저장한 다음 변수에서 ManagementObjectSearcher 개체의 메서드를 $bios
호출 Get()
합니다.
$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-WmiObject -Query "SELECT * FROM Win32_Process WHERE name='Notepad.exe'"
그러나 프로세스 이름에 파일 확장명을 포함하므로 다음 명령이 .exe
실패합니다.
Get-WmiObject -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-WmiObject -Query $highPriority
-Filter 매개 변수에서 WQL 연산자 사용
WQL 연산자는 이러한 cmdlet의 쿼리 매개 변수 Get-WmiObject
값뿐만 아니라 또는 Get-CimInstance
cmdlet의 Filter 매개 변수 값에도 사용할 수 있습니다.
예를 들어 다음 명령은 ProcessID 값이 1004보다 큰 마지막 5개 프로세스의 Name 및 ProcessID 속성을 가져옵니다. 이 명령은 Filter 매개 변수를 사용하여 ProcessID 조건을 지정합니다.
$getWmiObjectSplat = @{
Class = 'Win32_Process'
Property = 'Name', 'ProcessID'
Filter = "ProcessID >= 1004"
}
Get-WmiObject @getWmiObjectSplat |
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-WmiObject -Query $query | Select Name, ProcessID
Name ProcessID
---- ---------
notepad.exe 1740
예제 2: [<range>] 및 %
다음 명령은 A와 P(대/소문자를 구분하지 않는) 사이의 문자로 시작하는 이름이 있는 모든 프로세스와 0개 이상의 문자를 조합하여 선택합니다.
cmdlet은 Get-WmiObject
쿼리를 실행하고, Select-Object
cmdlet은 Name 및 ProcessID 속성을 가져오고Sort-Object
, cmdlet은 이름을 기준으로 결과를 사전순으로 정렬합니다.
$query = "SELECT * FROM Win32_Process WHERE name LIKE '[A-P]%'"
Get-WmiObject -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-WmiObject -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-WmiObject -Query $query | Select-Object -Property Name, ProcessID
Name ProcessID
---- ---------
calc.exe 4424
예제 5: 한 문자(_)
다음 명령은 밑줄 문자가 한 문자를 나타내는 다음 패턴 c_lc.exe
의 이름을 가진 프로세스를 가져옵니다. 이 패턴은 "czlc.exe
c9lc.exe
c" 및 "l"을 둘 이상의 문자로 구분하는 이름과 일치하지 calc.exe
않습니다.
$query = "SELECT * FROM Win32_Process WHERE Name LIKE 'c_lc.exe'"
Get-WmiObject -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-WmiObject -Query $query | Select-Object -Property Name, ProcessID
```powershell
```output
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-WmiObject -Query $q
이 문은 OR
두 개 이상의 조건에서 사용할 수 있습니다. 다음 쿼리에서 문은 OR
또는 Winword.exe
Excel.exe
Powershell.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
포함한 모든 연산자는 해당 연산자와 OR
AND
함께 유효합니다. 또한 단일 쿼리의 OR
연산자와 AND
연산자를 먼저 처리할 절을 WMI에 알려주는 괄호와 결합할 수 있습니다.
이 명령은 Windows PowerShell 연속 문자(`
)를 사용하여 명령을 두 줄로 나눕니다.
null 값 검색
WMI에서 null 값을 검색하는 것은 예측할 수 없는 결과를 초래할 수 있기 때문에 어려운 일입니다. Null
가 0이 아니고 빈 문자열과 동일하지 않습니다. 일부 WMI 클래스 속성은 초기화되고 다른 속성은 초기화되지 않으므로 null에 대한 검색이 일부 속성에 대해 작동하지 않을 수 있습니다.
null 값을 검색하려면 값 null
이 있는 Is 연산자를 사용합니다.
예를 들어 다음 명령은 IntallDate 속성에 대해 null 값이 있는 프로세스를 가져옵니다. 명령은 많은 프로세스를 반환합니다.
$q = "SELECT * FROM Win32_Process WHERE InstallDate is null"
Get-WmiObject -Query $q
반면, 다음 명령은 Description 속성에 대한 null 값이 있는 사용자 계정을 가져옵니다. 대부분의 사용자 계정에 Description 속성에 대한 값이 없더라도 이 명령은 사용자 계정을 반환하지 않습니다.
$q = "SELECT * FROM Win32_UserAccount WHERE Description is null"
Get-WmiObject -Query $q
Description 속성에 대한 값이 없는 사용자 계정을 찾으려면 같음 연산자를 사용하여 빈 문자열을 가져옵니다. 빈 문자열을 나타내려면 두 개의 연속된 작은따옴표를 사용합니다.
$q = "SELECT * FROM Win32_UserAccount WHERE Description = '' "
true 또는 false 사용
WMI 개체의 속성에서 부울 값을 얻으려면 다음을 사용합니다 True
False
.
대/소문자를 구분하지 않습니다.
다음 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은 백슬래시(\
)를 이스케이프 문자로 사용합니다. 이는 백틱 문자(`
)를 사용하는 Windows 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