Microsoft MVP성태의 닷넷 이야기
Windows: 160. WMI 쿼리를 명령행에서 간단하게 수행하는 wmic.exe [링크 복사], [링크+제목 복사],
조회: 15522
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 2개 있습니다.)

WMI 쿼리를 명령행에서 간단하게 수행하는 wmic.exe

그전에도 그냥 기계적으로 사용했다가 이번에 사용하면서 눈에 들어오더군요. ^^;

Useful WMI(C) commands
; http://virot.eu/useful-wmic-commands/

그러니까 말 그대로 WMI 쿼리를 명령행에서 쉽게 사용할 수 있도록 도와주는 프로그램입니다. 예를 들어, WMI Provider 중에 Win32_ComputerSystem 클래스의 경우,

Win32_ComputerSystem class
; https://learn.microsoft.com/en-us/windows/desktop/cimwin32prov/win32-computersystem

[Dynamic, Provider("CIMWin32"), SupportsUpdate, UUID("{8502C4B0-5FBB-11D2-AAC1-006008C78BC7}"), AMENDMENT]
class Win32_ComputerSystem : CIM_UnitaryComputerSystem
{
  uint16   AdminPasswordStatus;
  boolean  AutomaticManagedPagefile;
  boolean  AutomaticResetBootOption;
  boolean  AutomaticResetCapability;
  uint16   BootOptionOnLimit;
  uint16   BootOptionOnWatchDog;
  ...[생략]...
  boolean  HypervisorPresent;
  ...[생략]...
  string   Status;
  string   SupportContactDescription[];
  string   SystemFamily;
  string   SystemSKUNumber;
  uint16   SystemStartupDelay;
  string   SystemStartupOptions[];
  uint8    SystemStartupSetting;
  string   SystemType;
  uint16   ThermalState;
  uint64   TotalPhysicalMemory;
  string   UserName;
  uint16   WakeUpType;
  string   Workgroup;
};

제공하는 값들 중에 HypervisorPresent 속성을 구하려면 (C#에서) 다음과 같은 식의 WMI 쿼리를 작성해야 합니다.

// http://wutils.com/wmi/root/cimv2/win32_computersystem/cs-samples.html

ManagementScope scope = new ManagementScope("\\\\.\\ROOT\\cimv2");

ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_ComputerSystem Where Name=\"" + Environment.MachineName + "\"");
    
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
    
ManagementObjectCollection queryCollection = searcher.Get();
    
foreach (ManagementObject m in queryCollection) 
{
    Console.WriteLine("HypervisorPresent : {0}", m["HypervisorPresent"]);
}

저 값 하나 보자고 C# 코딩까지 하기에는 좀 그렇죠. ^^ 그래서 (운영체제에 기본 포함된) wmic.exe를 사용하면 "Win32_" 접미사를 떼고 다음과 같이 간단하게 호출할 수 있습니다.

C:\temp> wmic ComputerSystem get HypervisorPresent
HypervisorPresent
TRUE

C:\temp> 

어떤 쿼리를 지원하는지에 대해서는 wmic 도움말(/?)에 보면 다음과 같이 목록을 확인할 수 있습니다.

