Get-wmiobject

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
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