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, WHEREFROM.

WQL을 사용하는 경우

WMI, 특히 WQL을 사용하는 경우 Windows PowerShell도 사용 중이라는 사실을 잊지 마세요. WQL 쿼리가 예상대로 작동하지 않는 경우 WQL 쿼리를 디버그하는 것보다 표준 Windows PowerShell 명령을 사용하는 것이 더 쉽습니다.

대역폭이 제한된 원격 시스템에서 대량의 데이터를 반환하지 않는 한, 동일한 작업을 수행하는 허용 가능한 PowerShell cmdlet이 있을 때 복잡한 WQL 쿼리를 완성하는 데 몇 시간을 할애하는 것은 거의 생산적이지 않습니다.

SELECT 문 사용

일반적인 WMI 쿼리는 SELECT WMI 클래스의 모든 속성 또는 특정 속성을 가져오는 문으로 시작합니다. WMI 클래스의 모든 속성을 선택하려면 별표(*)를 사용합니다. FROM 키워드(keyword) WMI 클래스를 지정합니다.

SELECT 문 형식은 다음과 같습니다.

SELECT <property> FROM <WMI-class>

예를 들어 다음 SELECT 문은 Win32_Bios WMI 클래스의 인스턴스에서 모든 속성(*)을 선택합니다.

SELECT * FROM Win32_Bios

참고 항목

PowerShell은 기본 개체 속성만 표시합니다. 이러한 속성은 파일에 정의 Types.ps1xml 됩니다. Select-Object cmdlet 또는 cmdlet을 Format-* 사용하여 추가 속성을 표시합니다.

WMI 클래스의 특정 속성을 선택하려면 속성 이름을 키워드(keyword) 사이에 SELECTFROM 배치합니다.

다음 쿼리는 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 클래스 인스턴스의 NameVersion 속성 값도 가져옵니다.

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] 수행합니다.

  1. WQL 문자열을 ManagementObjectSearcher 개체로 캐스팅합니다.
  2. 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 클래스의 프로세스에서 NamePriority 속성을 선택합니다. 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개 프로세스의 NameProcessID 속성을 가져옵니다. 이 명령은 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은 NameProcessID 속성을 가져오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.exec9lc.exec" 및 "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프로세스를 가져옵니다. 쿼리에서 키워드(keyword) 사용 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 연산자 사용

여러 독립 조건을 지정하려면 키워드(keyword) 사용합니다 OR . OR 절에 WHERE 키워드(keyword) 나타납니다. 두 개 이상의 조건에 대해 포괄 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.exeExcel.exePowershell.exe.

$q = "SELECT * FROM Win32_Process WHERE Name='winword.exe'" +
  " OR Name='excel.exe' OR Name='powershell.exe'"

AND 연산자 사용

여러 관련 조건을 지정하려면 키워드(keyword) 사용합니다 AND . AND 절에 WHERE 키워드(keyword) 나타납니다. 모든 조건을 충족하는 항목을 반환합니다.

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에 알려주는 괄호와 결합할 수 있습니다.

이 명령은 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 개체의 속성에서 부울 값을 얻으려면 다음을 사용합니다 TrueFalse. 대/소문자를 구분하지 않습니다.

다음 WQL 쿼리는 do기본 조인된 컴퓨터의 로컬 사용자 계정만 반환합니다.

$q = "SELECT * FROM Win32_UserAccount WHERE LocalAccount = True"
Get-CimInstance -Query $q

do기본 계정을 찾으려면 다음 예제와 같이 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

참고 항목