Auditar cuentas del Active Directory

El script tiene como objetivo auditar cuentas de usuario en un dominio de Active Directory (AD), identificando:

Los resultados se muestran en una interfaz gráfica con un DataGridView y se pueden exportar a un archivo CSV.


Estructura del Script

1. Importación de Bibliotecas

Importa las bibliotecas necesarias para crear la interfaz gráfica.

                    
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
                    
                    
¡Copiado!

Detalles:

  • System.Windows.Forms: Proporciona los controles de la interfaz gráfica (ventanas, botones, cuadros de texto, etc.).
  • System.Drawing: Permite manipular colores, fuentes y otros elementos visuales.

2. Creación de la Ventana Principal

Crea la ventana principal de la aplicación.

                    
$form = New-Object System.Windows.Forms.Form
$form.Text = "Auditoría de Active Directory"
$form.Size = New-Object System.Drawing.Size(1000, 600)
$form.StartPosition = "CenterScreen"
                    
                    
¡Copiado!

Detalles:

  • Título: "Auditoría de Active Directory"
  • Tamaño: 1000x600 píxeles
  • Posición: Centrada en la pantalla

3. Creación del DataGridView

Muestra los resultados de la auditoría en una tabla.

                    
$dataGridView = New-Object System.Windows.Forms.DataGridView
$dataGridView.Size = New-Object System.Drawing.Size(950, 400)
$dataGridView.Location = New-Object System.Drawing.Point(20, 150)
$dataGridView.AutoSizeColumnsMode = [System.Windows.Forms.DataGridViewAutoSizeColumnsMode]::Fill
$dataGridView.SelectionMode = [System.Windows.Forms.DataGridViewSelectionMode]::FullRowSelect
$dataGridView.ReadOnly = $true
$form.Controls.Add($dataGridView)
                    
                    
¡Copiado!

Detalles:

  • Tamaño: 950x400 píxeles
  • Ubicación: 20 píxeles desde el borde izquierdo y 150 píxeles desde el borde superior
  • Modo de selección: Selección de filas completas
  • Solo lectura: Los usuarios no pueden modificar los datos

4. Campo para Ingresar los Días de Inactividad

Permite al usuario ingresar el número de días de inactividad para filtrar las cuentas.

$labelDias = New-Object System.Windows.Forms.Label
$labelDias.Text = "Días de inactividad:"
$labelDias.Location = New-Object System.Drawing.Point(20, 20)
$labelDias.AutoSize = $true
$form.Controls.Add($labelDias)

$textBoxDias = New-Object System.Windows.Forms.TextBox
$textBoxDias.Location = New-Object System.Drawing.Point(150, 20)
$textBoxDias.Size = New-Object System.Drawing.Size(100, 20)
$form.Controls.Add($textBoxDias)
¡Copiado!

5. Botón para Ejecutar la Auditoría

Ejecuta la auditoría cuando el usuario hace clic en él.

$buttonAuditar = New-Object System.Windows.Forms.Button
$buttonAuditar.Text = "Ejecutar Auditoría"
$buttonAuditar.Location = New-Object System.Drawing.Point(270, 20)
$buttonAuditar.Size = New-Object System.Drawing.Size(120, 30)
$buttonAuditar.Add_Click({
    # Lógica de la auditoría
})
$form.Controls.Add($buttonAuditar)
¡Copiado!

6. Lógica de la Auditoría

Filtra y muestra las cuentas inactivas en el DataGridView.

# Limpiar el DataGridView
$dataGridView.Rows.Clear()

# Obtener los días de inactividad ingresados por el usuario
$diasInactividad = [int]$textBoxDias.Text

# Obtener las cuentas inactivas
$inactiveUsers = Get-ADUser -Filter * -Properties SamAccountName, Enabled, PasswordNeverExpires, PasswordLastSet, LastLogonDate, MemberOf | 
    Where-Object { 
        ($_.LastLogonDate -lt (Get-Date).AddDays(-$diasInactividad)) -or 
        ($_.LastLogonDate -eq $null)
    }

# Contador de usuarios
$contadorUsuarios = 0

