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'