Die SID, der sogenannte Security Identifier, ist ein von Windows automatisch erzeugter Wert (Sicherheits-Identifikator), mit dem jeder Windows User eindeutig im Netzwerk zu erkennen ist. Diese User SID ist zwischen 43-45 Zeichen lang, wobei einige Zeichen eine bestimmte, festgelegte Bedeutung haben und ein Teil wird per Zufallsprinzip erzeugt.
In der Regel sieht eine SID wie folgt aus:
S-1-5-21-1234567890-1234567890-1234567890-1234
Diese SID verwendet Windows, um Benutzerinformationen im System abzulegen, u.a. auch in der Registry. Den passenden Pfad, wo z.B. die User-Sids gespeichert werden, lautet:
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList
Hier seht Ihr den Windows Registrierungseditor mit dem geöffneten Registrypfad. Zahlreiche SID´s sind hier zu erkennen und dies bedeutet, dass sich diese User bisher an diesem Windows PC angemeldet haben. In der Vergangenheit haben wir auch schon mehrfach über die „ProfileList“ berichtet, die passenden Beiträge dazu findet Ihr unter „Windows User Profile in der Registry löschen“ und „Windows Profil Fehlermeldung „Die Anmeldung des Dienstes „Benutzerprofildienst“ ist fehlgeschlagen“„.
Somit werden dort keine Benutzernamen gespeichert, sondern immer nur die SID. Somit ist sichergestellt, dass bei Änderungen am Benutzerkonto der Bezug zur SID weiterhin besteht und keine Windows Systemanpassungen notwendig sind.
Manchmal kann es nun sinnvoll sein, eine Übersicht über bestimmte SIDs oder über alle SID Identifier zu bekommen. Dies ist mit Windows Boardmitteln sehr einfach möglich, wie Ihr hier nachfolgend sehen könnt. Der notwendige Befehl dafür lautet:
wmic useraccount get name,sid
In der nachfolgenden Abbildung haben wir dies einmal für Euch durchgeführt.
Die Liste kann bei größeren Netzwerken natürlich sehr umfangreich sein und manchmal ist es wünschenswert, nur die SIDs bestimmter User anzeigen zu lassen. Dies könnt Ihr einschränken, indem Ihr den WMIC Befehl wie folgt verändert.
wmic useraccount where name=“USERNAME“ get sid
Dann sieht das Ergebnis der Ausgabe wie folgt aus.
Das Powershellscript „ListAccountSettings“ liest diverse Accounteigenschaften der (lokalen) Benutzer aus. Dazu gehören u. a. der Accountstatus, die konvertierte SID, der Profilpfad und die Tage seit der letzten Passwortänderung, optional den Pfad zum Anmeldescript.
Am Ende des Scriptes ist ein Beispielauszug hinterlegt.
Function Convert-UserFlags-To-String {
Param($Flag)
$Dict= New-Object System.Collections.ArrayList
Switch ($Flag) {
#($Flag -bOr 0x0001) {[void]$Dict.Add(‚SCRIPT‘)} # 0
($Flag -bOr 0x0002) {[void]$Dict.Add(„ACCOUNT_DISABLED“)}
($Flag -bOr 0x0004) {[void]$Dict.Add(‚UNKNOWN 0x0004‘)}
($Flag -bOr 0x0008) {[void]$Dict.Add(‚HOMEDIR_REQUIRED‘)}
($Flag -bOr 0x0010) {[void]$Dict.Add(‚LOCKOUT‘)}
($Flag -bOr 0x0020) {[void]$Dict.Add(‚PASSWD_NOTREQD‘)}
($Flag -bOr 0x0040) {[void]$Dict.Add(„PASSWD_CANT_CHANGE“)}
($Flag -bOr 0x0080) {[void]$Dict.Add(‚ENCRYPTED_TEXT_PWD_ALLOWED‘)}
($Flag -bOr 0x0100) {[void]$Dict.Add(‚TEMP_DUPLICATE_ACCOUNT‘)}
#($Flag -bOr 0x0200) {[void]$Dict.Add(‚NORMAL_ACCOUNT‘)} # 512.
($Flag -bOr 0x0400) {[void]$Dict.Add(‚UNKNOWN 0x0400‘)}
($Flag -bOr 0x0800) {[void]$Dict.Add(‚INTERDOMAIN_TRUST_ACCOUNT‘)}
($Flag -bOr 0x1000) {[void]$Dict.Add(‚WORKSTATION_TRUST_ACCOUNT‘)}
($Flag -bOr 0x2000) {[void]$Dict.Add(‚SERVER_TRUST_ACCOUNT‘)}
($Flag -bOr 0x4000) {[void]$Dict.Add(‚UNKNOWN 0x4000‘)}
($Flag -bOr 0x8000) {[void]$Dict.Add(‚UNKNOWN 0x8000‘)}
($Flag -bOr 0x10000) {[void]$Dict.Add(„DONT_EXPIRE_PASSWORD“)} # 65.536
($Flag -bOr 0x20000) {[void]$Dict.Add(‚MNS_LOGON_ACCOUNT‘)}
($Flag -bOr 0x40000) {[void]$Dict.Add(‚SMARTCARD_REQUIRED‘)}
($Flag -bOr 0x80000) {[void]$Dict.Add(‚TRUSTED_FOR_DELEGATION‘)}
($Flag -bOr 0x100000) {[void]$Dict.Add(‚NOT_DELEGATED‘)}
($Flag -bOr 0x200000) {[void]$Dict.Add(‚USE_DES_KEY_ONLY‘)}
($Flag -bOr 0x400000) {[void]$Dict.Add(‚DONT_REQ_PREAUTH‘)}
($Flag -bOr 0x800000) {[void]$Dict.Add(‚PASSWORD_EXPIRED‘)} # 524.288
($Flag -bOr 0x1000000) {[void]$Dict.Add(‚TRUSTED_TO_AUTH_FOR_DELEGATION‘)}
($Flag -bOr 0x2000000) {[void]$Dict.Add(‚UNKNOWN 0x2000000‘)}
($Flag -bOr 0x4000000) {[void]$Dict.Add(‚PARTIAL_SECRETS_ACCOUNT‘)}
($Flag -bOr 0x8000000) {[void]$Dict.Add(‚UNKNOWN 0x8000000‘)} # 134.217.728
}
$Dict -join ‚ | ‚
} #end
cls
$psver= „2.2 jenny.helm@me.com“
$pslet= [Environment]::GetFolderPath(‚Favorites‘) + „\ListAccountSettings“
$pslet= [Environment]::GetFolderPath(‚Personal‘) + „\ListAccountSettings“
$countLfdGroup = $null
$countTotalUser = $null
$resultGroup = @()
$resultMember = @()
$sekundenAmTag = 60*60*24 # =86.400
$ProfileList = „Registry::HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList“
$strComputer = „$env:computername“
$adsi = [ADSI]“WinNT://$strComputer, Computer“
ForEach ($objAdsi in $adsi.psbase.children) {
switch ($objAdsi.psbase.SchemaClassName) {
‚group‘
{
$countLfdGroup++
$groupName = [string]$objAdsi.Name
$adsiGroup = [ADSI]“WinNT://$strComputer/$groupName,group“
$Members = @($adsiGroup.psbase.Invoke(„Members“))
$MembersCount = ($Members | measure-object).count
$GName= $groupName.tostring()
If ($MembersCount -ge 1)
{
$tableGroupFazit = [ordered] @{
lfd = $CountLfdGroup # 1..
GruppenName = $GName #
AnzahlMitglieder = $MembersCount # [int]
}
$resultGroup += New-Object -TypeName PSCustomObject -Property $tableGroupFazit
}
ForEach ($Member In $Members) {
$countTotalUser++
$Name = $Member.GetType().InvokeMember(„Name“, „GetProperty“, $Null, $Member, $Null)
#$Class = $Member.GetType().InvokeMember(„Class“, „GetProperty“, $Null, $Member, $Null)
#$isInGroup = ($Member.GetType().InvokeMember(„Class“, „GetProperty“, $Null, $Member, $Null) -eq ‚group‘)
#$isUser = ($Member.GetType().InvokeMember(„Class“, „GetProperty“, $Null, $Member, $Null) -eq ‚user‘)
Try
{
$fullname = $Member.GetType().InvokeMember(„FullName“, „GetProperty“, $Null, $Member, $Null)
$LastLogin = $Member.GetType().InvokeMember(„LastLogin“, „GetProperty“, $Null, $Member, $Null)
$LoginScript = $Member.GetType().InvokeMember(„LoginScript“, „GetProperty“, $Null, $Member, $Null)
$pwAge = $Member.GetType().InvokeMember(„PasswordAge“, „GetProperty“, $Null, $Member, $Null)
$PWLastSet = [Math]::Round($PwAge / $sekundenAmTag)
$Flag = $Member.GetType().InvokeMember(„UserFlags“, „GetProperty“, $Null, $Member, $Null)
$status = Convert-UserFlags-To-String $Flag
$objSID = $Member.GetType().InvokeMember(„ObjectSID“, „GetProperty“, $Null, $Member, $Null)
$USID = (New-Object System.Security.Principal.NTAccount($name)).Translate([System.Security.Principal.SecurityIdentifier]).Value
If (test-path „$ProfileList\$USID“)
{
$ProfileImagePath= (Get-ItemProperty „$ProfileList\$USID“).ProfileImagePath
}
}
Catch
{
$fullname = „*Nicht verwendet“
$LastLogin = „*k. A.“ #If ($LastLogin -isNot [DateTime]) {$LastLogin= $null}
$LoginScript = „*Nicht angelegt“
$USID = $null
$PWLastSet = „0“
$ProfileImagePath = „*Nicht vorhanden“
$status = „*NORMAL_ACCOUNT“
}
$tableMemberFazit = [ordered] @{
Benutzer = $Name # Benutzer
‚In Gruppe‘ = $GName # Benutzergruppe
ProfilPfad = $ProfileImagePath # C:\USERS\
Displayname = $fullname # Anzeigename
AccountStatus = $status # PASSWD_NOTREQD | DONT_EXPIRE_PASSWORD
‚Letzte Anmeldung am‘ = $LastLogin # 26.01.2019 11:27:57
‚PW erneuert vor‘ = „$PWLastSet Tagen“ # PW vor x Tagen angelegt/geändert
#LoginScript = $LoginScript # anmelden.cmd
SID = $USID # S-1-5-21-252479530-825399720-2827640702-500
#ObjectSID = $objSID # {1, 5, 0, 0â¦}
}
$resultMember += New-Object -TypeName PSObject -Property $tableMemberFazit
} #end foreach
} #end group
} #end switch
} #end foreach
$resultGroup | ft
$resultMember
$resultMember >“$pslet-$countTotalUser-$strComputer.txt“
write-host `nProfilgrößen siehe Menü: Systemeigenschaften / Erweitert / Benutzerprofile /`n
Pause
Start „SystemPropertiesAdvanced.exe“