foreach ($user in $inactiveUsers) {
    # Obtener los grupos a los que pertenece el usuario
    $grupos = ($user.MemberOf | ForEach-Object { (Get-ADGroup $_).Name }) -join ", "

    # Determinar si la cuenta nunca ha sido usada
    $nuncaUsada = ($user.LastLogonDate -eq $null)

    # Agregar una fila al DataGridView
    $dataGridView.Rows.Add(
        $user.SamAccountName,
        $user.Enabled,
        $user.PasswordNeverExpires,
        $user.PasswordLastSet,
        $user.LastLogonDate,
        $nuncaUsada,
        $grupos
    )

    # Incrementar el contador
    $contadorUsuarios++
}

# Actualizar la label con la cantidad de usuarios
$labelCantidadUsuarios.Text = "Usuarios listados: $contadorUsuarios"
¡Copiado!

7. Botón para Exportar los Resultados

Exporta los resultados a un archivo CSV cuando el usuario hace clic en él.

$buttonExportar = New-Object System.Windows.Forms.Button
$buttonExportar.Text = "Exportar a CSV"
$buttonExportar.Location = New-Object System.Drawing.Point(400, 20)
$buttonExportar.Size = New-Object System.Drawing.Size(120, 30)
$buttonExportar.Add_Click({
    # Lógica de exportación
})
$form.Controls.Add($buttonExportar)
¡Copiado!

8. Lógica de Exportación

Exporta los resultados del DataGridView a un archivo CSV.

# Crear un diálogo para guardar el archivo
$saveFileDialog = New-Object System.Windows.Forms.SaveFileDialog
$saveFileDialog.Filter = "Archivos CSV (*.csv)|*.csv"
$saveFileDialog.Title = "Guardar resultados de auditoría"
$saveFileDialog.ShowDialog() | Out-Null

if ($saveFileDialog.FileName -ne "") {
    # Crear una lista para almacenar los resultados
    $results = @()

    # Recorrer las filas del DataGridView
    foreach ($row in $dataGridView.Rows) {
        $results += [PSCustomObject]@{
            Nombre                = $row.Cells[0].Value
            Habilitado            = $row.Cells[1].Value
            ContraseñaNuncaExpira = $row.Cells[2].Value
            UltimoCambioContraseña = $row.Cells[3].Value
            UltimoInicioSesion    = $row.Cells[4].Value
            NuncaUsada            = $row.Cells[5].Value
            Grupos                = $row.Cells[6].Value
        }
    }

    # Exportar a CSV
    $results | Export-Csv -Path $saveFileDialog.FileName -NoTypeInformation -Encoding UTF8
    [System.Windows.Forms.MessageBox]::Show("Archivo exportado exitosamente.", "Exportación Completada", "OK", "Information")
}
¡Copiado!

9. Label para Mostrar la Cantidad de Usuarios

Muestra la cantidad de usuarios listados en el DataGridView.

$labelCantidadUsuarios = New-Object System.Windows.Forms.Label
$labelCantidadUsuarios.Text = "Usuarios listados: 0"
$labelCantidadUsuarios.Location = New-Object System.Drawing.Point(20, 120)
$labelCantidadUsuarios.AutoSize = $true
$form.Controls.Add($labelCantidadUsuarios)
¡Copiado!

10. Configuración de las Columnas del DataGridView

Define las columnas del DataGridView.

$dataGridView.Columns.Add("Nombre", "Nombre")
$dataGridView.Columns.Add("Habilitado", "Habilitado")
$dataGridView.Columns.Add("ContraseñaNuncaExpira", "Contraseña Nunca Expira")
$dataGridView.Columns.Add("UltimoCambioContraseña", "Último Cambio de Contraseña")
$dataGridView.Columns.Add("UltimoInicioSesion", "Último Inicio de Sesión")
$dataGridView.Columns.Add("NuncaUsada", "Nunca Usada")
$dataGridView.Columns.Add("Grupos", "Grupos")
¡Copiado!

11. Mostrar la Ventana

Muestra la ventana principal y espera a que el usuario interactúe con ella.

$form.ShowDialog()
¡Copiado!

