arduino
Goto Top

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
Variable: 'StrSamAccountName' found in expression: $StrSamAccountName is not defined.  
    + CategoryInfo          : InvalidArgument: (:) [Get-ADUser], ArgumentException
    + FullyQualifiedErrorId : ActiveDirectoryCmdlet:System.ArgumentException,Microsoft.ActiveDirectory.Management.Comm
   ands.GetADUser
Kennt jemand dieses Problem?

$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

Content-ID: 292234

Url: https://administrator.de/contentid/292234

Ausgedruckt am: 22.11.2024 um 09:11 Uhr

114757
Lösung 114757 05.01.2016, aktualisiert am 26.01.2016 um 10:09:21 Uhr
Goto Top
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
gwmi Win32_Userprofile | ?{$_.Special -ne $true} | select sid
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.
$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