Inaktive Benutzer im Active Directory finden

Es ist in größeren und kleineren Unternehmen üblich, dass Benutzeraccounts die seit einiger Zeit nicht mehr genutzt wurden, zu deaktivieren. Das hat zum einen praktische Gründe, aber auch einen sicherheitsrelevanten Aspekt. Heute stelle ich ein Script vor, dass alle (noch nicht deaktivierten) Benutzeraccounts auflistet und per E-Mail verschickt, die seit 90 Tagen kein Login mehr gemacht haben.

Schritt 1:

Import-Module ActiveDirectory

Ohne das PowerShell-Modul kann unser Script nicht funktionieren. Hierfür müssen übrigens zwingend die RSAT-Tools auf dem ausführenden Rechner installiert sein.

Schritt 2:
Als nächstes folgt die eigenliche function, welche die ganze Magie beinhaltet. Ich habe die wichtigen Teile des Codes kommentiert, so dass er leicht zu verstehen sein sollte.

function Report-UnusedADAccounts() { 
 
    # E-Mail settings
    $domainName = (Get-ADDomain -Current LocalComputer).NetBIOSName
    $emailReceipes = @("receip1@company.org", "receip2@company.org")
    $emailSender = "sender@company.org"
    $smtpServer = "emailserver.company.local"
    $smtpPort = 25
 
    # Go through each domain controller and retreive the required user information
    $allUsers = @() # Array for the users
    (Get-ADDomain).ReplicaDirectoryServers | Sort-Object | ForEach-Object { 
 
        $DC = $_ 
        $allUsers += Get-ADUser -Server $_ -Filter "samaccountname -like '*'" -Properties LastLogon | Select-Object samaccountname,Name,enabled,lastlogon,@{n='DC';e={$DC}}
 
    } 
     
    $sortedUsers = @() # Array for the sorted list
    # We are now grouping each samaccountname, sorting for the "lastlogon" property in descanding order
    # and only taking the very first result (index 0). This is then the most recent login date of that user.
    # That user goes into the new array. Then we continue with the next samaccountname
    $allUsers | Group-Object -Property samaccountname | ForEach-Object { 
        $sortedUsers += ($_.Group | Sort-Object -prop lastlogon -Descending)[0] 
    } 
    
    # If we want to exclude certain accounts from the report, we put the samaccountnames into a 'Ignore-UnusedUserAccounts.txt' file.
    $exclusionList = Get-Content "$PSScriptRoot\Ignore-UnusedUserAccounts.txt"

    # This is the actual filter. We select users which:
    # - LastLogonDate is greater than 3 months ago -> Where-Object lastlogondatetime -le ((Get-Date).AddMonths(-3))
    #   (don't get confused with the -le comparison!)
    # - User account is still enabled in Active Directory -> Where-Object enabled -eq $True
    # - User is not part of the exclusion list -> Where-Object -FilterScript {$exclusionList -NotContains $_.samaccountname}
    $filteredUsers = $sortedUsers | Select-Object samaccountname,Name,Enabled,@{n='lastlogondatetime';e={[datetime]::FromFileTime($_.lastlogon)}} | Where-Object lastlogondatetime -le ((Get-Date).AddMonths(-3)) | Where-Object enabled -eq $True | Where-Object -FilterScript {$exclusionList -NotContains $_.samaccountname}

    # If the amount of filtered users is greater than 0, we convert the list to HTML code and put it into the body of an email message and send it.
    if($filteredUsers.Count -gt 0) {
        $userCount = $filteredUsers.Count
        $filteredUsers = $filteredUsers | ConvertTo-Html
        Send-MailMessage -From $emailSender -To $emailReceipes -Subject "Unused AD accounts $($domainName)" -Body "<h2>Unused AD accounts $($domainName) - $(Get-Date)</h2><p>$($userCount) unused acccounts found.</p><p>$(Out-String -InputObject $filteredUsers)</p>" -BodyAsHtml  -SmtpServer $smtpServer -Port $smtpPort
    }
}

Schritt 3:
Und ganz zum Schluss muss die function noch ausgeführt werden.

Report-UnusedADAccounts

Das Ende vom Lied

Bei Scripts, die auf essentielle Funktionen/Informationen des Active Directory zugreifen müssen, bestehen natürlich gewisse Anforderungen.

  1. Wie Anfangs bereits erwähnt, müssen auf dem ausführenden Rechner die RSAT-Tools installiert sein, damit das Active Directory PowerShell module zur Verfügung steht.
  2. PowerShell muss mindestens in der Version 3 installiert sein.
  3. Der ausführende Benutzer benötigt die entsprechenden Rechte, um auf die Benutzer im Active Directory zugreifen zu können.
  4. Im Script-Verzeichnis muss die Datei “Ignore-UnusedUserAccounts.txt“ angelegt werden. Diese kann bei Bedarf auch leer sein, sollte aber zumindest existieren, damit PowerShell keine Fehlermeldung auswirft, wenn es mit Get-Content versucht den Inhalt auszulesen.
  5. Ein E-Mail-Server oder ein E-Mail-Relay-Server muss zur Verfügung stehen.

Ich habe mir für dieses Script einen scheduled Task eingerichtet, der einmal pro Woche ausgeführt wird. Somit bekomme ich wöchentliche einen Report über inaktive Accounts, die ich dann bei Bedarf deaktivieren kann. In der Textdatei für die Ausnahmen habe ich z.B. Service-Accounts drin.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert