A hned začneme pěkně z ostra! Máme ve firmě 55 počítačů a potřebujeme co nejrychleji zjistit, co je na nich instalované a hlavně jakou verzi „sledovaného“ programu kde máme instalovanou.
Je jasné že budeme potřebovat Cmdlet Get-WMIObject:
Get-WMIObject -ComputerName "firmaPC" -Query "SELECT * FROM Win32_Product"
Po spuštění ihned zjistíte že je to nepřehledné a je toho tam moc. Takže si to dáme do čitelnější tabulky:
Get-WMIObject -ComputerName "firmaPC" -Query "SELECT * FROM Win32_Product" | FT
Dále víme že nám jde o programy které nejsou od Microsoftu takže můžeme selektovat:
Get-WMIObject -ComputerName "firmaPC" -Query "SELECT * FROM Win32_Product Where Not Vendor Like '%Microsoft%'" | FT
Pokud hledáme přímo určitý program a víme výrobce můžeme selektovat přímo Vendora:
Get-WMIObject -ComputerName "firmaPC" -Query "SELECT * FROM Win32_Product Where Vendor Like '%ESET%'" |FT
Už to začíná být zajímavé ne? Ještě by jsme mohly zadat co chceme vypsat aby jsme tam tu verzi programu opravdy vždy měli:
Get-WMIObject -ComputerName "firmaPC"` -Query "SELECT * FROM Win32_Product Where Not Vendor Like '%Microsoft%'"| Select-Object Name, Version, Vendor, InstallDate | FT
No a to je vlastně už finální kód který musíme nějak spustit na všech padesáti pěti počítačích!
Jak ale spustit skript tento script na všechny počítače? Vzhledem že Cmdlet Get-WMIObject má parametr -ComputerName tak to bude celkem jednoduché za použití cyklu foreach
foreach ($computer in $computername)
Jako $computername našemu skriptu podstrčíme textový soubor seznam.txt kde máme seznam všech názvů PC ve firmě(co PC to jeden řádek)
$computername = Get-Content 'C:\X\seznamPC.txt'
Ještě musíme brát v potaz že pár lidí má zrovna dovolenou a PC mají vypnuté a skript by zbytečně čekal a hlásil chyby.
Takže můžeme ještě ošetřit i tuto možnost a to tím že si na každé testované PC pošleme testovací packet a dle toho skript rozdělíme na PC Online a Offline
IF (Test-Connection -BufferSize 32 -Count 1 -ComputerName $computer -Quiet) {Je ON} Else {Je OFF}
A kompletní script máme hotový. Jen ten výstup! Copak výstup konzole Powershell můžu poslat svému šéfovi? NE nemůžu!
Takže to budeme ukládat do textového souboru. A to musíme vždy uložit na konec souboru aby jsme si nepřepsaly předchozí zápis.
Pro lepší čitelnost souboru si vložíme před každým PC jeho název a stav.
No a to je už opravdu vše co potřebujeme! A zde je kompletní skript:
cls $computername = Get-Content 'C:\X\seznamPC.txt' foreach ($computer in $computername) { IF (Test-Connection -BufferSize 32 -Count 1 -ComputerName $computer -Quiet) { $computer + " *******************************************************************************************" | Out-File -FilePath 'C:\X\vypis.log' -Encoding utf8 -Append Get-WMIObject -ComputerName $computer -Query "SELECT * FROM Win32_Product Where Not Vendor Like '%Microsoft%'" | Select-Object Name, Version, Vendor, InstallDate | FT | Out-File -FilePath 'C:\X\vypis.log' -Encoding utf8 -Append Write-Host "---------- $computer Proběhlo správně ----------" } Else { $computer + " není ONline ******************************************************************************" | Out-File -FilePath 'C:\X\vypis.log' -Encoding utf8 -Append Write-Host "---------- $computer není ONLINE ----------" } }