Búsqueda de sitios web

PowerShell: Notificarme cuando se agregue alguien al grupo de administradores


¿Se le notificará cuando haya cambios en las membresías del grupo? ¿No? Particularmente interesantes son las membresías en grupos. Sobre todo si se trata del grupo de administradores de dominio. El siguiente artículo muestra cómo reconocer los cambios y luego verificarlos a intervalos regulares. Se debe notificar al administrador de cualquier cambio. Esto se puede hacer por mensaje o correo electrónico. En lugar de configurar Políticas de auditoría, hacemos todo en PowerShell y luego colocamos nuestro script en una tarea programada.

La meta

Queremos lograr lo siguiente.

Si hay cambios de membresía en el grupo de administradores de dominio, notifíqueme por correo electrónico, mensaje o lo que sea. Podría verse así:

O esto:

Introducción

Primero tenemos que recuperar a todos los miembros del grupo de administración de dominio.

Get-ADGroupMember -Identity "Domain Admins").Name

Alternativamente, podríamos guardarlo en un archivo Admins.txt:

(Get-ADGroupMember -Identity "Domain Admins").Name | Out-File C:\Temp\Admins.txt

Ahora agrego un nuevo usuario al grupo. Su nombre es Arnold Schwarzenberg. Las similitudes con personajes famosos son pura coincidencia. ?

Luego guardo el resultado en otro archivo Admins2.txt

(Get-ADGroupMember -Identity "Domain Admins").Name | Out-File C:\Temp\Admins2.txt

Ahora echemos un vistazo a ambos archivos.

Nuestro siguiente paso es comparar el contenido de ambos archivos. Para hacer eso uso Compare-Object.

$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

Bien. ¡Lo tenemos!

Otro método consiste en guardar los miembros del grupo en una variable. Esta es mi forma preferida. No me gustan esos archivos de texto ?

$ref=(Get-ADGroupMember -Identity "Domain Admins").Name
$diff=(Get-ADGroupMember -Identity "Domain Admins").Name

Cree un script para comparar la membresía de forma regular una vez al día

Abra PowerShell ISE. Juntémoslo todo en un guión. El primer script inicia un mensaje en el escritorio del administrador. Comprueba a los miembros y luego espera aproximadamente una hora. Luego, el script vuelve a comprobar y compara el resultado. Ahora usamos el Indicador lateral. Este indicador podría resultar útil si solo desea consultar cambios de valores en una dirección. Los valores válidos son => y <=

$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"}

El segundo envía un correo electrónico de alerta.

$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}

Tenga en cuenta la última línea. Debes completar estos valores. Asegúrese de que su servidor de correo acepte correos electrónicos desde su computadora.

La prueba

Para las pruebas, simplifiqué el script y puse PowerShell en modo de suspensión durante solo 20 segundos. En este período agrego rápidamente un usuario al grupo de administradores del dominio. Eso fue estresante ?

¡Lo tenemos de nuevo!

Ahora guarde su script como archivo PowerShell. (ps1)

Ponlo en una tarea programada

No importa qué notificación prefieras, debes ponerla toda en una tarea programada que se ejecutará cada 60 minutos, por ejemplo. Mire el argumento en la primera línea (ubicación de su secuencia de comandos), el intervalo de repetición en la segunda línea y el ID de usuario en la cuarta línea. Tienes que modificar estos valores, especialmente el UserId.

$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

Crear un script basado en una línea base

La desventaja del método anterior es que tenemos un intervalo de tiempo de 2 segundos por día.

Si la membresía del grupo de administradores cambia muy raramente, recomiendo crear una línea de base. Primero guarde su línea base en un archivo.

 (Get-ADGroupMember -Identity "Domain Admins").Name | Out-File C:\Temp\Admins.txt 

Luego cree un script que compare la membresía del grupo con su línea de base.

$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"}

Ahora coloque este script en una tarea programada y ejecútelo tantas veces como desee.

Adaptación

Otra idea sería crear dos tareas programadas. (Uno para la referencia, el segundo para las diferencias). Otra posibilidad sería configurar el registro de auditoría en combinación con suscripciones al registro de eventos.

De todos modos: aprovecha la oportunidad de utilizar las ideas mostradas arriba y adáptalas.

Artículos relacionados