WMI


WMI는 Windows Management Instrumentation으로 윈도우 관리 도구다. 이를 PowerShell에서 사용할 수 있는데 Get-WmiObject명령을 이용한다.

PS C:\WINDOWS\system32> Get-WmiObject -Namespace "root" -Class "__Namespace"


__GENUS          : 2
__CLASS          : __NAMESPACE
__SUPERCLASS     : __SystemClass
__DYNASTY        : __SystemClass
__RELPATH        : __NAMESPACE.Name="subscription"
__PROPERTY_COUNT : 1
__DERIVATION     : {__SystemClass}
__SERVER         : K3Y6REAK9778
__NAMESPACE      : ROOT
__PATH           : \\K3Y6REAK9778\ROOT:__NAMESPACE.Name="subscription"
Name             : subscription
PSComputerName   : K3Y6REAK9778

__GENUS          : 2
__CLASS          : __NAMESPACE
__SUPERCLASS     : __SystemClass
__DYNASTY        : __SystemClass
__RELPATH        : __NAMESPACE.Name="DEFAULT"
__PROPERTY_COUNT : 1
__DERIVATION     : {__SystemClass}
__SERVER         : K3Y6REAK9778
__NAMESPACE      : ROOT
__PATH           : \\K3Y6REAK9778\ROOT:__NAMESPACE.Name="DEFAULT"
Name             : DEFAULT
PSComputerName   : K3Y6REAK9778

여기서 이름에 대한 내용만 가져오고 싶은 경우 | Select-Object Name를 붙여주면 된다.

PS C:\WINDOWS\system32> Get-WmiObject -Namespace "root" -Class "__Namespace" | Select-Object Name

Name
----
subscription
DEFAULT
CIMV2
msdtc
Cli
SECURITY
SecurityCenter2
RSOP
PEH
StandardCimv2
WMI
directory
Policy
Interop
Hardware
ServiceModel
SecurityCenter
Microsoft
aspnet
Appv

Wmi-Object 중에서 CIMV2에 대한 내용을 살펴보자.

Get-WmiObject -NameSpace "root/cimv2" -List를 입력하면 아래와 같은 수많은 항목을 볼 수 있다.

PS C:\WINDOWS\system32> Get-WmiObject -NameSpace "root/cimv2" -List


   NameSpace: ROOT\CIMV2

Name                                Methods              Properties
----                                -------              ----------
__SystemClass                       {}                   {}
__thisNAMESPACE                     {}                   {SECURITY_DESCRIPTOR}
__Provider                          {}                   {Name}
__Win32Provider                     {}                   {ClientLoadableCLSID, CLSID, Concurrency, DefaultMachineName...}
__ProviderRegistration              {}                   {provider}
__EventProviderRegistration         {}                   {EventQueryList, provider}
__ObjectProviderRegistration        {}                   {InteractionType, provider, QuerySupportLevels, SupportsBatching...}
__ClassProviderRegistration         {}                   {CacheRefreshInterval, InteractionType, PerUserSchema, provider...}
__InstanceProviderRegistration      {}                   {InteractionType, provider, QuerySupportLevels, SupportsBatching...}

...(생략)

