Powershell McAfee i ePO w jednym stały domku

W codziennej pracy często do głosu dochodzi moja natura leniwego administratora systemów. Wtedy nie potrafię opanować potrzeby napisania jakiegoś epickiego skryptu -np. masowa zmiana DNS. 🙂 Nie inaczej było, gdy poproszono mnie o sprawdzenie poprawności instalacji oraz pokrycia oryginalnymi szczepionkami na maszynach, które serwer ePO widział jako Non-Compliant (czyli, takie, którego lokalny McAfee miał albo przestarzałe definicje szczepionek, lub McAfee nie był wcale zainstalowany). Przecież nie od dziś wiadomo, że sprawnie działający system antywirusowy to podstawa obrony przed wirtualnym robactwem lub innymi atakami. Oczywiście można się domyślać, że jak skrypt w Windows to PowerShell.
Oczywiście gdyby do sprawdzenia była by jedna maszyna, można by się na niej zalogować i sprawdzić wszystko ręcznie, lecz gdy chodzi o ilości idące w setki… 🙂 no bez skryptu się nie da 🙂 Zanim jednak skrypt, kilka słów o budowaniu tegoż skryptu. Jako, że większość skryptów piszę, testuję i finalnie uruchamiam w PowerGUI lubię mieć podgląd na dwie rzeczy – zmienne oraz wyniki działania skryptu.
powergui
Przy jednym skrypcie wygląda to całkiem fajnie, ale gdy skryptów jest kilka/kilkanaście, po kilku/kilkunastu uruchomieniach tychże, robi się ogólny bałagan, w którym ciężko ogarnąć która zmienna pochodzi z jakiego skryptu.

Fundamenty każdego skryptu

Wobec powyższego postanowiłem stworzyć coś na wzór szablonu skryptu, który wykonuje niezbędne operacje wspomagając śledzenie i sprawdzanie poprawności działania skryptu. Jako, że programistyczny purysta ze mnie żaden używam takich brutalnych instrukcji instrukcji:
Clear do wyczyszczenia widoku/podglądu konsoli
$ErrorActionPreference= 'silentlycontinue'przydatne w wielu pętlach (zamiast wyświetlania błędu skrypt po prostu wykonuje dalej swoje zadanie)
Remove-Variable [a..z]* -Scope Globalusuwamy zmienne (ta sama instrukcja na początku i na końcu skryptu)
$Dir = Split-Path $ScriptPath
Push-Location $Dir

Dwa ostatnie polecenia są pomocne, jeśli korzystamy z np. z listy serwerów do sprawdzenia i znajduje się ona w tym samym katalogu co skrypt (bardzo wygodne rozwiązanie, nie trzeba się domyślać gdzie i co jest zapisane).
W kolejnym wpisie wyjaśnię w jaki sposób budując pętle w PowerShell można określić, czy zdalna maszyna jest on-line i czy skrypt może zostać na niej wykonany. Czas na skrypt, który dzięki mocy PowerShell sprawdzi McAfee i ePO:

Clear
$ErrorActionPreference= 'silentlycontinue'
Remove-Variable [a..z]* -Scope Global
Remove-Variable [1..9]* -Scope Global 
$Dir = Split-Path $ScriptPath
Push-Location $Dir
$RegistryEPO = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', 'nazwa_servera_ePO')
$RegKeyEPO = $RegistryEPO.OpenSubKey("SOFTWARE\\McAfee\\AVEngine")
$RegValueDATePO = $RegkeyEPO.GetValue("AVDatVersion")
$port = "135"
$ScriptPath = $MyInvocation.MyCommand.Path
$MachinesList = Get-Content 'lista_do_sprawdzenia.txt'
foreach ($Name in $MachinesList)
{
 $rslt = $null
 $tcp = $null
 $ping = new-object System.Net.NetworkInformation.Ping
 $rslt = $ping.send($Name)
 if ($rslt.status.tostring() -eq "Success")
 {
  try
   {
    $tcp=New-Object System.Net.Sockets.TcpClient($ip,$port)
   }
  catch
  {
  }
   if($tcp.client.connected)
   {
    $Name + " On-Line & RPC is OK"
    $BootTime = (gwmi -Class Win32_OperatingSystem -ComputerName $Name).LastBootUpTime
    $UpTime = (Get-Date) - [System.Management.ManagementDateTimeConverter]::ToDateTime($BootTime)
    $Registry = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $Name)
    $RegKey = $Registry.OpenSubKey("SOFTWARE\\McAfee\\AVEngine")
    $RegValueDAT = $Regkey.GetValue("AVDatVersion")
    $RegValueDATDate = $RegKey.GetValue("AVDatDate")
    $RegValueEngV1 = $RegKey.GetValue("EngineVersionMajor")
    $RegValueEngV2 = $RegKey.GetValue("EngineVersionMinor")
    $KeyServices = "BITS", "McAfeeEngineService", "RpcSs", "McAfeeFramework", "McShield", "McTaskManager";
    $Services = Get-Service -ComputerName $Name
    foreach ($Service in $Services)
    {
     if ($KeyServices -match $Service.ServiceName)
     {
      $Name + " " +$Service.ServiceName + " : " + $Service.Status;
     }
    }
    $disk = ([wmi]"\\$Name\root\cimv2:Win32_logicalDisk.DeviceID='c:'")
    "$Name C: has {0:#.0} GB free of {1:#.0} GB Total" -f ($disk.FreeSpace/1GB),($disk.Size/1GB) | write-output
    $Name + " DAT file date: "+$RegValueDATDate
    If ($Regkey.GetValue("AVDatVersion") -ne $RegValueDATePO)
     {
      Write-Host $Name " has DAT ver: "$RegValueDAT -backgroundcolor Red -ForegroundColor Yellow
     } 
    if ($RegKey.GetValue("AVDatVersion") -eq $RegValueDATePO)
     {
      $Name + " has DAT ver: "+$RegValueDAT
     }
    $Name + " has Engine ver: "+$RegValueEngV1+"."+$RegValueEngV2
    $Name + " uptime is: "+$UpTime.Days +" days, "+$UpTime.Hours+" hours, "+$UpTime.Minutes+ " minutes, "+$UpTime.Seconds+" seconds."
    Write-Host "---------------------------------------------------------------"
   }
   else
   {
    $Name + " On-Line & RPC is NOT OK"
    Write-Host "---------------------------------------------------------------"
   }
  }
 else 
 {
  $Name + " Off-line"
  Write-Host "---------------------------------------------------------------"
 }
}

Powyższy skrypt ma za zadanie:
– sprawdzić jaka wersja szczepionek jest na serwerze ePO (żeby było z czym porównać wersje szczepionek na maszynie)
– sprawdzić poprawność działania wymaganych usług/serwisów McAfee (plus dodatkowo BITS)
– wyświetlić wyniki
– na specjalnie życzenie jednego z wcieleń wewnętrznego szydercy – jeśli wersja szczepionek jest różna od wersji na serwerze ePO jest kolorowana na czerwono.

Jeśli macie jakieś komentarze – „Nie lękajcie się!” 🙂

 

 

Piotr Berent

Piotr Berent od 2002 w pocie czoła pracujący w środowisku IT, obecnie freelancer - Inżynier Systemowy. Entuzjasta wirtualizacji, automatyzacji i rozwiązań opartych o narzędzia open-source.

Przeczytaj także...

2 komentarze

  1. pytlar pisze:

    a czy przy setkach maszyn w firmie nie bylo by dobrym pomysle zainstalowania jakiegos systemu zarzadzania, w stylu IBM Tivoli? Sprawdzanie i upgradowanie setek maszyn bylo by o wieele latwiejsze 🙂

    • Piotr Berent pisze:

      Pozwolę się nie zgodzić:
      0. RTFA!
      1. Firma posiada systemy zarządzania jak choćby ePO i SMS/SCCM
      2. Nie sposób zaś sprawdzać losowo różnych maszyn w okresach 2-3 dniowych
      3. Skrypt to najszybsze i najprostsze rozwiązanie problemu dla maszyn które ePO pokazuje jako „niezgodne”
      4. ePO na codzień daje radę ze sprawdzaniem i upgradowaniem c.a. 100k urządzeń 😉 czasem tylko trzeba sprawdzić te najbardziej uparte 🙂

Dodaj komentarz