Lokale Profile von deaktivierten AD Usern löschen
Hallo
Kann mir jemand weiterhelfen? Mein Ziel ist es, lokal auf dem Gerät die Profile von Benutzern, die im AD deaktiviert sind, zu löschen, indem aus der Registry die Userprofile ausgelesen und im AD abgefragt werden. Auf Maschinen mit dem RSAT (Remote Server Admin Tool) funktioniert das soweit auch sehr gut. Da dieses aber auf den meisten Geräten nicht installiert ist, versuchte ich es mit "Import-PSSession. Jedoch bekomme ich hier jedes Mal die folgende Meldung
Kennt jemand dieses Problem?
Danke für die Hilfe
Kann mir jemand weiterhelfen? Mein Ziel ist es, lokal auf dem Gerät die Profile von Benutzern, die im AD deaktiviert sind, zu löschen, indem aus der Registry die Userprofile ausgelesen und im AD abgefragt werden. Auf Maschinen mit dem RSAT (Remote Server Admin Tool) funktioniert das soweit auch sehr gut. Da dieses aber auf den meisten Geräten nicht installiert ist, versuchte ich es mit "Import-PSSession. Jedoch bekomme ich hier jedes Mal die folgende Meldung
Variable: 'StrSamAccountName' found in expression: $StrSamAccountName is not defined.
+ CategoryInfo : InvalidArgument: (:) [Get-ADUser], ArgumentException
+ FullyQualifiedErrorId : ActiveDirectoryCmdlet:System.ArgumentException,Microsoft.ActiveDirectory.Management.Comm
ands.GetADUser
$Error.Clear()
$DebugPreference = "Continue"
$StrADServer = "Server"
$StrFilePath = "C:\Users\"
$StrLogfile = "C:\Temp\Remove-LocalProfiles.log"
$StrRegPath = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList"
$ArrProfileFiles = Get-ChildItem $StrFilePath
$ArrRegKeys = Get-ChildItem $StrRegPath
$ObjADSession = New-PSSession -Computername $StrADServer
Import-PSSession $ObjADSession -Module ActiveDirectory
$Error.Clear()
New-Item "C:\users\leer" -ItemType Directory | Out-Null
Function Check-ProfileFolder
{
$IntProfCount = 0
Foreach ($StrProfile in $ArrProfileFiles)
{
If ($StrProfile -eq $StrRegProfilePath)
{
$IntProfCount += 1
}
}
If ($IntProfCount -eq 0)
{
Remove-LocalProfileFolder
}
Else
{
Write-Debug "not delete $StrProfile"
}
}
Function Log-Error
{
If ($Error -ne $Null)
{
"$StrSamAccountName`t$Error" | Out-File $StrLogfile -Append
$Error.Clear()
}
}
Function Remove-LocalProfileFolder
{
Write-Debug "Delete Folder $StrProfile"
Robocopy "C:\users\Leer" $StrProfile.FullName /mir /b /r:0 /w:0 | Out-Null
Remove-Item $StrProfile.FullName -Recurse -Force
Log-Error
}
Function Remove-ProfileRegistryKey
{
Write-Debug "Remove Key $StrRegKey"
Remove-Item $StrRegKey.PSPath -Recurse -Force
Log-Error
}
ForEach ($StrRegKey in $ArrRegKeys)
{
If ($StrRegKey.PSChildName.Length -gt 8) #kein SystemProfil
{
[String]$StrRegProfilePath = Get-ItemProperty $StrRegKey.PSPath | Select-Object ProfileImagePath
$StrRegProfilePath = $StrRegProfilePath.TrimStart("ProfileImagePath : ").TrimStart("@{ProfileImagePath=").TrimEnd("}")
$ObjADUser = $Null
$StrSamAccountName = $StrRegProfilePath.TrimStart($StrFilePath)
$StrSamAccountName
Write-Debug "Name $StrRegProfilePath"
If ($StrSamAccountName -like "*.*")
{
$StrSamAccountName = $StrSamAccountName.Split(".")
}
$ObjADUser = Get-ADUser -Filter {SamAccountName -eq $StrSamAccountName}
If ($ObjADUser)
{
If ($ObjADUser.Enabled -eq $False)
{
Remove-ProfileRegistryKey
Write-Debug "remove Key $StrSamAccountName"
Check-ProfileFolder
}
Else
{
Write-Debug "$StrSamAccountName enabled"
}
}
Else
{
Remove-ProfileRegistryKey
Write-Debug "$StrSamAccountName not in AD"
Check-ProfileFolder
}
}
}
Remove-Item "C:\Users\Leer" -Force
Remove-PSSession -Session $ObjADSession
Danke für die Hilfe
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 292234
Url: https://administrator.de/contentid/292234
Ausgedruckt am: 22.11.2024 um 09:11 Uhr
1 Kommentar
Moin,
ganz klar, einen User anhand des Namens seines Profilverzeichnisses zu identifizieren kann nicht funktionieren, zumindest nicht immer, denn Profile können durch doppelte Namen den Domain-Teil angehängt bekommen und dann geht dein Script natürlich nicht mehr.
Besser rufst du die Benutzerprofile über WMI ab
Und per Import-Session auf einem Client zu arbeiten absolutes NOGO, das macht man aus Sicherheitsgründen so in keinem Fall!
Du kannst auch ohne RSAT mit einem [adsisearcher] das AD abfragen das funktioniert auf jedem Client ohne etwaige Voraussetzungen, außer das der Client in der Domäne angemeldet sein und das AD erreichen können muss.
Gruß jodel32
ganz klar, einen User anhand des Namens seines Profilverzeichnisses zu identifizieren kann nicht funktionieren, zumindest nicht immer, denn Profile können durch doppelte Namen den Domain-Teil angehängt bekommen und dann geht dein Script natürlich nicht mehr.
Besser rufst du die Benutzerprofile über WMI ab
gwmi Win32_Userprofile | ?{$_.Special -ne $true} | select sid
Du kannst auch ohne RSAT mit einem [adsisearcher] das AD abfragen das funktioniert auf jedem Client ohne etwaige Voraussetzungen, außer das der Client in der Domäne angemeldet sein und das AD erreichen können muss.
$sid = 'S-1-5-21-XXXXXXXXX-XXXXXXXX-XXXXXXXXXX-XXXXX'
$adsi = new-object adsisearcher("LDAP://$(([adsi]'LDAP://rootDSE').defaultNamingContext)","(&(objectCategory=User)(objectSID=$sid)(!userAccountControl:1.2.840.113556.1.4.803:=2))","samAccountName",[System.DirectoryServices.SearchScope]::Subtree)
if (!$adsi.FindOne()){
write-host "User existiert nicht oder der Account ist nicht aktiviert"
}
Gruß jodel32