ALIAS                    - Access to the aliases available on the local system
BASEBOARD                - Base board (also known as a motherboard or system board) management.
BIOS                     - Basic input/output services (BIOS) management.
BOOTCONFIG               - Boot configuration management.
CDROM                    - CD-ROM management.
COMPUTERSYSTEM           - Computer system management.
CPU                      - CPU management.
CSPRODUCT                - Computer system product information from SMBIOS.
DATAFILE                 - DataFile Management.
DCOMAPP                  - DCOM Application management.
DESKTOP                  - User's Desktop management.
DESKTOPMONITOR           - Desktop Monitor management.
DEVICEMEMORYADDRESS      - Device memory addresses management.
DISKDRIVE                - Physical disk drive management.
DISKQUOTA                - Disk space usage for NTFS volumes.
DMACHANNEL               - Direct memory access (DMA) channel management.
ENVIRONMENT              - System environment settings management.
FSDIR                    - Filesystem directory entry management.
GROUP                    - Group account management.
IDECONTROLLER            - IDE Controller management.
IRQ                      - Interrupt request line (IRQ) management.
JOB                      - Provides  access to the jobs scheduled using the schedule service.
LOADORDER                - Management of system services that define execution dependencies.
LOGICALDISK              - Local storage device management.
LOGON                    - LOGON Sessions.
MEMCACHE                 - Cache memory management.
MEMORYCHIP               - Memory chip information.
MEMPHYSICAL              - Computer system's physical memory management.
NETCLIENT                - Network Client management.
NETLOGIN                 - Network login information (of a particular user) management.
NETPROTOCOL              - Protocols (and their network characteristics) management.
NETUSE                   - Active network connection management.
NIC                      - Network Interface Controller (NIC) management.
NICCONFIG                - Network adapter management.
NTDOMAIN                 - NT Domain management.
NTEVENT                  - Entries in the NT Event Log.
NTEVENTLOG               - NT eventlog file management.
ONBOARDDEVICE            - Management of common adapter devices built into the motherboard (system board).
OS                       - Installed Operating System/s management.
PAGEFILE                 - Virtual memory file swapping management.
PAGEFILESET              - Page file settings management.
PARTITION                - Management of partitioned areas of a physical disk.
PORT                     - I/O port management.
PORTCONNECTOR            - Physical connection ports management.
PRINTER                  - Printer device management.
PRINTERCONFIG            - Printer device configuration management.
PRINTJOB                 - Print job management.
PROCESS                  - Process management.
PRODUCT                  - Installation package task management.
QFE                      - Quick Fix Engineering.
QUOTASETTING             - Setting information for disk quotas on a volume.
RDACCOUNT                - Remote Desktop connection permission management.
RDNIC                    - Remote Desktop connection management on a specific network adapter.
RDPERMISSIONS            - Permissions to a specific Remote Desktop connection.
RDTOGGLE                 - Turning Remote Desktop listener on or off remotely.
RECOVEROS                - Information that will be gathered from memory when the operating system fails.
REGISTRY                 - Computer system registry management.
SCSICONTROLLER           - SCSI Controller management.
SERVER                   - Server information management.
SERVICE                  - Service application management.
SHADOWCOPY               - Shadow copy management.
SHADOWSTORAGE            - Shadow copy storage area management.
SHARE                    - Shared resource management.
SOFTWAREELEMENT          - Management of the  elements of a software product installed on a system.
SOFTWAREFEATURE          - Management of software product subsets of SoftwareElement.
SOUNDDEV                 - Sound Device management.
STARTUP                  - Management of commands that run automatically when users log onto the computer system.
SYSACCOUNT               - System account management.
SYSDRIVER                - Management of the system driver for a base service.
SYSTEMENCLOSURE          - Physical system enclosure management.
SYSTEMSLOT               - Management of physical connection points including ports,  slots and peripherals, and proprietary connections points.
TAPEDRIVE                - Tape drive management.
TEMPERATURE              - Data management of a temperature sensor (electronic thermometer).
TIMEZONE                 - Time zone data management.
UPS                      - Uninterruptible power supply (UPS) management.
USERACCOUNT              - User account management.
VOLTAGE                  - Voltage sensor (electronic voltmeter) data management.
VOLUME                   - Local storage volume management.
VOLUMEQUOTASETTING       - Associates the disk quota setting with a specific disk volume.
VOLUMEUSERQUOTA          - Per user storage volume quota management.
WMISET                   - WMI service operational parameters management.

위의 내용을 보면, "wmic ComputerSystem ..."에서의 "ComputerSystem"은 "Win32_ComputerSystem"에서 "Win32_"를 떼어냈다기보다는 그냥 별칭으로 정의된 것에 불과한 것임을 알 수 있습니다.

그런데, 저 목록에 없는 경우는 퀴리를 못하는 걸까요? 예를 들어, 지난 글에 다룬,

C# - Open Hardware Monitor를 이용한 CPU 온도 정보
; https://www.sysnet.pe.kr/2/0/11904

"root\WMI" 네임스페이스에 속한 "MSAcpi_ThermalZoneTemperature" 클래스의 경우 저 목록에 없습니다. 괜찮습니다. ^^ 다음과 같이 직접 네임스페이스와 "path" 인자의 도움으로 간단하게 해결이 됩니다.

C:\Windows\System32>wmic /NAMESPACE:\\root\WMI path MSAcpi_ThermalZoneTemperature get CurrentTemperature
CurrentTemperature
3010
3030

