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-Key: 292234

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

Printed on: April 19, 2024 at 20:04 o'clock

Mitglied: 114757
Solution 114757 Jan 05, 2016, updated at Jan 26, 2016 at 09:09:21 (UTC)
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