Tipps

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

 704,    24  Apr  2017 ,   Tipp
Holger Voges

  E-Mail Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein!

Holger Voges ist Inhaber der Firma Netz-Weise IT-Training und seit 1999 als Trainer und Consultant tätig. Als Allrounder in den Bereichen Windows Server, Active Directory, SQL Server, Hyper-V und Windows PowerShell, hat er in der Vergangenheit zahlreiche Einsätze als Consultant in namenhaften Firmen absolviert und so neben der Theorie auch umfangreiche praktische Erfahrungen gesammelt.

 

Schnellkontakt

bitte Ihre E-Mail eintragen

Netz-Weise

Das Haupt-Tätigkeitsfeld von Netz-Weise sind Schulungen für Profis. Bei uns bekommen Sie das Programm für den fortgeschrittenen Praktiker, der die Tiefen des Systems ausloten möchte genauso wie Standard-Schulungen.

So erreichen Sie uns:

Netz-Weise
IT-Training und Beratung
Freundallee 13a
30173 Hannover
 
Tel: (0511) 165 925-0
Fax: (0511) 165 925-99
email: info(at)netz-weise.de
 

Newsletter bestellen

Das Wichtigste kompakt ins E-Mailfach!