여기서 Win32에 대한 항목을 보고 싶다면 | Where-Object {$_.Name -match "Win32}를 붙여주면 된다. 마찬가지로 많은 항목이 출력된다. 이 중 Win32_Process을 사용해 보자.

Get-WmiObject -Class Win32_Process를 실행하면 이 또한 많은 항목이 출력된다.

__GENUS                    : 2
__CLASS                    : Win32_Process
__SUPERCLASS               : CIM_Process
__DYNASTY                  : CIM_ManagedSystemElement
__RELPATH                  : Win32_Process.Handle="604"
__PROPERTY_COUNT           : 45
__DERIVATION               : {CIM_Process, CIM_LogicalElement, CIM_ManagedSystemElement}
__SERVER                   : K3Y6REAK9778
__NAMESPACE                : root\cimv2
__PATH                     : \\K3Y6REAK9778\root\cimv2:Win32_Process.Handle="604"
Caption                    : wininit.exe
CommandLine                :
CreationClassName          : Win32_Process
CreationDate               : 20170813174441.546153+540
CSCreationClassName        : Win32_ComputerSystem
CSName                     : K3Y6REAK9778
Description                : wininit.exe
ExecutablePath             :
ExecutionState             :
Handle                     : 604
HandleCount                : 152
InstallDate                :
KernelModeTime             : 12343750
MaximumWorkingSetSize      :
MinimumWorkingSetSize      :
Name                       : wininit.exe
OSCreationClassName        : Win32_OperatingSystem
OSName                     : Microsoft Windows 10 Education|C:\WINDOWS|\Device\Harddisk0\Partition4
OtherOperationCount        : 17201
OtherTransferCount         : 4702606
PageFaults                 : 6127
PageFileUsage              : 1704
ParentProcessId            : 500
PeakPageFileUsage          : 2200
PeakVirtualSize            : 2199082618880
PeakWorkingSetSize         : 7188
Priority                   : 13
PrivatePageCount           : 1744896
ProcessId                  : 604
QuotaNonPagedPoolUsage     : 12
QuotaPagedPoolUsage        : 120
QuotaPeakNonPagedPoolUsage : 15
QuotaPeakPagedPoolUsage    : 122
ReadOperationCount         : 22
ReadTransferCount          : 56320
SessionId                  : 0
Status                     :
TerminationDate            :
ThreadCount                : 1
UserModeTime               : 0
VirtualSize                : 2199078547456
WindowsVersion             : 10.0.15063
WorkingSetSize             : 4096
WriteOperationCount        : 0
WriteTransferCount         : 0
PSComputerName             : K3Y6REAK9778
ProcessName                : wininit.exe
Handles                    : 152
VM                         : 2199078547456
WS                         : 4096
Path                       :

이름만 출력하고 싶다면 | select Name을 붙여주면 된다.

PS C:\WINDOWS\system32> Get-WmiObject -Class Win32_Process | Select Name

Name
----
System Idle Process
System
smss.exe
csrss.exe
wininit.exe
services.exe
lsass.exe
svchost.exe
svchost.exe
fontdrvhost.exe
svchost.exe
svchost.exe
svchost.exe
svchost.exe
WUDFHost.exe
...(생략)

이 명령어을 이용해서 Win7의 정보를 가져올 수 있다.

Get-WmiObject -Class Win32_Process -ComputerName [Win7 컴퓨터이름] -Credential [Win7 계정] | select Name

PS C:\WINDOWS\system32> Get-WmiObject -Class Win32_Process -ComputerName WIN-J9KO348JQVU -Credential k3y6reak | select Name

Name
----
System Idle Process
System
smss.exe
csrss.exe
wininit.exe
csrss.exe
winlogon.exe
services.exe
lsass.exe
lsm.exe
svchost.exe
vmacthlp.exe
svchost.exe
svchost.exe
svchost.exe
svchost.exe
audiodg.exe
svchost.exe
svchost.exe
spoolsv.exe
svchost.exe
VGAuthService.exe
vmtoolsd.exe
svchost.exe
dllhost.exe
dllhost.exe
WmiPrvSE.exe
msdtc.exe
taskhost.exe
dwm.exe
explorer.exe
vmtoolsd.exe
VSSVC.exe
SearchIndexer.exe
wmpnetwk.exe
svchost.exe
SearchProtocolHost.exe
SearchFilterHost.exe
WmiPrvSE.exe
WmiApSrv.exe
powershell.exe
conhost.exe
sppsvc.exe
svchost.exe

여러 프로세스 중 특정 한 프로세스만 출력하고 싶은 경우 여러가지 방법이 있다.

-eq

eq는 equal로 같은 문자열이 있는 것을 찾는다. Get-WmiObject -Class Win32_Process | Where-Object {$_.Name -eq "powershell.exe"}를 이용해 powershell.exe를 찾게된다.

-Filter

필터 또한 찾고자 하는 문자열을 찾아주는 기능을 한다.

Get-WmiObject -Class Win32_Process -Filter {Name = "powershell.exe"}

-Query

쿼리는 쿼리문을 이용하여 찾는 방법을 말한다.

Get-WmiObject -Query {Select * from Win32_Process where name = "powershell.exe"}

eq, filter, query 모두 동일한 결과를 출력한다.

WMI을 이용해서 프로세스를 실행시킬 수 있다. 먼저 Win32_Process에서 사용할 수 있는 Method를 살펴보자.

Get-WmiObject -Class Win32_Process -List를 입력한다.

PS C:\WINDOWS\system32> Get-WmiObject -Class Win32_Process -List


   NameSpace: ROOT\cimv2

Name                                Methods              Properties
----                                -------              ----------
Win32_Process                       {Create, Terminat... {Caption, CommandLine, CreationClassName, CreationDate...}

Methods 항목에 Create, Termiat… 를 볼 수 있는데 사용할 수 있는 Method를 모두 보자.

Get-WmiObject -Class Win32_Process -List | Select-Object -ExpandProterty Methods를 입력해 보자.

PS C:\WINDOWS\system32> Get-WmiObject -Class Win32_Process -List | Select-Object -ExpandProperty Methods


Name          : Create
InParameters  : System.Management.ManagementBaseObject
OutParameters : System.Management.ManagementBaseObject
Origin        : Win32_Process
Qualifiers    : {Constructor, Implemented, MappingStrings, Privileges...}

Name          : Terminate
InParameters  : System.Management.ManagementBaseObject
OutParameters : System.Management.ManagementBaseObject
Origin        : Win32_Process
Qualifiers    : {Destructor, Implemented, MappingStrings, Privileges...}

Name          : GetOwner
InParameters  :
OutParameters : System.Management.ManagementBaseObject
Origin        : Win32_Process
Qualifiers    : {Implemented, MappingStrings, ValueMap}

Name          : GetOwnerSid
InParameters  :
OutParameters : System.Management.ManagementBaseObject
Origin        : Win32_Process
Qualifiers    : {Implemented, MappingStrings, ValueMap}

Name          : SetPriority
InParameters  : System.Management.ManagementBaseObject
OutParameters : System.Management.ManagementBaseObject
Origin        : Win32_Process
Qualifiers    : {Implemented, MappingStrings, ValueMap}

Name          : AttachDebugger
InParameters  :
OutParameters : System.Management.ManagementBaseObject
Origin        : Win32_Process
Qualifiers    : {Implemented, ValueMap}

Name          : GetAvailableVirtualSize
InParameters  :
OutParameters : System.Management.ManagementBaseObject
Origin        : Win32_Process
Qualifiers    : {Implemented, ValueMap}

위 출력결과를 보면 Create, Terminate, GetOwner, GetOwnerSid, SetPriority, AttachDebugger, GetAvailableVirtualSize를 사용할 수 있다.

Invoke-WmiMethod 명령어를 통해서 notepad.exe를 실행해보자.

Invoke-WmiMethod -Class Win32_Process -Name Create -ArgumentList "notepad.exe"를 입력해 보자.

PS C:\WINDOWS\system32> Invoke-WmiMethod -Class Win32_Process -Name Create -ArgumentList "notepad.exe"


__GENUS          : 2
__CLASS          : __PARAMETERS
__SUPERCLASS     :
__DYNASTY        : __PARAMETERS
__RELPATH        :
__PROPERTY_COUNT : 2
__DERIVATION     : {}
__SERVER         :
__NAMESPACE      :
__PATH           :
ProcessId        : 2940
ReturnValue      : 0
PSComputerName   :

Invoke-WmiMethod 또한 Win7에 notepad.exe를 실행할 수 있다.

PS C:\WINDOWS\system32> Invoke-WmiMethod -Class Win32_Process -Name Create -ArgumentList "notepad.exe" -ComputerName WIN-J9KO348JQVU -Credential k3y6reak


__GENUS          : 2
__CLASS          : __PARAMETERS
__SUPERCLASS     :
__DYNASTY        : __PARAMETERS
__RELPATH        :
__PROPERTY_COUNT : 2
__DERIVATION     : {}
__SERVER         :
__NAMESPACE      :
__PATH           :
ProcessId        : 2420
ReturnValue      : 0
PSComputerName   :

실행 결과를 보면 실행이 된 것을 볼 수 있는데 실제 Win7에서 확인해보면 실행되지 않는다.

실행시킬 수 있는 방법에 대해서 알아봐야겠다.




© 2017. by k3y6reak

Powered by k3y6reak