Get-wmiobject
| Fiche express | |
|---|---|
| Domaine | WMI / inventaire |
| Cmdlet | Get-WmiObject
|
| Alias | gwmi
|
| Remplacé par | Get-CimInstance (PS 3+)
|
| Voir aussi | Inventaire powershell · Invoke-Command |
Get-WmiObject interroge le référentiel WMI (Windows Management Instrumentation) pour récupérer des informations système, localement ou à distance.
⚠️ Cette cmdlet est dépréciée depuis PowerShell 3.0 au profit de Get-CimInstance,
qui utilise WS-Man plutôt que DCOM. Les exemples ci-dessous restent valables sur les
environnements historiques.
Principaux paramètres
Class : nom de la classe WMI Property : jeu de propriétés à récupérer NameSpace : espace de noms (défaut : root\cimv2) Query : requête WQL à exécuter ComputerName : machine distante Filter : clause WHERE au format WQL Credential : identifiants List : liste les classes disponibles
Découvrir les classes
# Rechercher des classes
Get-WmiObject -List -NameSpace root\cimv2 | Where { $_.Name -match 'time' }
# Rechercher une propriété
Get-WmiObject -NameSpace root\cimv2 -List -Recurse |
ForEach-Object { $_.PSBase.Properties } |
Where { $_.Name -match 'memory' } |
Select-Object Origin, Name -Unique
Services et informations système
# Arrêter / démarrer un service distant
(Get-WmiObject Win32_Service -Filter 'name="RemoteRegistry"' -Computer Serveur1).StopService().ReturnValue
(Get-WmiObject Win32_Service -Filter 'name="RemoteRegistry"' -Computer Serveur1).StartService().ReturnValue
# Mémoire physique totale
(Get-WmiObject Win32_ComputerSystem).TotalPhysicalMemory
[math]::Round((Get-WmiObject Win32_ComputerSystem).TotalPhysicalMemory / 1MB)
# Cartes réseau
Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter "IPEnabled=TRUE" -ComputerName .
Joindre une machine au domaine :
$machine = Get-WmiObject Win32_ComputerSystem
# $null peut être remplacé par une unité d'organisation
$machine.JoinDomainOrWorkgroup('domain.com','MotDePasse','administrateur@domain.com',$null,3)
$os = Get-WmiObject Win32_OperatingSystem
$os.Reboot()
Sur Windows 7 / Server 2008, le privilège EnableAllPrivileges est
nécessaire pour effectuer un redémarrage distant.
Invoke-WmiMethod
Get-WmiObject Win32_OperatingSystem -Computer Machine1 | Invoke-WmiMethod -Name Reboot
# Ouvrir un processus
Invoke-WmiMethod -Path Win32_Process -Name Create -ArgumentList notepad.exe
# Connecter une imprimante réseau
Invoke-WmiMethod -Path Win32_Printer -Name AddPrinterConnection -ArgumentList \\serveur\printer1
# Imprimante par défaut
Get-WmiObject -Class Win32_Printer -Filter "name='fax'" | Invoke-WmiMethod -Name SetDefaultPrinter
Journaux d'événements via WMI
Get-EventLog n'interroge que la base locale ; WMI permet l'accès distant :
$journal = Get-WmiObject Win32_NTEventLogFile -Computer 192.168.0.10
$journal[0].ClearEventLog()
# Trouver les arrêts machine (EventCode 513)
Get-WmiObject -Query "select eventcode,sourcename,timewritten,message from Win32_NTLogEvent where logfile='Security' AND EventCode='513'" -Computer 192.168.0.10 |
Format-List [a-z]*
Surveillance d'événements WMI
Surveiller la création d'un processus :
$strComputer = '.'
$query = "SELECT * FROM __InstanceCreationEvent WITHIN 3 WHERE TargetInstance ISA 'Win32_Process' AND TargetInstance.Name='mspaint.exe'"
$wmiQuery = New-Object System.Management.WQLEventQuery $query
$scope = New-Object System.Management.ManagementScope "\\$strComputer\root\cimv2"
$watcher = New-Object System.Management.ManagementEventWatcher $scope, $wmiQuery
$watcher.Start()
$event = $watcher.WaitForNextEvent()
Write-Host "Une instance de MsPaint vient d'être créée."
Surveiller l'espace disque (seuil 10 Go) via abonnement Register-WmiEvent :
$query = "SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE TargetInstance ISA 'Win32_LogicalDisk' AND TargetInstance.DeviceID=`"C:`" AND TargetInstance.FreeSpace < 10737418240"
$action = {
$e = $event.SourceEventArgs.NewEvent
$freespace = [System.Math]::Round($e.TargetInstance.FreeSpace / 1GB, 2)
Write-Host "Seuil critique atteint ! Taille restante : $freespace Go"
}
Register-WmiEvent -Query $query -SourceIdentifier 'EspaceLibre' -Action $action
Formes d'événement disponibles :
__InstanceCreationEvent __InstanceModificationEvent __InstanceDeletionEvent
Astuce : Ctrl + Pause permet de sortir d'une boucle while ($true).
Sécurité
Le pare-feu de la machine distante doit autoriser l'entrée « Infrastructure de gestion
Windows (WMI) ». Les options Credential, niveau d'authentification et
EnableAllPrivileges contrôlent le contexte d'exécution distant.
Voir aussi
- Inventaire powershell — script d'inventaire basé sur WMI
- Invoke-Command — exécution distante via WS-Man