윈도우 10부터 "WMIC is deprecated"라는 문구가 뜨는 걸로 봐서 더 이상 지원이 안 될 듯싶은데 어쨌든 현재 상황에서 유용하게 시스템 조회를 할 수 있는 하나의 도구임에는 분명합니다.




참고로, 아래의 쿼리들도 한번 봐 두면 좋겠죠! ^^

A Brief Usage Guide for Wmic
; https://www.xorrior.com/wmic-the-enterprise/

Host Enumeration:

    --- OS Specifics ---
    wmic os LIST Full (* To obtain the OS Name, use the "caption" property)
    wmic computersystem LIST full

    --- Anti-Virus ---
    wmic /namespace:\\root\securitycenter2 path antivirusproduct

    --- Peripherals ---
    wmic path Win32_PnPdevice 

    --- Installed Updates ---
    wmic gfe list brief

    --- Directory Listing and File Search ---
    wmic DATAFILE where "path='\\Users\\test\\Documents\\'" GET Name,readable,size
    wmic DATAFILE where "drive='C:' AND Name like '%password%'" GET Name,readable,size /VALUE

    --- Local User Accounts ---
    wmic USERACCOUNT Get Domain,Name,Sid

Domain Enumeration:

    --- Domain and DC Info ---
    wmic NTDOMAIN GET DomainControllerAddress,DomainName,Roles /VALUE

    --- Domain User Info ---
    wmic /NAMESPACE:\\root\directory\ldap PATH ds_user where "ds_samaccountname='testAccount'" GET 

    --- List All Users ---
    wmic /NAMESPACE:\\root\directory\ldap PATH ds_user GET ds_samaccountname

    --- List All Groups ---
    wmic /NAMESPACE:\\root\directory\ldap PATH ds_group GET ds_samaccountname

    --- Members of A Group ---
    wmic /NAMESPACE:\\root\directory\ldap PATH ds_group where "ds_samaccountname='Domain Admins'" Get ds_member /Value

    --- List All Computers ---
    wmic /NAMESPACE:\\root\directory\ldap PATH ds_computer GET ds_samaccountname
    OR
    wmic /NAMESPACE:\\root\directory\ldap PATH ds_computer GET ds_dnshostname

Misc:

    --- Execute Remote Command ---
    wmic process call create "cmd.exe /c calc.exe"
    OR
    wmic /node:server1 process call create "win32calc.exe"

    --- Enable Remote Desktop ---
    wmic rdtoggle where AllowTSConnections="0" call SetAllowTSConnections "1"
    OR
    wmic /node:remotehost path Win32_TerminalServiceSetting where AllowTSConnections="0" call SetAllowTSConnections "1"

Find partition letters on physical drives using wmic
; https://superuser.com/questions/634842/find-partition-letters-on-physical-drives-using-wmic

    --- how to get primary harddisk serial number only ---
    wmic logicaldisk where (DeviceID="C:") assoc /assocclass:Win32_LogicalDiskToPartition
    wmic partition where (DeviceID="Disk #0, Partition #0") assoc /assocclass:Win32_DiskDriveToDiskPartition
    wmic path win32_diskdrive where deviceid='\\\\.\\PHYSICALDRIVE0' get serialnumber




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 1/25/2023]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 



2019-07-08 09시10분
ex) wmic /NAMESPACE:\\root\cimv2 path SoftwareLicensingProduct WHERE (ApplicationID='55c92734-d682-4d71-983e-d6ec3f16059f' AND LicenseStatus=1) get *
정성태
2022-10-30 11시31분
파이썬에 wmi를 지원하는 패키지가 있군요. ^^ 이것을 이용하면 다음과 같이 값을 가져올 수 있습니다.

# pip install wmi

import wmi
data = wmi.WMI()

result = data.Win32_ComputerSystem()
print(type(result)) # <class 'list'>

print(result[0].HypervisorPresent) # True
정성태