Script Completo

                
  <#
  Creado por Vladimir Campos
  El script tiene como objetivo auditar cuentas de usuario en un dominio de Active Directory (AD), identificando:
  *Cuentas inactivas (que no han iniciado sesión en más de un número específico de días).
  *Cuentas que nunca han sido usadas (LastLogonDate = $null).
  *Información adicional como el estado de la cuenta, la política de contraseñas, los grupos a los que pertenece el usuario, etc.
  Los resultados se muestran en una interfaz gráfica con un DataGridView y se pueden exportar a un archivo CSV.
  #>
  
  # Importar bibliotecas necesarias
  Add-Type -AssemblyName System.Windows.Forms
  Add-Type -AssemblyName System.Drawing
  
  # Cargar una imagen en Base64 (opcional)
  $LPNG = "iVBORw0KGgoAAAANSUhEUgAAAMgAAAAuCAYAAABtRVYBAAAACXBIWXMAAAsTAAALEwEAmpwYAAAGq2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgNzkuYTg3MzFiOSwgMjAyMS8wOS8wOS0wMDozNzozOCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6ODIxNzExM2UtNmZjNS0zNjQyLWIzMDctOGEzNDM3ZmY2NWRkIiB4bXBNTTpEb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6Mzk4YTY5ZDMtYzljYS0zYzRhLWE4YTctZjhmYmM2MmYxOWU0IiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjEzNDk3YzZlLWVjNTgtMzM0YS1hZWY2LWFhMWFlODRjNGE0YiIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjMuMCAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDI0LTExLTIwVDEzOjU2OjExLTA2OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyNC0xMS0yMFQxNzo1MTo0My0wNjowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAyNC0xMS0yMFQxNzo1MTo0My0wNjowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo4MjE3MTEzZS02ZmM1LTM2NDItYjMwNy04YTM0MzdmZjY1ZGQiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6ODIxNzExM2UtNmZjNS0zNjQyLWIzMDctOGEzNDM3ZmY2NWRkIi8+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjQ4OTAyZGY4LTNjNzQtNzc0MC05YjM1LTBjYjkyODRjYTgyMCIgc3RFdnQ6d2hlbj0iMjAyNC0xMS0yMFQxNzo0NzoyMi0wNjowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIzLjAgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDoxMzQ5N2M2ZS1lYzU4LTMzNGEtYWVmNi1hYTFhZTg0YzRhNGIiIHN0RXZ0OndoZW49IjIwMjQtMTEtMjBUMTc6NTE6NDMtMDY6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMy4wIChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz55i9rdAAAuNUlEQVR4nO2deXyU1fnovzOTmclkZ0IC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"
  $lenbytes = [Convert]::FromBase64String($LPNG)
  $lenmemoria = New-Object System.IO.MemoryStream
  $lenmemoria.Write($lenbytes, 0, $lenbytes.Length)
  $lenmemoria.Position = 0
  $imagenl = [System.Drawing.Image]::FromStream($lenmemoria, $true)
  
  # Definir colores y estilos
  $colorPrimario = [System.Drawing.Color]::FromArgb(0, 120, 212)     # Azul moderno
  $colorSecundario = [System.Drawing.Color]::FromArgb(243, 243, 243) # Gris claro
  $colorTexto = [System.Drawing.Color]::FromArgb(51, 51, 51)        # Gris oscuro
  $colorFondo = [System.Drawing.Color]::White
  $fuenteModerna = New-Object System.Drawing.Font("Segoe UI", 9, [System.Drawing.FontStyle]::Regular)
  $fuenteTitulo = New-Object System.Drawing.Font("Segoe UI", 12, [System.Drawing.FontStyle]::Regular)
  
  # Función para estilizar botones
  function Set-ButtonStyle {
      param($button)
      $button.FlatStyle = [System.Windows.Forms.FlatStyle]::Flat
      $button.FlatAppearance.BorderSize = 0
      $button.BackColor = $colorPrimario
      $button.ForeColor = [System.Drawing.Color]::White
      $button.Font = $fuenteModerna
      $button.Cursor = [System.Windows.Forms.Cursors]::Hand
      $button.FlatAppearance.MouseOverBackColor = [System.Drawing.Color]::FromArgb(0, 99, 177)
      $button.Padding = New-Object System.Windows.Forms.Padding(5)
  }
  
  # Función para estilizar TextBox
  function Set-TextBoxStyle {
      param($textbox)
      $textbox.Font = $fuenteModerna
      $textbox.BorderStyle = [System.Windows.Forms.BorderStyle]::FixedSingle
      $textbox.BackColor = $colorSecundario
      $textbox.ForeColor = $colorTexto
  }
  
  # Función para estilizar Label
  function Set-LabelStyle {
      param($label)
      $label.Font = $fuenteModerna
      $label.ForeColor = $colorTexto
  }
  
  # Crear la ventana principal
  $form = New-Object System.Windows.Forms.Form
  $form.Text = "Auditoría de Active Directory"
  $form.Size = New-Object System.Drawing.Size(1200, 600)
  $form.StartPosition = "CenterScreen"
  $form.BackColor = $colorSecundario
  $form.Font = $fuenteModerna
  
  # Agregar una imagen en la parte superior
  $pictureBox = New-Object System.Windows.Forms.PictureBox
  $pictureBox.Size = New-Object System.Drawing.Size(200, 40)
  $pictureBox.Location = New-Object System.Drawing.Point(10, 5)
  $pictureBox.Image = $imagenl
  $form.Controls.Add($pictureBox)
  
  # Crear un DataGridView para mostrar los resultados
  $dataGridView = New-Object System.Windows.Forms.DataGridView
  $dataGridView.Size = New-Object System.Drawing.Size(1150, 400)
  $dataGridView.Location = New-Object System.Drawing.Point(20, 150)
  #$dataGridView.AutoSizeColumnsMode = [System.Windows.Forms.DataGridViewAutoSizeColumnsMode]::Fill
  $dataGridView.SelectionMode = [System.Windows.Forms.DataGridViewSelectionMode]::FullRowSelect
  $dataGridView.ReadOnly = $true
  $form.Controls.Add($dataGridView)
  
  # Crear un campo para ingresar los días de inactividad
  $labelDias = New-Object System.Windows.Forms.Label
  $labelDias.Text = "Días de inactividad:"
  $labelDias.Location = New-Object System.Drawing.Point(20, 60)
  $labelDias.AutoSize = $true
  Set-LabelStyle $labelDias
  $form.Controls.Add($labelDias)
  
  $textBoxDias = New-Object System.Windows.Forms.TextBox
  $textBoxDias.Location = New-Object System.Drawing.Point(160, 60)
  $textBoxDias.Size = New-Object System.Drawing.Size(80, 20)
  Set-TextBoxStyle $textBoxDias
  $form.Controls.Add($textBoxDias)
  
  # Crear un botón para ejecutar la auditoría
  $buttonAuditar = New-Object System.Windows.Forms.Button
  $buttonAuditar.Text = "Ejecutar Auditoría"
  $buttonAuditar.Location = New-Object System.Drawing.Point(270, 60)
  $buttonAuditar.Size = New-Object System.Drawing.Size(150, 30)
  Set-ButtonStyle $buttonAuditar
  $buttonAuditar.Add_Click({
      # Limpiar el DataGridView
      $dataGridView.Rows.Clear()

      # Obtener los días de inactividad ingresados por el usuario
      $diasInactividad = [int]$textBoxDias.Text

      # Obtener las cuentas inactivas (último inicio de sesión hace más de X días o nunca)
      $inactiveUsers = Get-ADUser -Filter * -Properties SamAccountName, Enabled, PasswordNeverExpires, 
      PasswordLastSet, LastLogonDate, MemberOf | 
          Where-Object { 
              ($_.LastLogonDate -lt (Get-Date).AddDays(-$diasInactividad)) -or 
              ($_.LastLogonDate -eq $null)
          }

      # Contador de usuarios
      $contadorUsuarios = 0

      foreach ($user in $inactiveUsers) {
          # Obtener los grupos a los que pertenece el usuario
          $grupos = ($user.MemberOf | ForEach-Object { (Get-ADGroup $_).Name }) -join ", "

          # Determinar si la cuenta nunca ha sido usada
          $nuncaUsada = ($user.LastLogonDate -eq $null)

          # Agregar una fila al DataGridView
          $dataGridView.Rows.Add(
              $user.SamAccountName,
              $user.Enabled,
              $user.PasswordNeverExpires,
              $user.PasswordLastSet,
              $user.LastLogonDate,
              $nuncaUsada,
              $grupos  # La columna "Grupos" ahora está al final
          )

          # Incrementar el contador
          $contadorUsuarios++
      }

      # Actualizar la label con la cantidad de usuarios
      $labelCantidadUsuarios.Text = "Usuarios listados: $contadorUsuarios"
  })
  $form.Controls.Add($buttonAuditar)
  
  # Crear un botón para exportar los resultados
  $buttonExportar = New-Object System.Windows.Forms.Button
  $buttonExportar.Text = "Exportar a CSV"
  $buttonExportar.Location = New-Object System.Drawing.Point(440, 60)
  $buttonExportar.Size = New-Object System.Drawing.Size(150, 30)
  Set-ButtonStyle $buttonExportar
  $buttonExportar.Add_Click({
      # Crear un diálogo para guardar el archivo
      $saveFileDialog = New-Object System.Windows.Forms.SaveFileDialog
      $saveFileDialog.Filter = "Archivos CSV (*.csv)|*.csv"
      $saveFileDialog.Title = "Guardar resultados de auditoría"
      $saveFileDialog.ShowDialog() | Out-Null
  
      if ($saveFileDialog.FileName -ne "") {
          # Crear una lista para almacenar los resultados
          $results = @()
  
          # Recorrer las filas del DataGridView
          foreach ($row in $dataGridView.Rows) {
              $results += [PSCustomObject]@{
                  Nombre                = $row.Cells[0].Value
                  Habilitado            = $row.Cells[1].Value
                  ContraseñaNuncaExpira = $row.Cells[2].Value
                  UltimoCambioContraseña = $row.Cells[3].Value
                  UltimoInicioSesion    = $row.Cells[4].Value
                  NuncaUsada            = $row.Cells[5].Value
                  Grupos                = $row.Cells[6].Value
              }
          }
  
          # Exportar a CSV
          $results | Export-Csv -Path $saveFileDialog.FileName -NoTypeInformation -Encoding UTF8
          [System.Windows.Forms.MessageBox]::Show("Archivo exportado exitosamente.", "Exportación Completada", "OK", "Information")
      }
  })
  $form.Controls.Add($buttonExportar)
  
  # Crear una label para mostrar la cantidad de usuarios listados
  $labelCantidadUsuarios = New-Object System.Windows.Forms.Label
  $labelCantidadUsuarios.Text = "Usuarios listados: 0"
  $labelCantidadUsuarios.Location = New-Object System.Drawing.Point(20, 120)
  $labelCantidadUsuarios.AutoSize = $true
  $form.Controls.Add($labelCantidadUsuarios)
  
  # Configurar las columnas del DataGridView
  $dataGridView.Columns.Add("Nombre", "Nombre")
  $dataGridView.Columns.Add("Habilitado", "Habilitado")
  $dataGridView.Columns.Add("ContraseñaNuncaExpira", "Contraseña Nunca Expira")
  $dataGridView.Columns.Add("UltimoCambioContraseña", "Último Cambio de Contraseña")
  $dataGridView.Columns.Add("UltimoInicioSesion", "Último Inicio de Sesión")
  $dataGridView.Columns.Add("NuncaUsada", "Nunca Usada")
  $dataGridView.Columns.Add("Grupos", "Grupos")  # La columna "Grupos" ahora está al final
  $DataGridView.Columns[0].Width = 110
  $DataGridView.Columns[1].Width = 100
  $DataGridView.Columns[2].Width = 160
  $DataGridView.Columns[3].Width = 210
  $DataGridView.Columns[4].Width = 180
  $dataGridView.Columns[5].Width = 110
  $dataGridView.Columns[6].AutoSizeMode = "AllCells"
  # Mostrar la ventana
  $form.ShowDialog() 
            
                    
                    
¡Copiado!