none
Berechtigung automatisiert entfernen mit Set-Acl (verwaiste AD-Objekte)

    Frage

  • Hallo zusammen,

    ich komme leider gerade nicht bei der Erstellung eines Scripts zum Entfernen verwaister AD-Objekte aus den Zugriffsberechtigungen weiter.
    Bis jetzt habe ich ein Script, welches die zu untersuchenden Pfade rekursiv durchläuft und mit

    $df | get-acl | Select-Object -ExpandProperty Access | ? {$_.IdentityReference -like "*S-1-5-21*"}

    prüft, ob ein verwaistes Objekt vorhanden ist.
    Nun ist die manuelle Entfernung des jeweiligen Objektes in einer großen Umgebung mit ziemlich viel Aufwand verbunden.
    Gibt es eine Möglichkeit den String "*S-1-5-21*" über Set-Acl zu entfernen?
    Mir ist nur bekannt, dass ich ein Referenzobjekt per Pipe übergeben könnte, damit die Einträge kopiert werden. Zum Entfernen einer Berechtigung als String habe ich leider jedoch noch nichts finden können.

    Ich bin für jeden lösungsorientierten Beitrag dankbar.

    Viele Grüße
    BeatYa


    • Bearbeitet BeatYa Dienstag, 9. Januar 2018 15:17
    Dienstag, 9. Januar 2018 15:11

Antworten

Alle Antworten

  • Moin,

    das System.Security.AccessControl.FileSecurity-Objekt hat eine RemoveAccessRule-Methode.


    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> https://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com


    In theory, there is no difference between theory and practice. In practice, there is.

    Dienstag, 9. Januar 2018 15:31
  • Moinsen,

    vielen Dank für den Hinweis. Nun muss ich mich da erstmal noch durchfuchsen, da ichs auf die Weise noch nicht angewendet habe, aber ohne Eigenleistung wärs ja auch langweilig.

    Mittwoch, 10. Januar 2018 08:06
  • Moin,

    das System.Security.AccessControl.FileSecurity-Objekt hat eine RemoveAccessRule-Methode.


    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> https://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com


    In theory, there is no difference between theory and practice. In practice, there is.

    Ich habe nun ein nettes Script zum setzen und löschen der Berechtigungen über System.Security.AccessControl.FileSecurity gefunden:

    $colRights = [System.Security.AccessControl.FileSystemRights]"Read" 
    
    $InheritanceFlag = [System.Security.AccessControl.InheritanceFlags]::None 
    $PropagationFlag = [System.Security.AccessControl.PropagationFlags]::None 
    
    $objType =[System.Security.AccessControl.AccessControlType]::Allow 
    
    $objUser = New-Object System.Security.Principal.NTAccount("wingroup\kenmyer") 
    
    $objACE = New-Object System.Security.AccessControl.FileSystemAccessRule `
        ($objUser, $colRights, $InheritanceFlag, $PropagationFlag, $objType) 
    
    $objACL = Get-ACL "c:\scripts\test.ps1" 
    $objACL.RemoveAccessRuleAll($objACE) 
    
    Set-ACL "C:\Scripts\Test.ps1" $objACL

    Quelle Technet

    Wenn ich AddAccessRuleAll benutze funktioniert es tadelllos, entfernen lässt sich der auf diesem Weg gesetzte User auch wieder.
    Wenn ich nun jedoch einem User die Berechtigung auf ein Objekt vergebe, den User durch löschen desselben aus Benutzer & Gruppen zum verwaisten Objekt werden lasse erhalte ich den Fehler:

    Ausnahme beim Aufrufen von "RemoveAccessRule" mit 1 Argument(en): "Manche oder alle Identitätsnachweise konnten nicht übersetzt werden."
    In Zeile:14 Zeichen:1
    + $objACL.RemoveAccessRule($objACE)
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         + CategoryInfo : NotSpecified: (:) [], MethodInvocationException
         + FullyQualifiedErrorId : IdentifyNotMappedException
    Gibts da nen Trick, um das nicht mehr gemappte Objekt trotzdem ansprechen zu können?



    Freitag, 12. Januar 2018 08:57
  • Ja, Du musst das zu entfernende Objekt nicht neu erzeugen, sondern aus der Auflistung in der ACL herausfiltern.

    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> https://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com


    In theory, there is no difference between theory and practice. In practice, there is.

    Freitag, 12. Januar 2018 10:28
  • War einfacher als erwartet.
    Ich poste gleich mal das gesamte Script.

    => Mein Script lautet wie folgt:

    $ErroractionPreference = 'Silentlycontinue'
    Clear-Variable -Name "arr", "ACL", "FullName", "logfile", "log", "logpath" "path", "spath", "colrights", "InheritanceFlag", "PropagationFlag", "objType", "objUser", "objACE", "objACL"
    $logpath = "\\logpfad"
    $D = Get-Date -Format d
    $DfP = $D.replace('.','-')
    $logfile = @()
    $path = gci \\pfad -recurse -force
    #cls


    Foreach ($spath in $path){
    Clear-Variable -Name "ACL"
    $ACL = $spath | get-acl | Select-Object -ExpandProperty Access | ? {$_.IdentityReference -like "*S-1-5-21-*"} | Foreach-Object {$_.IdentityReference.Value}
    if ($ACL -notlike "" -and $ACL -ne "S-1-5-21"){
    $FullName = $spath.FullName
    Write-Host "der Variablenwert ist: " $ACL
    $colRights = [System.Security.AccessControl.FileSystemRights]"Read"

    $InheritanceFlag = [System.Security.AccessControl.InheritanceFlags]::None
    $PropagationFlag = [System.Security.AccessControl.PropagationFlags]::None

    $objType = [System.Security.AccessControl.AccessControlType]::Allow
    $objUser = New-Object System.Security.Principal.SecurityIdentifier("$ACL")
    $objACE = New-Object System.Security.AccessControl.FileSystemAccessRule($objUser, $colRights, $InheritanceFlag, $PropagationFlag, $objType)

    $objACL = Get-ACL $FullName
    $objACL.RemoveAccessRuleAll($objACE)

    Set-ACL $FullName $objACL
    $log = $FullName
    $arr = New-Object PSCustomObject
    $arr | Add-Member -type NoteProperty -name Pfad -Value $log
    $arr | Add-Member -type NoteProperty -name Principal -Value $ACL.IdentityReference.Value
    $logfile += $arr
    }
    }
    $logfile | Export-Csv $logpath\$DfP -Delimiter ";"

    Gleich darf es dann das erste Mal nach erfolgreichen Tests am Lifesystem werkeln.
    Ik freu mir!

    Werde noch eine Hilfe und Parameter für Pfad einbauen und wenns fertig ist den Post updaten.


    • Bearbeitet BeatYa Freitag, 12. Januar 2018 13:25
    Freitag, 12. Januar 2018 11:37