Active Directory prüfen & aufräumen
Wie überall schadet es auch einem Active Directory nicht, wenn man es hin & wieder mal prüft und nicht mehr benötigte Dinge (bspw. alte Computer-Accounts oder Benutzeraccounts von ehem. Mitarbeitern) aufräumt.
Man kann dies manuell tun, was unter Umständen recht aufwändig ist oder per einfacher PowerShell-Befehle.
1. Accounts, …
Search-ADAccount -PasswordExpired | ft
Search-ADAccount –PasswordNeverExpires | Select Name, DistinguishedName | ft
Get-ADUser -filter {Enabled -eq $True -and PasswordNeverExpires -eq $False} –Properties "SamAccountName","msDS-UserPasswordExpiryTimeComputed" | Select-Object -Property "SamAccountName", @{Name="Password Expiry Date"; Expression={[datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed")}} | FT
Search-ADAccount -AccountDisabled | ft
Search-ADAccount -AccountExpired | ft
Search-ADAccount -AccountExpiring | ft
Search-ADAccount -AccountInactive | ft
Search-ADAccount -LockedOut | ft
Get-ADUser -LDAPFilter "(pwdLastSet=0)" | Select SamAccountName,distinguishedName | ft
Optional kann man die jeweiligen Ergebnisse auch in eine Datei schreiben lassen, bspw.:
| Out-File C:\TEMP\result.txt
Optimaler Weise nimmt man für jede der Abfragen eine separate Datei 😉
2. Welche (Kerberos-)Delegation sind gesetzt
$root = New-Object DirectoryServices.DirectoryEntry 'LDAP://dc=MyDomain,dc=demolab'
$searcher = New-Object DirectoryServices.DirectorySearcher
$searcher.SearchRoot = $root
$searcher.Filter = "(&(objectClass=user)(msDS-AllowedToDelegateTo=*))"
$searcher.PageSize = 1000
$searcher.propertiesToLoad.Add("DistinguishedName,name,sAMAccountName,sAMAccountType,msDS-AllowedToDelegateTo")
$DomainSPNs = $searcher.FindAll()
$myarray = New-Object System.Data.DataTable
$myarray.Columns.Add("DistinguishedName") | Out-Null
$myarray.Columns.Add("Name") | Out-Null
$myarray.Columns.Add("sAMAccountName") | Out-Null
$myarray.Columns.Add("sAMAccountType") | Out-Null
$myarray.Columns.Add("msDS-AllowedToDelegateTo") | Out-Null
Foreach($row in $DomainSPNs)
{
$row1=$row.GetDirectoryEntry()
$row3 = @($row1.Get("msDS-AllowedToDelegateTo"))
Foreach($row in $DomainSPNs)
{
$row1=$row.GetDirectoryEntry()
$row3 = @($row1.Get("msDS-AllowedToDelegateTo"))
Foreach($row2 in $row3)
{
$row = $myarray.NewRow()
$row.Item('DistinguishedName') = $row1.Get("DistinguishedName").ToString()
$row.Item('Name') = $row1.Get("name").ToString()
$row.Item('sAMAccountName') = $row1.Get("sAMAccountName").ToString()
Switch ($row1.Get("sAMAccountType").ToString())
{
805306369 {$row.Item('sAMAccountType') = "Computer"}
805306368 {$row.Item('sAMAccountType') = "User"}
}
$row.Item('msDS-AllowedToDelegateTo') = $row2.ToString()
$myarray.Rows.Add($row)
}
}
}
$myarray | FT
$connectionString = "Data Source=MySQLServer;Integrated Security=true;Initial Catalog=SPNDB;"
$bulkCopy = new-object ("Data.SqlClient.SqlBulkCopy") $connectionString
$bulkCopy.DestinationTableName = "Kerberos_Delegated_Insert"
$bulkCopy.WriteToServer($myarray)
Der Code oben ist etwas angepasst und ein Klammerfehler behoben. Quelle: Creating a Kerberos Delegation Table for SQL Server Access (mssqltips.com)
SELECT
[PrimaryKey]
, [DN]
, [cn]
, [sAMAccountName]
, [sAMAccountType]
, [DelegatedSPN]
, [Daterun]
FROM
[SPNDB].[dbo].[Kerberos_Delegated_History]
WHERE
[Daterun] >= '2014-02-10 12:58:36.707'
AND [sAMAccountType] = 'User'
Hallo Herr Böttcher,
danke für diesen Artikel. Er beschreibt sehr gut, welche Maßnahmen regelmäßig gemacht werden sollten um Ordnung zu halten.
Ich möchte Ihren Blick gern mal auf einen weiterführenden Aspekt lenken und dazu eine Feedback von Ihnen als Spezialisten haben.
Ich habe von 2 Jahren ein Problem im Bereich AD identifiziert, dass unmittelbar mit der Unordnung im AD zu tun hat.
Gruppen werden erstellt, verschachtelt, schlecht oder gar nicht dokumentiert und niemals aufgeräumt. Das führt dazu, dass das AD eher einem Teller Spaghetti gleicht, und nicht zur Verwaltung von Sicherheitseinstellungen geeignet ist.
Ich habe mich mit meinem Produkt migRaven darauf spezialisiert solche Strukturen zu visualisieren und auch direkt Prozesse anzubieten, um aufräumen zu können. Denken Sie, dass es dafür einen Bedarf gibt?
Ich habe festgestellt, dass bis zu 50% der Gruppen und der Verschachtelungen überflüssig und redundant sind, und aufgeräumt gehören. Ich möchte mit migRaven eine Lösung vorstellen dieses zu identifizieren und in gut strukturierten Prozessen aufräumen zu können.
Ich freue mich auf Ihr Feedback!
Viele Grüße, Thomas Gomell