... 31  32  33  34  35  36  37  38  39  40  [41]  42  43  44  45  ...
NoWriterDateCnt.TitleFile(s)
12611정성태4/22/20218173오류 유형: 711. 닷넷 EXE 실행 오류 - Mixed mode assembly is build against version 'v2.0.50727' of the runtime
12610정성태4/22/20218001.NET Framework: 1046. C# - 컴파일 시점에 참조할 수 없는 타입을 포함한 이벤트 핸들러를 Reflection을 이용해 구독하는 방법파일 다운로드1
12609정성태4/22/20219385.NET Framework: 1045. C# - 런타임 시점에 이벤트 핸들러를 만들어 Reflection을 이용해 구독하는 방법파일 다운로드1
12608정성태4/21/202110314.NET Framework: 1044. C# - Generic Host를 이용해 .NET 5로 리눅스 daemon 프로그램 만드는 방법 [9]파일 다운로드1
12607정성태4/21/20218869.NET Framework: 1043. C# - 실행 시점에 동적으로 Delegate 타입을 만드는 방법파일 다운로드1
12606정성태4/21/202112955.NET Framework: 1042. C# - enum 값을 int로 암시적(implicit) 형변환하는 방법? [2]파일 다운로드1
12605정성태4/18/20218872.NET Framework: 1041. C# - AssemblyID, ModuleID를 관리 코드에서 구하는 방법파일 다운로드1
12604정성태4/18/20217532VS.NET IDE: 163. 비주얼 스튜디오 속성 창의 "Build(빌드)" / "Configuration(구성)"에서의 "활성" 의미
12603정성태4/16/20218431VS.NET IDE: 162. 비주얼 스튜디오 - 상속받은 컨트롤이 디자인 창에서 지원되지 않는 문제
12602정성태4/16/20219631VS.NET IDE: 161. x64 DLL 프로젝트의 컨트롤이 Visual Studio의 Designer에서 보이지 않는 문제 [1]
12601정성태4/15/20218744.NET Framework: 1040. C# - REST API 대신 github 클라이언트 라이브러리를 통해 프로그래밍으로 접근
12600정성태4/15/20218905.NET Framework: 1039. C# - Kubeconfig의 token 설정 및 인증서 구성을 자동화하는 프로그램
12599정성태4/14/20219631.NET Framework: 1038. C# - 인증서 및 키 파일로부터 pfx/p12 파일을 생성하는 방법파일 다운로드1
12598정성태4/14/20219738.NET Framework: 1037. openssl의 PEM 개인키 파일을 .NET RSACryptoServiceProvider에서 사용하는 방법 (2)파일 다운로드1
12597정성태4/13/20219793개발 환경 구성: 569. csproj의 내용을 공통 설정할 수 있는 Directory.Build.targets / Directory.Build.props 파일
12596정성태4/12/20219507개발 환경 구성: 568. Windows의 80 포트 점유를 해제하는 방법
12595정성태4/12/20218933.NET Framework: 1036. SQL 서버 - varbinary 타입에 대한 문자열의 CAST, CONVERT 변환을 C# 코드로 구현
12594정성태4/11/20218366.NET Framework: 1035. C# - kubectl 명령어 또는 REST API 대신 Kubernetes 클라이언트 라이브러리를 통해 프로그래밍으로 접근 [1]파일 다운로드1
12593정성태4/10/20219569개발 환경 구성: 567. Docker Desktop for Windows - kubectl proxy 없이 k8s 대시보드 접근 방법
12592정성태4/10/20219406개발 환경 구성: 566. Docker Desktop for Windows - k8s dashboard의 Kubeconfig 로그인 및 Skip 방법
12591정성태4/9/202112687.NET Framework: 1034. C# - byte 배열을 Hex(16진수) 문자열로 고속 변환하는 방법 [2]파일 다운로드1
12590정성태4/9/20219145.NET Framework: 1033. C# - .NET 4.0 이하에서 Console.IsInputRedirected 구현 [1]
12589정성태4/8/202110502.NET Framework: 1032. C# - Environment.OSVersion의 문제점 및 윈도우 운영체제의 버전을 구하는 다양한 방법 [1]
12588정성태4/7/202111039개발 환경 구성: 565. PowerShell - New-SelfSignedCertificate를 사용해 CA 인증서 생성 및 인증서 서명 방법
12587정성태4/6/202111855개발 환경 구성: 564. Windows 10 - ClickOnce 배포처럼 사용할 수 있는 MSIX 설치 파일 [1]
12586정성태4/5/20219540오류 유형: 710. Windows - Restart-Computer / shutdown 명령어 수행 시 Access is denied(E_ACCESSDENIED)
... 31  32  33  34  35  36  37  38  39  40  [41]  42  43  44  45  ...