WMIC deprecato in Windows 10 21H1

Come è normale che ogni versione di sistema operativo ci sono funzionalità e feature che vengono deprecate o rimosse a riguardo si vedano:

Nella versione 21H1 di Windows 10 è stataìo deprecato il Windows Management Instrumentation Command line tool ovvero WMIC:

“The WMIC tool is deprecated in Windows 10, version 21H1 and the 21H1 General Availability Channel release of Windows Server. This tool is superseded by Windows PowerShell for WMI. Note: This deprecation only applies to the command-line management tool. WMI itself isn’t affected.”

In Windows 11 build 22572 è stata introdotta una feature opzionale per rimuovere WMIC o in alternativa è possibile aggiungere o rimuovere WMIC tramite riga di comando:

  • DISM /Online /Add-Capability /CapabilityName:WMIC~~~~​
  • DISM /Online /Remove-Capability /CapabilityName:WMIC~~~~​

Il motivo di questa scelta è dovuto al fatto che WMIC è considerata un LOL Binaries (Living Off The Land Binaries o LOLBins) ovvero fa parte di quel gruppo di applicazioni legittime del sistema operativo, spesso firmate digitalmente negli ambienti Windows e Mac OSX, il cui funzionamento può essere sfruttato in modo inatteso per ottenere una serie di comportamenti indesiderati e spesso non facilmente individuabili come ad esempio l’esecuzione di codice arbitrario o l’ottenimento di una persistenza sull’host. A riguardo si veda LOLBAS (lolbas-project.github.io) – WMIC.

Per esempi di vettori di infezione che fanno uso di WMIC si vedano ad esempio:

A partire dalla build 22523 di Windows 11 WMIC per default non è più disponibile, a riguardo si veda Microsoft starts killing off WMIC in Windows, will thwart attacks (bleepingcomputer.com).

WMIC era spesso utilizzato negli scripts amministrativi in tutte quelle occasioni in cui era, ad esempio, necessario ottenere informazioni sul sistema come la versione del sistema operativo o per sapere se un’applicazione era o meno installata.

Un esempio può essere uno script di avvio computer che installa in modo silente un’applicazione di cui non esiste il pacchetto msi solo nel caso l’applicazione non sia già presente nel sistema, di seguito una esempio di bozza di un script di questo tipo:

REM *** Impostazioni
SET ProductName=ZWCAD 2023
SET ProductVersion=23.20.3.11

REM *** Controllo Versione installata
FOR /f “tokens=2 delims==” %%f IN (‘wmic product where “name=’%ProductName%’ and version=’%ProductVersion%'” get version /value ^| find “=”‘) DO SET ProductInstalledVersion=%%f”
ECHO %ProductInstalledVersion%|FINDSTR “^[a-zA-Z]” >nul && GOTO INSTALL
GOTO END

:INSTALL
REM *** Installazione
IF %ERRORLEVEL% NEQ 0 GOTO ERROR

:END
EXIT

:ERROR
REM *** Messaggio di errore

La deprecazione e la rimozione di WMIC implica la necessità di migrare script di questo tipo in PowerShell, ad esempio utilizzando i cmdlet per utilizzare WMI, a riguardo si veda Chapter 7 – Working with WMI.

Di seguito un esempio di come ottenere un elenco ordinato alfabeticamente delle applicazioni installate e della relativa versione:

Get-WmiObject -Class Win32_Product | Select-Object Name, Version | Sort-Object -Property Name

Di seguito invece un esempio per verificare se un’applicazione in una specifica versione è installata

Get-WmiObject -Class Win32_Product | Where-Object {$_.Name -Eq “paint.net” -And $_.Version -Eq “4.3.11“} | Select-Object PackageName