Netz-Weise Logo

Weisheiten - der Netz-Weise Blog

Hier finden Sie Tipps und Tricks für vor, während und nach der Schulung.
3 Minuten Lesezeit (578 Worte)

Inaktive Benutzer oder Computer mit Powershell finden und deaktivieren

Das Cmdlet Search-ADAccount ist das Schweizer Messer des AD-Administrators. Es zeigt gesperrte Konten genauso an wie deaktiviert Konten, ablaufende Konten und Konten, deren Kennwort niemals abläuft. Der vielleicht hilfreichste Parameter ist aber -AccountInactive, der Konten anzeigt, die sich schon lange nicht mehr in der Domäne angemeldet haben. Grundsätzlich kann man dieses auch mit Get-ADUser und Get-ADComputer lösen, aber das ist aufwändiger und außerdem muß man auch darauf achten, welches AD-Attribut man auswertet, denn es gibt mehrere Eigenschaften, die die letzte Anmeldung speichern, aber nicht alle sind gleich gut geeignet. Eine gute Auflistung der Attribute und deren Unterschiede finden Sie im Technet-Wiki

Um inaktive Konten anzuzeigen, nutzen Sie einfach

Search-ADAccount -AccountInactive

Der Parameter findet sowohl Benutzer- als auch Computerkonten, die sich seit 60 Tagen nicht mehr angemeldet haben. Wenn Sie nur Benutzer suchen, verwenden Sie den Parameter -Usersonly, wenn Sie die Zeitspanne angeben wollen, benutzen Sie den Parameter Timespan, gefolgt von den Tagen seit dem letzten Login:

Search-ADAccount -AccountInactive -TimeSpan 90 -UsersOnly

Um das ganze praktisch problemlos einsetzen zu können, habe ich eine kleine Funktion gebastelt, die alle inaktiven Konten deaktiviert, in eine eigene OU verschiebt, und das Beschreibungsfeld des Kontos verwendet, um den Ursprungsort und das Datum des Verschiebens zu dokumentieren. So können Sie alte Konten sicher deaktivieren und archivieren, ohne den Kollegen mitsamt seinem PC aus Ihrem AD zu entfernen, der sich gerade im Sabbatjahr oder in Elternzeit befindet. Die verschobenen Konten werden in einer csv-Datei protokolliert. 

Function Move-InactiveAccounts
{
  <#
      .SYNOPSIS
      Finds inactive Accounts, comments and disables them and moves them into an OU for disabled Accounts
      .DESCRIPTION
      This Function uses Search-ADAccount to find inactive Accounts. It moves inactive Accounts to a special
      OU, disables them and comments the day and the original OU in the comment-Field of the Account.
      All moved accounts are documented in a csv-File for reference. The system-Accounts guest,krbtgt and Default Account
      are not touched.
      .PARAMETER TargetOU
      The OU where disabled accounts are moved to
      .PARAMETER logFilePath
      The CSV-File which is created to document which accounts where touched.
      .PARAMETER AccountsToIgnore
      Add Additional Accounts which shall be ignored beside the system-accounts
      .PARAMETER AccountType
      User,Computer or all defines which accounts shall be examined.
      .EXAMPLE
      Move-InactiveAccounts -TargetOU "OU=Inactive,DC=netz-weise,dc=de" -logFilePath c:\log\disabledUsers.csv -AccountsToIgnore 'admin' -AccountType User
      Describe what this call does
      .NOTES
      Author: Holger Voge
      Website: www.Netz-Weise-it.Training
      Date: 23.04.2017
      Version: 1.0
  #>

  param
  (
    [String]
    [Parameter(Mandatory)]
    [string]
    $TargetOU = 'DisabledAccounts',
    [string]
    [Parameter()]
    [string]$logFilePath = "$env:temp\DisabledUsers.csv",
    [string[]]$AccountsToIgnore,
    [ValidateSet("User","Computer","All")]
    [string]$AccountType = "user",
   
    [int]$InactivityDays = 90
  )
  $domainDN = (Get-ADDomain).DistinguishedName
  $TargetOUDN = "OU=$TargetOU,$domainDN"
  $ExcludeAccounts = 'Krbtgt','guest','DefaultAccount','administrator',$AccountsToIgnore
  Try {
    $Null = Get-ADOrganizationalUnit -Identity $TargetOUDN
  }
  Catch [Microsoft.ActiveDirectory.Management.ADIdentityResolutionException] {
    Return "Die übergebene OU existiert nicht"
  }
  [array]$InactiveAccountList = Search-ADAccount -AccountInactive |
    Where-Object { ( $_.Name -notin $ExcludeAccounts ) -and ( $_.DistinguishedName -notlike "*$TargetOUDN" ) }
  foreach ( $InactiveAccount in $InactiveAccountList )
  {
    $description = ( Get-ADObject -Identity $InactiveAccount.DistinguishedName -Properties Description ).description
    $description = "{0}`nOrigin: {1}`nMoveDate: {2}" -f $description,$InactiveAccount.DistinguishedName,(get-date -Format yyyy-MM-dd)
    Set-ADObject -Identity $InactiveAccount.DistinguishedName -Description $description
    Disable-ADAccount -Identity $InactiveAccount -PassThru | Move-ADObject -TargetPath $TargetOUDN
    $InactiveAccount | Select-Object name,distinguishedName,LastLogonDate,Description,@{ name="Movedate";expression={get-date -Format "yyyy-MM-dd hh-mm-ss"}} |
      export-CSV -Path $logFilePath -UseCulture -Encoding UTF8 -NoTypeInformation -Append
  }
  "Die Protokolldatei wurde unter $logFilePath gespeichert"
}
Sichere Kennwörter in Powershell generieren, jetzt...
Einen Secure String oder ein PSCredential-Objekt w...

Ähnliche Beiträge

 

Kommentare

Derzeit gibt es keine Kommentare. Schreibe den ersten Kommentar!
Bereits registriert? Hier einloggen
Sonntag, 19. Mai 2024

Sicherheitscode (Captcha)