Raportowanie GPO

Temat zapewne niebyt nowy, ale z racji iż ostatnio był mi dość potrzebny to go odświeżę. Mianowicie problem polegał na przeprowadzeniu audytu konfiguracji, a konkretniej audytu przypisanych zasad GPO do części stacji roboczych należących do konkretnych jednostek organizacyjnych usługi Active Directory.

By wygenerować taki raport wystarczy skorzystać z przystawki „Wynikowy zestaw zasad” (RSoP) niemniej jednak gdy w posiadanym środowisku zaczyna znajdować się więcej niż kilka maszyn to może stać się to nieco uciążliwe i czasochłonne.

Tutaj możemy wykorzystać PowerShella do ułatwienia sobie życia. Z racji, iż umożliwia on wykorzystywanie dostępnych klas Microsoft COM (Component Object Model), całe zadanie możemy wykonać w kilkunastu linijkach kodu.

Zanim jednak przejdziemy do generowania raportów wyciągniemy sobie listę maszyn z interesującej nas jednostki organizacyjnej. Do tego celu ustawiamy odpowiednią jednostkę organizacyjną jako podstawę wyszukiwania.

$root = [ADSI]LDAP://OU=ServersOU,DC=cds,DC=pl

Ustawiamy również typ obiektów jakie chcemy znaleźć, tutaj chodzi nam tylko o komputery:

$filter = "(&(objectCategory=Computer))"

Następnie tworzymy obiekt przeszukiwania po usłudze katalogowej i szukamy interesujących nas obiektów.

$searcher = new-Object System.DirectoryServices.DirectorySearcher($root, $filter)
$machines = $searcher.FindAll() | Select-Object @{Expression={$_.Properties.name};Label="Name"}

W momencie gdy posiadamy już listę interesujących nas maszyn, możemy przystąpić do generowania raportów. Do tego celu posłużymy się pętlą foreach dla wszystkich zwróconych maszyn oraz klauzulą try catch w celu przechwycenia ewentualnych problemów z brakiem dostępu do części maszyn.

foreach($machine in $machines)
{
Try { ... }
catch { ...}
}

Natomiast dla każdej z maszyn tworzymy nowy obiekt na podstawie klasy GPMgmt.GPM oraz obiekt GPMConstants.

$gpmc = New-Object -ComObject GPMgmt.GPM
$constants = $gpmc.GetConstants()

Kolejnym krokiem jest utworzenie obiektu Resultant Set of Policy przy wykorzystaniu metodu GetRSOP. Jako parametry podajemy następujące wartości:

  • gpmRSoPMode – rsopPlanning – dla trybu planowania lub rsopLogging – dla trybu logowania
  • bstrNamespace – WMI namespace, domyślnie jest null
  • lFlags – 0
$rsop = $gpmc.GetRSOP($constants.RSOPModeLogging,$null,0)

Ustawiamy dla jakiej maszyny ma być wygenerowany raport.

$rsop.LoggingComputer = "<nazwa komputera>"

Ewentualnie również dla jakiego użytkownika.

$rsop.LoggingUser = "<nazwa uzytkownika>"

I generujemy raport wraz z zapisaniem wyniku do pliku html.

$rsop.CreateQueryResults()
$rsop.GenerateReportToFile($constants.ReportHTML,"")

Całość wygląda następująco:

$root = [ADSI]LDAP://OU=ServersOU,DC=cds,DC=pl
$filter = "(&(objectCategory=Computer))"
$searcher = new-Object System.DirectoryServices.DirectorySearcher($root, $filter)
$machines = $searcher.FindAll() | Select-Object @{Expression={$_.Properties.name};Label="Name"}

foreach($machine in $machines)
{
 try
 {
  $gpmc = New-Object -ComObject GPMgmt.GPM
  $constants = $gpmc.GetConstants()
  $rsop = $gpmc.GetRSOP($constants.RSOPModeLogging,$null,0)
  $rsop.LoggingComputer = $($machine.Name)
  $rsop.CreateQueryResults()
  $rsop.GenerateReportToFile($constants.ReportHTML,"p:\reports\$($machine.Name).html")
 }
 catch
 {
  Write-Warning "$($machine.Name): Brak dostępu"
 }
}

Natomiast sam raport jest przedstawiony w przejrzystej formie dokumentu html:

Źródła:
http://msdn.microsoft.com/en-us/library/aa814153(v=vs.85).aspx

Reklamy

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Zdjęcie na Google+

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s