dispatcher
Goto Top

NTFS Berechtigungen von AD-Gruppen anzeigen

Guten Tag allerseits,

mein Ziel ist es, eine Powershellabfrage zu basteln, die mir nach Eingabe des AD-Gruppen Namen alle Ordner anzeigt, auf dem/denen die Gruppe auf dem Fileserver Zugriff hat.
Mit ist bewusst, dass das je nach Größe und Anzahl der Ordner länger bis ewig dauern kann.

Ich habe jetzt schon länger recherchiert, bin allerdings noch zu keinem befriedigendem Ergebnis gekommen.
Accesschk von den Sysinternal und get-acl sind bis jetzt recht ernüchternd.

Hier mal ein Bespiel:
Get-ChildItem -Path \\serverxyz -Force | where { $_.Mode -match 'd' } | Get-Acl | where {$_.AccessToString -match "domain\\Gruppexyz"} | select @{ Name="Path"; Expression={$_.Path.Substring(38)} }  

Der Pfad "\\serverxyz" kann nicht gefunden werden, da er nicht vorhanden ist <- ist er aber.
Übergebe ich dem Pfad noch 2-3 Unterordner, findet liefert er einige Ergebnisse, aber halt auch nur dann.

Gibt es eine andere Möglichkeit herauszufinden, auf welche Pfade/Ordner eine bestimmte Gruppe Zugriff hat?
Den kompletten Fileserver nach allen Gruppen scannen, kommt ert einmal nicht in Betracht.

Content-ID: 517110

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

Ausgedruckt am: 24.11.2024 um 08:11 Uhr

141965
141965 20.11.2019 aktualisiert um 13:05:14 Uhr
Goto Top
dispatcher
dispatcher 20.11.2019, aktualisiert am 24.05.2022 um 17:36:39 Uhr
Goto Top
Nehmen wir mal das erste Skript von colinardo
function Get-FolderRightsForAccount([string]$dn, [string]$rootfolder, [switch]$includeInheritedRights){
    $sids = @()
    $sids += (Get-ADObject $dn -Properties objectSid).objectSid.Value
    $getsids = {
        param($obj)
        $result += Get-ADPrincipalGroupMembership $obj | %{
            &$getsids -obj $_.DistinguishedName
            $_.SID.Value
        }
        $result
    }
    $sids += &$getsids -obj $dn
    $inherited = @{$true=($true,$false);$false=$false}[$includeInheritedRights.IsPresent]
    (Get-ACL $rootfolder).Access | ?{try{$_.IdentityReference.Translate([System.Security.Principal.SecurityIdentifier]).Value -in $sids -and $_.IsInherited -in $inherited}catch{}} | select @{n='Folder';e={$rootfolder}},AccessControlType,@{n='Rights';e={$_.FileSystemRights}}  
    gci $rootfolder -Recurse -Directory -PipelineVariable f | %{
        (Get-ACL $_.Fullname).Access | ?{try{$_.IdentityReference.Translate([System.Security.Principal.SecurityIdentifier]).Value -in $sids -and $_.IsInherited -in $inherited}catch{}} | select @{n='Folder';e={$f.Fullname}},AccessControlType,@{n='Rights';e={$_.FileSystemRights}}  
    }
}

Get-FolderRightsForAccount -dn (Get-ADGroup 'DEINEGRUPPE').DistinguishedName -rootfolder 'C:\TESTSHARE' -includeInheritedRights | ft -AutoSize  
Gebe ich wie im letzten Part angegeben für 'DEINEGRUPPE' den Gruppennamen an und für rootfolden den Servernamen \\serverxyz sagt er, er kann die Gruppe nicht finden. Diese gibt es aber. Mit Angabe der ObjectID für die Gruppe bricht er mit der Fehlermeldung ab, der Server \\serverxyz kann nicht gefunden werden.
141965
141965 20.11.2019 aktualisiert um 15:37:35 Uhr
Goto Top
Zitat von @dispatcher:
Gebe ich wie im letzten Part angegeben für 'DEINEGRUPPE' den Gruppennamen an und für rootfolden den Servernamen \\serverxyz sagt er, er kann die Gruppe nicht finden.
Also hier geht's testweise ohne Probleme, was gibt denn
(Get-ADGroup 'DEINEGRUPPE').DistinguishedName
alleine aus?
Diese gibt es aber.
Offensichtlich nicht, vermutlich wieder Tippfehler wie so oft. Ohne Original Fehlermeldung wird dir hier keiner helfen ...
Mit Angabe der ObjectID für die Gruppe bricht er mit der Fehlermeldung ab, der Server \\serverxyz kann nicht gefunden werden.
Da gehört ja auch ein kompletter Ordnername rein nicht nur ein Servername, tssss, wie soll das Skript denn wissen welches Share du meinst ?!
dispatcher
dispatcher 21.11.2019, aktualisiert am 24.05.2022 um 17:38:04 Uhr
Goto Top
Ich habe es jetzt über einen Folder Picker gelöst...vielen Dank!

Hier mal das Skript für alle die es auch interessiert face-smile

$Gruppe = read-Host "Gebe Gruppennamen ein: "  

Function Get-Folder($initialDirectory)
{
    [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms")|Out-Null  
    $Ordnername = New-Object System.Windows.Forms.FolderBrowserDialog
    $Ordnername.Description = "Ordner auswählen"  
    $Ordnername.rootfolder = "MyComputer"  
    if($Ordnername.ShowDialog() -eq "OK")  
    {
        $Ordner += $Ordnername.SelectedPath
    }
    return $Ordner
}
$o = Get-Folder


function Get-FolderRightsForAccount([string]$dn, [string]$rootfolder, [switch]$includeInheritedRights){
    $sids = @()
    $sids += (Get-ADObject $dn -Properties objectSid).objectSid.Value
    $getsids = {
        param($obj)
        $result += Get-ADPrincipalGroupMembership $obj | %{
            &$getsids -obj $_.DistinguishedName
            $_.SID.Value
        }
        $result
    }
    $sids += &$getsids -obj $dn
    $inherited = @{$true=($true,$false);$false=$false}[$includeInheritedRights.IsPresent]
    (Get-ACL $rootfolder).Access | ?{try{$_.IdentityReference.Translate([System.Security.Principal.SecurityIdentifier]).Value -in $sids -and $_.IsInherited -in $inherited}catch{}} | select @{n='Folder';e={$rootfolder}},AccessControlType,@{n='Rights';e={$_.FileSystemRights}}  
    gci $rootfolder -Recurse -Directory -PipelineVariable f | %{
        (Get-ACL $_.Fullname).Access | ?{try{$_.IdentityReference.Translate([System.Security.Principal.SecurityIdentifier]).Value -in $sids -and $_.IsInherited -in $inherited}catch{}} | select @{n='Folder';e={$f.Fullname}},AccessControlType,@{n='Rights';e={$_.FileSystemRights}}  
    }
}

Get-FolderRightsForAccount -dn (Get-ADGroup $Gruppe).DistinguishedName -rootfolder $o -includeInheritedRights | ft -AutoSize 
write-host
read-host "Zum Beenden beliebige Taste druecken"