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

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

Printed on: April 18, 2024 at 08:04 o'clock

Mitglied: 141965
141965 Nov 20, 2019 updated at 12:05:14 (UTC)
Goto Top
Member: dispatcher
dispatcher Nov 20, 2019, updated at May 24, 2022 at 15:36:39 (UTC)
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.
Mitglied: 141965
141965 Nov 20, 2019 updated at 14:37:35 (UTC)
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 ?!
Member: dispatcher
dispatcher Nov 21, 2019, updated at May 24, 2022 at 15:38:04 (UTC)
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"