PowerShell: Értesítést kérek, ha valakit felvesznek a rendszergazdai csoportba
Kapsz értesítést, ha változások lesznek a csoporttagságban? Nem? A csoportos tagság különösen érdekes. Főleg, ha a domain rendszergazdák csoportjáról van szó. A következő cikk bemutatja, hogyan lehet felismerni a változásokat, majd rendszeres időközönként ellenőrizni őket. Minden változásról értesíteni kell az adminisztrátort. Ezt megteheti üzenetben vagy e-mailben. Az ellenőrzési házirendek konfigurálása helyett mindent a PowerShellben végzünk, majd a szkriptünket egy ütemezett feladatba helyezzük.
A cél
A következőket szeretnénk elérni.
Ha a Domain Admins Group tagságában változás történik, értesítsen e-mailben vagy üzenetben, vagy bármi mással. Így nézhet ki:
Vagy ez:
Bevezetés
Először le kell kérnünk a Domain Admin csoport összes tagját.
Get-ADGroupMember -Identity "Domain Admins").Name
Alternatív megoldásként elmenthetjük egy Admins.txt fájlba:
(Get-ADGroupMember -Identity "Domain Admins").Name | Out-File C:\Temp\Admins.txt
Most hozzáadok egy új felhasználót a csoporthoz. Arnold Schwarzenbergnek hívják. A híres személyekkel való hasonlóságok pusztán véletlenek. ?
Ezután elmentem az eredményt egy másik Admins2.txt fájlba
(Get-ADGroupMember -Identity "Domain Admins").Name | Out-File C:\Temp\Admins2.txt
Most nézzük meg mindkét fájlt.
Következő lépésünk a két fájl tartalmának összehasonlítása. Ehhez a Compare-Object-et használom.
$a=Get-Content C:\Temp\Admins.txt
$b=Get-Content C:\Temp\Admins2.txt
$differ=Compare-Object -ReferenceObject $a -DifferenceObject $b | Select-Object -ExpandProperty InputObject
Bírság. Megkaptuk őt!
Egy másik módszer a csoporttagok elmentése egy változóba. Ez a kedvenc módszerem. Nem szeretem ezeket a szöveges fájlokat ?
$ref=(Get-ADGroupMember -Identity "Domain Admins").Name
$diff=(Get-ADGroupMember -Identity "Domain Admins").Name
Hozzon létre egy szkriptet a tagság rendszeres összehasonlításához naponta egyszer
Nyissa meg a PowerShell ISE-t. Állítsuk össze az egészet egy forgatókönyvben. Az első szkript üzenetet kezdeményez a rendszergazda asztalán. Ellenőrzi a tagokat, majd körülbelül egy órát vár. Ezután a szkript újra ellenőrzi, és összehasonlítja az eredményt. Most a SideIndicator-t használjuk. Ez a jelző akkor lehet hasznos, ha csak egy irányban szeretné lekérdezni az értékek változásait. Az érvényes értékek: => és <=
$ref=(Get-ADGroupMember -Identity "Domain Admins").Name
Start-Sleep -Seconds 86398
$diff=(Get-ADGroupMember -Identity "Domain Admins").Name
$result=(Compare-Object -ReferenceObject $ref -DifferenceObject $diff | Where-Object {$_.SideIndicator -eq "=>"} | Select-Object -ExpandProperty InputObject) -join ", "
If ($result)
{msg * "The following user was added to the Domain Admins Group: $result"}
A második figyelmeztető e-mailt küld.
$ref=(Get-ADGroupMember -Identity "Domain Admins").Name
Start-Sleep -Seconds 86398
$diff=(Get-ADGroupMember -Identity "Domain Admins").Name
$date=Get-Date -Format F
$result=(Compare-Object -ReferenceObject $ref -DifferenceObject $diff | Where-Object {$_.SideIndicator -eq "=>"} | Select-Object -ExpandProperty InputObject) -join ", "
If ($result)
{Send-MailMessage -From SecurityAlert@domain.com -To p.gruenauer@domain.com -SmtpServer EX01 -Subject "Domain Admin Membership Changes | $result was added to the Group" -Body "This alert was generated at $date" -Priority High}
Jegyezze meg az utolsó sort. Ezeket az értékeket ki kell töltenie. Győződjön meg arról, hogy a levelezőszerver elfogadja a számítógépéről érkező e-maileket.
A teszt
A teszteléshez leegyszerűsítettem a szkriptet, és csak 20 másodpercre alvó állapotba küldtem a PowerShellt. Ebben az időszakban gyorsan hozzáadok egy felhasználót a domain rendszergazdák csoportjához. Ez stresszes volt ?
Megint nálunk van!
Most mentse a szkriptet PowerShell-fájlként. (ps1)
Helyezze be egy ütemezett feladatba
Nem számít, melyik értesítést részesíti előnyben, az egészet egy ütemezett feladatba kell helyeznie, amely például 60 percenként fut. Nézze meg az argumentumot az első sorban (a szkript helye), a RepititionInterval-t a második sorban és a UserId-t a 4. sorban. Módosítania kell ezeket az értékeket, különösen a UserId-t.
$Action=New-ScheduledTaskAction -Execute "powershell" -Argument "C:\Alerts\domain_admins.ps1"
$Trigger=New-ScheduledTaskTrigger -Once -At (Get-Date) -RepetitionInterval (New-TimeSpan -Seconds 86400) -RepetitionDuration ([timespan]::MaxValue)
$Set=New-ScheduledTaskSettingsSet
$Principal=New-ScheduledTaskPrincipal -UserId "sid-500\administrator" -LogonType S4U
$Task=New-ScheduledTask -Action $Action -Trigger $Trigger -Settings $Set -Principal $Principal
Register-ScheduledTask -TaskName "Domain Admins Check" -InputObject $Task -Force
Hozzon létre egy szkriptet egy alapvonal alapján
A fenti módszer hátránya, hogy napi 2 másodperces időintervallumunk van.
Ha az adminisztrátori csoporttagság nagyon ritkán változik, javaslom egy alapvonal létrehozását. Először mentse az alapvonalat egy fájlba.
(Get-ADGroupMember -Identity "Domain Admins").Name | Out-File C:\Temp\Admins.txt Ezután hozzon létre egy szkriptet, amely összehasonlítja a csoporttagságot az Ön alapértékével.
$base=Get-Content C:\Temp\Admins.txt
$diff=(Get-ADGroupMember -Identity "Domain Admins").Name
$result=(Compare-Object -ReferenceObject $base -DifferenceObject $diff | Where-Object {$_.SideIndicator -eq "=>"} | Select-Object -ExpandProperty InputObject) -join ", "
If ($result)
{msg * "The following user was added to the Domain Admins Group: $result"}
Most helyezze el ezt a szkriptet egy ütemezett feladatba, és futtassa, amikor csak akarja.
Alkalmazkodás
Egy további ötlet két ütemezett feladat létrehozása lenne. (Az egyik a referencia, a második a különbségek miatt). Egy másik lehetőség a naplózás konfigurálása az eseménynapló-előfizetésekkel kombinálva.
Mindenesetre: Használja ki a fent bemutatott ötleteket, és alkalmazza azokat.







