PowerShell
WMI e CIM
Ricerca…
Osservazioni
CIM vs WMI
A partire da PowerShell 3.0, esistono due modi per lavorare con le classi di gestione in PowerShell, WMI e CIM. PowerShell 1.0 e 2.0 supportavano solo il modulo WMI, che ora è sostituito dal nuovo e migliorato modulo CIM. In una versione successiva di PowerShell, i cmdlet WMI verranno rimossi.
Confronto tra moduli CIM e WMI:
CIM-cmdlet | WMI-cmdlet | Cosa fa |
---|---|---|
Get-CimInstance | Get-WmiObject | Ottiene oggetti CIM / WMI per una classe |
Invoke-CimMethod | Invoke-WmiMethod | Richiama un metodo di classe CIM / WMI |
Registrati-CimIndicationEvent | Registrati-WmiEvent | Registra l'evento per una classe CIM / WMI |
Rimuovere-CimInstance | Rimuovere-WmiObject | Rimuovi l'oggetto CIM / WMI |
Set-CimInstance | Set-WmiInstance | Aggiorna / salva oggetto CIM / WMI |
Get-CimAssociatedInstance | N / A | Ottieni istanze associate (oggetto / classi collegati) |
Get-CIMClass | Get-WmiObject -List | Elenca le classi CIM / WMI |
New-CimInstance | N / A | Crea un nuovo oggetto CIM |
Get-CimSession | N / A | Elenca le sessioni CIM |
New-CimSession | N / A | Crea una nuova sessione CIM |
New-CimSessionOption | N / A | Crea oggetto con opzioni di sessione; protocollo, codifica, disabilitazione della crittografia ecc. (da utilizzare con New-CimSession ) |
Rimuovere-CimSession | N / A | Rimuove / interrompe la sessione CIM |
Risorse addizionali
Dovrei usare CIM o WMI con Windows PowerShell? @ Ehi, Scripting Guy! blog
Interrogare oggetti
CIM / WMI è più comunemente usato per interrogare informazioni o configurazione su un dispositivo. Una classe che rappresenta una configurazione, un processo, un utente, ecc. In PowerShell esistono diversi modi per accedere a queste classi e istanze, ma i metodi più comuni sono l'utilizzo dei Get-CimInstance
(CIM) o Get-WmiObject
(WMI).
Elenca tutti gli oggetti per la classe CIM
Puoi elencare tutte le istanze di una classe.
CIM:
> Get-CimInstance -ClassName Win32_Process
ProcessId Name HandleCount WorkingSetSize VirtualSize
--------- ---- ----------- -------------- -----------
0 System Idle Process 0 4096 65536
4 System 1459 32768 3563520
480 Secure System 0 3731456 0
484 smss.exe 52 372736 2199029891072
....
....
WMI:
Get-WmiObject -Class Win32_Process
Utilizzando un filtro
È possibile applicare un filtro per ottenere solo istanze specifiche di una classe CIM / WMI. I filtri sono scritti usando WQL
(predefinito) o CQL (add -QueryDialect CQL
). -Filter
utilizza la parte WHERE
di una query WQL / CQL completa.
CIM:
Get-CimInstance -ClassName Win32_Process -Filter "Name = 'powershell.exe'"
ProcessId Name HandleCount WorkingSetSize VirtualSize
--------- ---- ----------- -------------- -----------
4800 powershell.exe 676 88305664 2199697199104
WMI:
Get-WmiObject -Class Win32_Process -Filter "Name = 'powershell.exe'"
...
Caption : powershell.exe
CommandLine : "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"
CreationClassName : Win32_Process
CreationDate : 20160913184324.393887+120
CSCreationClassName : Win32_ComputerSystem
CSName : STACKOVERFLOW-PC
Description : powershell.exe
ExecutablePath : C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
ExecutionState :
Handle : 4800
HandleCount : 673
....
Utilizzando una query WQL:
È inoltre possibile utilizzare una query WQL / CQL per interrogare e filtrare le istanze.
CIM:
Get-CimInstance -Query "SELECT * FROM Win32_Process WHERE Name = 'powershell.exe'"
ProcessId Name HandleCount WorkingSetSize VirtualSize
--------- ---- ----------- -------------- -----------
4800 powershell.exe 673 88387584 2199696674816
Interrogazione di oggetti in un diverso spazio dei nomi:
CIM:
> Get-CimInstance -Namespace "root/SecurityCenter2" -ClassName AntiVirusProduct
displayName : Windows Defender
instanceGuid : {D68DDC3A-831F-4fae-9E44-DA132C1ACF46}
pathToSignedProductExe : %ProgramFiles%\Windows Defender\MSASCui.exe
pathToSignedReportingExe : %ProgramFiles%\Windows Defender\MsMpeng.exe
productState : 397568
timestamp : Fri, 09 Sep 2016 21:26:41 GMT
PSComputerName :
WMI:
> Get-WmiObject -Namespace "root\SecurityCenter2" -Class AntiVirusProduct
__GENUS : 2
__CLASS : AntiVirusProduct
__SUPERCLASS :
__DYNASTY : AntiVirusProduct
__RELPATH : AntiVirusProduct.instanceGuid="{D68DDC3A-831F-4fae-9E44-DA132C1ACF46}"
__PROPERTY_COUNT : 6
__DERIVATION : {}
__SERVER : STACKOVERFLOW-PC
__NAMESPACE : ROOT\SecurityCenter2
__PATH : \\STACKOVERFLOW-PC\ROOT\SecurityCenter2:AntiVirusProduct.instanceGuid="{D68DDC3A-831F-4fae-9E44-DA132C1ACF46}"
displayName : Windows Defender
instanceGuid : {D68DDC3A-831F-4fae-9E44-DA132C1ACF46}
pathToSignedProductExe : %ProgramFiles%\Windows Defender\MSASCui.exe
pathToSignedReportingExe : %ProgramFiles%\Windows Defender\MsMpeng.exe
productState : 397568
timestamp : Fri, 09 Sep 2016 21:26:41 GMT
PSComputerName : STACKOVERFLOW-PC
Classi e spazi dei nomi
Esistono molte classi disponibili in CIM e WMI, separate in più spazi dei nomi. Lo spazio dei nomi più comune (e predefinito) in Windows è root/cimv2
. Per trovare la classe Righ, può essere utile elencare tutto o cercare.
Elenca le classi disponibili
È possibile elencare tutte le classi disponibili nello spazio dei nomi predefinito ( root/cimv2
) su un computer.
CIM:
Get-CimClass
WMI:
Get-WmiObject -List
Cerca una classe
Puoi cercare classi specifiche usando i caratteri jolly. Es .: Trova le classi che contengono il process
verbale.
CIM:
> Get-CimClass -ClassName "*Process*"
NameSpace: ROOT/CIMV2
CimClassName CimClassMethods CimClassProperties
------------ --------------- ------------------
Win32_ProcessTrace {} {SECURITY_DESCRIPTOR, TIME_CREATED, ParentProcessID, ProcessID...}
Win32_ProcessStartTrace {} {SECURITY_DESCRIPTOR, TIME_CREATED, ParentProcessID, ProcessID...}
Win32_ProcessStopTrace {} {SECURITY_DESCRIPTOR, TIME_CREATED, ParentProcessID, ProcessID...}
CIM_Process {} {Caption, Description, InstallDate, Name...}
Win32_Process {Create, Terminat... {Caption, Description, InstallDate, Name...}
CIM_Processor {SetPowerState, R... {Caption, Description, InstallDate, Name...}
Win32_Processor {SetPowerState, R... {Caption, Description, InstallDate, Name...}
...
WMI:
Get-WmiObject -List -Class "*Process*"
Elenca le classi in un diverso spazio dei nomi
Lo spazio dei nomi di root è semplicemente chiamato root
. È possibile elencare le classi in un altro spazio dei nomi utilizzando il parametro -NameSpace
.
CIM:
> Get-CimClass -Namespace "root/SecurityCenter2"
NameSpace: ROOT/SecurityCenter2
CimClassName CimClassMethods CimClassProperties
------------ --------------- ------------------
....
AntiSpywareProduct {} {displayName, instanceGuid, pathToSignedProductExe, pathToSignedReportingE...
AntiVirusProduct {} {displayName, instanceGuid, pathToSignedProductExe, pathToSignedReportingE...
FirewallProduct {} {displayName, instanceGuid, pathToSignedProductExe, pathToSignedReportingE...
WMI:
Get-WmiObject -Class "__Namespace" -Namespace "root"
Elenca gli spazi dei nomi disponibili
Per trovare gli spazi dei nomi figlio di root
(o di un altro spazio dei nomi), interrogare gli oggetti nella classe __NAMESPACE
per quello spazio dei nomi.
CIM:
> Get-CimInstance -Namespace "root" -ClassName "__Namespace"
Name PSComputerName
---- --------------
subscription
DEFAULT
CIMV2
msdtc
Cli
SECURITY
HyperVCluster
SecurityCenter2
RSOP
PEH
StandardCimv2
WMI
directory
Policy
virtualization
Interop
Hardware
ServiceModel
SecurityCenter
Microsoft
aspnet
Appv
WMI:
Get-WmiObject -List -Namespace "root"