Benutzer mit den meisten Antworten
Rekursive auflistung von Berechtigungen und Auflistung der AD-Guppen inkl. Benutzer

Frage
-
Hi,
Ich habe mich mal etwas mit der Powershell beschäftigt und würde gerne rekursiv die nichtvererbten Rechte der Ordner auflisten.
Eigentlich funktioniert das auch soweit, nur mit der Ausgabe habe ich Probleme. Außerdem soll das ganze später in eine Textdatei o.Ä. geschrieben werden (Da weiß ich auch nicht sorecht wie ich es anstellen soll powershell.exe script.ps1 >> C:\text.txt ist gescheitert ;) ).
Hier mein Script:
Set-ExecutionPolicy RemoteSigned #Berechtigungsstufe $sFolder = "D:" #Pfad der durchsucht werden soll foreach($aFolders in dir $sFolder -recurse -Exclude *.*){ #Schleife: Wird für jeden Ordner im Ordner $sFolder durchgeführt $sBerechtigung = (Get-Acl "$($aFolders)" ).access | where-Object {($_.PropagationFlags -eq 'None') -and ($_.IsInherited -ne 'True')} #Auslesen: Filtert die Berechtigungen der Ordner heraus if ("$($sBerechtigung.IdentityReference)" -ne ""){ #Abfrage Überprüft vor der Ausgabe ob IdentityReference einen Wert hat ansonsten wird die Ausgabe nicht durchgeführt ""#Ausgabe: Absatz "Ordner: $($aFolders)" #Ausgabe: Ordnerpfad "Benutzer/Gruppe: $($sBerechtigung.IdentityReference)" #Ausgabe: Benutzer bzw Gruppe "Berechtigung: $($sBerechtigung.FileSystemRights)" #Ausgabe: Berechtigung des Benutzers/der Gruppe } }
Für die Auswertung wollte ich darunter dann die Gruppen und Benutzer auflisten:
GRUPPE1:
User1
User3
User..
Die User könnte ich ja prinzipiell aus der WMI auslesen.. jedoch bekomme ich dort ja nicht die Gruppenzugehörigkeit heraus.
Habe auch schon "gegoogelt" jedoch nichts passendes gefunden. Für Unterstützung / Hilfestellungen wäre ich sehr dankbar :)
MfG Daniel
- Typ geändert Mahagon Montag, 15. November 2010 11:55 Ergänzung
Antworten
-
Hallo Daniel,
objItem.name ist der Gruppenname. Was du bräuchtest wäre die objItem.member Eigenschaft welche alle Mitglieder der Gruppe enthält. Stelle bitte sicher, dass die member Eingenschaft auch in der $colProplist Variable eingetragen ist:
$Gruppe = "Dv Rechnung Lesen" $strFilter = "(&(objectCategory=group)(Name=$Gruppe))" $objDomain = New-Object System.DirectoryServices.DirectoryEntry $objSearcher = New-Object System.DirectoryServices.DirectorySearcher $objSearcher.SearchRoot = $objDomain $objSearcher.PageSize = 1000 $objSearcher.Filter = $strFilter $objSearcher.SearchScope = "Subtree" $colProplist = "member" foreach ($i in $colPropList){$objSearcher.PropertiesToLoad.Add($i)} $colResults = $objSearcher.FindAll() foreach ($objResult in $colResults) {$objItem = $objResult.Properties; $objItem.member}
Gruß,
Andrei- Als Antwort markiert Andrei TalmaciuModerator Montag, 20. September 2010 08:24
- Als Antwort markiert Denniver ReiningMVP, Moderator Samstag, 19. Februar 2011 14:58
Alle Antworten
-
Hallo Daniel,
für AD basierte Gruppen, müsstest man die Gruppe aus AD abrufen und anschließend die Eigenschaften auslesen oder wenn der LDAP Pfad bekannt ist/leicht aufgebaut werden kann, etwas einfacher wie z.B. in diesem ($group.Member()) Thread beschrieben.
für lokale Gruppen, könntest du es mit unterem Code z.B. für die Administratoren Gruppe probieren:
Gruß,$group =[ADSI]"WinNT://./Administrators" $members =$group.Members() $members | foreach {$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)}
Andrei -
Hi,
Danke schonmal für die Antwort :)
Das mit dem rekursiven Auflisten habe ich soweit hinbekommen:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned #Berechtigungsstufe $pfad = "C:\Users" #Ordnerpfad (Muss ohne \ am Ende eingegeben werden! $protokoll = "C:\Berechtigung.txt" #Dateiname des Protokolls $pfadold = "" $table = @() $table += "" $table += "===============================================================================================" $table += "" $table += "DATEIBERECHTIGUNGEN" $table += "" $table += "===============================================================================================" $table += "" foreach ($acl in $($pfad | get-acl) ) { foreach ($ace in $acl.GetAccessRules($true,$true, [system.security.principal.securityidentifier]) | Where-Object {($_.PropagationFlags -match "None")} | select-object FileSystemRights,AccessControlType,IdentityReference,IsInherited) { $pfadaktuell = "$($acl.path)" $pfadaktuell = $pfadaktuell -replace "Microsoft\.PowerShell\.Core\\FileSystem\:\:","" if ($pfadaktuell -ne $pfadold){ $table += "Pfad: $pfadaktuell" $table += "" } $table += "Berechtigung: $($ace.FileSystemRights)" $table += "Benutzer/Gruppe: $($ace.IdentityReference | %{$_.Translate([System.Security.Principal.NTAccount])} )" $table += "Vererbung: $($ace.IsInherited)" $table += "" $pfadold = $pfadaktuell } } foreach ($acl in $(get-childitem $pfad -recurse -Exclude *.*| get-acl) ) { foreach ($ace in $acl.GetAccessRules($true,$true, [system.security.principal.securityidentifier]) | Where-Object {($_.PropagationFlags -match "None") -and ($_.IsInherited -match "False")} | select-object FileSystemRights,AccessControlType,IdentityReference,IsInherited) { $pfadaktuell = "$($acl.path)" $pfadaktuell = $pfadaktuell -replace "Microsoft\.PowerShell\.Core\\FileSystem\:\:","" if ($pfadaktuell -ne $pfadold){ $table += "-----------------------------------------------------------------------------------------------" $table += "" $table += "Pfad: $pfadaktuell" $table += "" } $table += "Berechtigung: $($ace.FileSystemRights)" $table += "Benutzer/Gruppe: $($ace.IdentityReference | %{$_.Translate([System.Security.Principal.NTAccount])} )" $table += "Vererbung: $($ace.IsInherited)" $table += "" $pfadold = $pfadaktuell } } $table += "" $table += "===============================================================================================" $table += "" $table += "BENUTZERGRUPPEN" $table += "" $table += "===============================================================================================" $table += "" $table | Set-Content $protokoll
Jedoch mit den Gruppen und deren Usern bekomme ich es nicht wirklich hin.. (Habe auch wie gesagt sonst nichts mit der Powershell am Hut)
Habe es schon auf diese weise versucht:
$Gruppe = "Dv Rechnung Lesen" $strFilter = "(&(objectCategory=group)(Name=$Gruppe))" $objDomain = New-Object System.DirectoryServices.DirectoryEntry $objSearcher = New-Object System.DirectoryServices.DirectorySearcher $objSearcher.SearchRoot = $objDomain $objSearcher.PageSize = 1000 $objSearcher.Filter = $strFilter $objSearcher.SearchScope = "Subtree" $colProplist = "name" foreach ($i in $colPropList){$objSearcher.PropertiesToLoad.Add($i)} $colResults = $objSearcher.FindAll() foreach ($objResult in $colResults) {$objItem = $objResult.Properties; $objItem.name}
(Vorlage kommt von MS)
Jedoch finde ich nicht heraus wie ich die Benutzernamen mit auflisten kann.
Dieses Script z.B.
$Gruppe = "*" $strFilter = "(&(objectCategory=user)(Name=$Gruppe))" $objDomain = New-Object System.DirectoryServices.DirectoryEntry $objSearcher = New-Object System.DirectoryServices.DirectorySearcher $objSearcher.SearchRoot = $objDomain $objSearcher.PageSize = 1000 $objSearcher.Filter = $strFilter $objSearcher.SearchScope = "Subtree" $colProplist = "name" foreach ($i in $colPropList){$objSearcher.PropertiesToLoad.Add($i)} $colResults = $objSearcher.FindAll() foreach ($objResult in $colResults) {$objItem = $objResult.Properties; $objItem.name}
listet ja nur alle User auf (und auch nur deren Namen nicht den Benutzernamen).
Kann ich irgendwie feststellen wie ich z.B. $objItem.name anpassen muss damit dich die Benutzernamen bekomme?
Vielen Dank schonmal :)
MfG Daniel
-
Hallo Daniel,
objItem.name ist der Gruppenname. Was du bräuchtest wäre die objItem.member Eigenschaft welche alle Mitglieder der Gruppe enthält. Stelle bitte sicher, dass die member Eingenschaft auch in der $colProplist Variable eingetragen ist:
$Gruppe = "Dv Rechnung Lesen" $strFilter = "(&(objectCategory=group)(Name=$Gruppe))" $objDomain = New-Object System.DirectoryServices.DirectoryEntry $objSearcher = New-Object System.DirectoryServices.DirectorySearcher $objSearcher.SearchRoot = $objDomain $objSearcher.PageSize = 1000 $objSearcher.Filter = $strFilter $objSearcher.SearchScope = "Subtree" $colProplist = "member" foreach ($i in $colPropList){$objSearcher.PropertiesToLoad.Add($i)} $colResults = $objSearcher.FindAll() foreach ($objResult in $colResults) {$objItem = $objResult.Properties; $objItem.member}
Gruß,
Andrei- Als Antwort markiert Andrei TalmaciuModerator Montag, 20. September 2010 08:24
- Als Antwort markiert Denniver ReiningMVP, Moderator Samstag, 19. Februar 2011 14:58
-
Tut mir leid, hatte sehr viel um die Ohren.
Ja es hat ersteinmal weitergeholfen:
##################################################################################### # Powershell Version 1.0 # # Author: Daniel ------ # # # # Script Function: # # Rekursive Auflistung der Benutzerrechte. # ##################################################################################### Set-ExecutionPolicy RemoteSigned #Berechtigungsstufe cls $pfad = "C:\users" #Ordnerpfad (Muss ohne \ am Ende eingegeben werden! $protokoll = Get-Date -uFormat "C:\Berechtigungen vom %d. %B.txt" #Dateiname des Protokolls $pfadold = "" $user = "" $allusers = "" $table = @() $table += "" $table += "=========================================================================" $table += "" $table += "DATEIBERECHTIGUNGEN" $table += "" $table += "=========================================================================" $table += "" foreach ($acl in $($pfad | get-acl) ) { foreach ($ace in $acl.GetAccessRules($true,$true, [system.security.principal.securityidentifier]) | Where-Object {($_.PropagationFlags -match "None")} | select-object FileSystemRights,AccessControlType,IdentityReference,IsInherited) { $pfadaktuell = "$($acl.path)" $pfadaktuell = $pfadaktuell -replace "Microsoft\.PowerShell\.Core\\FileSystem\:\:","" if ($pfadaktuell -ne $pfadold){ $table += "Hauptverzeichnis: $pfadaktuell" $table += "" } $userandgroup = "$($ace.IdentityReference | %{$_.Translate([System.Security.Principal.NTAccount])} )" $user = $userandgroup.substring($userandgroup.indexof("\")+1) $table += "Benutzer/Gruppe: $($user)" if ($allusers.indexof("$($user)") -cmatch -1) { $allusers += "$($user)," } $table += "Berechtigung(en): $($ace.FileSystemRights)" $table += "Vererbung: $($ace.IsInherited)" $table += "" $pfadold = $pfadaktuell } } foreach ($acl in $(get-childitem $pfad -recurse -Exclude *.*| get-acl) ) { foreach ($ace in $acl.GetAccessRules($true,$true, [system.security.principal.securityidentifier]) | Where-Object {($_.PropagationFlags -match "None") -and ($_.IsInherited -notmatch "True")} | select-object FileSystemRights,AccessControlType,IdentityReference,IsInherited) { $pfadaktuell = "$($acl.path)" $pfadaktuell = $pfadaktuell -replace "Microsoft\.PowerShell\.Core\\FileSystem\:\:","" if ($pfadaktuell -ne $pfadold){ $table += "-------------------------------------------------------------------------" $table += "" $table += "Unterverzeichnis: $pfadaktuell" $table += "" } $userandgroup = "$($ace.IdentityReference | %{$_.Translate([System.Security.Principal.NTAccount])} )" $user = $userandgroup.substring($userandgroup.indexof("\")+1) $table += "Benutzer/Gruppe: $($user)" if ($allusers.indexof("$($user)") -cmatch -1) { $allusers += "$($user)," } $table += "Berechtigung(en): $($ace.FileSystemRights)" $table += "" $pfadold = $pfadaktuell } } $allusersarray = $allusers.Split(",") $table += "" $table += "=========================================================================" $table += "" $table += "BENUTZERGRUPPEN" $table += "" $table += "=========================================================================" do{ for ($a = 0; ($allusersarray.length-2 -cge $a); $a++){ $Gruppe = "$($allusersarray[$a])" $strFilter = "(&(Name=$Gruppe))" $objDomain = New-Object System.DirectoryServices.DirectoryEntry $objSearcher = New-Object System.DirectoryServices.DirectorySearcher $objSearcher.SearchRoot = $objDomain $objSearcher.PageSize = 1000 $objSearcher.Filter = $strFilter $objSearcher.SearchScope = "Subtree" $colProplist = "member" foreach ($i in $colPropList){$objSearcher.PropertiesToLoad.Add($i)} $colResults = $objSearcher.FindAll() $i = 500 foreach ($objResult in $colResults){$i++} #Prüft auf Einträge if ($i -cge 501){ $aMitglieder = foreach ($objResult in $colResults){ $objitem = $objResult.Properties; $objItem.member } for ($b = 0; ($aMitglieder.length-1 -cge $b); $b++){ $aMitglieder2 = $aMitglieder[$b].Split(",") $aMitglieder[$b] = $aMitglieder2[0] if ($allusers.indexof("$($aMitglieder[$b].substring(3))") -cmatch -1) { $allusers += "$($aMitglieder[$b].substring(3))," } } } } $allusersarrayold = $allusersarray $allusersarray = $allusers.Split(",") }Until($allusersarrayold.length -cge $allusersarray.length) for ($a = 0; ($allusersarray.length-2 -cge $a); $a++) { $Gruppe = "$($allusersarray[$a])" $strFilter = "(&(objectCategory=group)(Name=$Gruppe))" $objDomain = New-Object System.DirectoryServices.DirectoryEntry $objSearcher = New-Object System.DirectoryServices.DirectorySearcher $objSearcher.SearchRoot = $objDomain $objSearcher.PageSize = 1000 $objSearcher.Filter = $strFilter $objSearcher.SearchScope = "Subtree" $colProplist = "member" foreach ($i in $colPropList){$objSearcher.PropertiesToLoad.Add($i)} $colResults = $objSearcher.FindAll() $i = 500 $table += foreach ($objResult in $colResults){$i++} #Prüft auf Einträge if ($i -cge 501){ $table += "" $table += "Mitglieder der Gruppe $($Gruppe)" $table += "" $aMitglieder = foreach ($objResult in $colResults){ $objitem = $objResult.Properties; $objItem.member } for ($b = 0; ($aMitglieder.length-1 -cge $b); $b++){ if ($aMitglieder[$b] -notmatch "NULL"){ $aMitglieder2 = $aMitglieder[$b].Split(",") $aMitglieder[$b] = $aMitglieder2[0] $table += $aMitglieder[$b].substring(3) } } $table += "" $table += "-------------------------------------------------------------------------" } } "Done" $table | Set-Content $protokoll
Leider hakt es jetzt an folgendem:
Der Benutzerordner des Domäneusers wird nicht angezeigt. (C:\Users\userxy)
Außerdem werden nicht alle User der Gruppe angezeigt. Ich habe zum Beispiel lokale Adminrechte (bin also in der Gruppe Administratoren) und werde trotzdem nicht in dieser aufgelistet. Außerdem ist z.B. die Gruppe Domäne-Benutzer komplett leer (Es müssten eigentlich um die 130 User drin sein). Fehlt mir eventuell die Verbindung zur Domäne? (Domäne-Admins wird jedoch angezeigt ;) )
MfG Daniel
- Als Antwort vorgeschlagen Michael Arend Montag, 23. April 2012 14:53
- Nicht als Antwort vorgeschlagen Michael Arend Montag, 23. April 2012 14:53
-
Gibt es zu dem Script von Daniel bereits eine Lösung ? Ich suche genau so ein Script wie in der AW von Daniel - jedoch habe ich das Problem das ich die Gruppenmitglieder nicht angezeigt bekomme....
Set-ExecutionPolicy RemoteSigned #Berechtigungsstufe
cls
$pfad = "C:\users" #Ordnerpfad (Muss ohne \ am Ende eingegeben werden!
$protokoll = Get-Date -uFormat "C:\Berechtigungen vom %d. %B.txt" #Dateiname des Protokolls
$pfadold = ""
$user = ""
$allusers = ""
$table = @()
$table += ""
$table += "========================================================================="
$table += ""
$table += "DATEIBERECHTIGUNGEN"
$table += ""
$table += "========================================================================="
$table += ""
foreach ($acl in $($pfad | get-acl) ) {
foreach ($ace in $acl.GetAccessRules($true,$true,
[system.security.principal.securityidentifier]) | Where-Object {($_.PropagationFlags -match "None")} | select-object FileSystemRights,AccessControlType,IdentityReference,IsInherited) {
$pfadaktuell = "$($acl.path)"
$pfadaktuell = $pfadaktuell -replace "Microsoft\.PowerShell\.Core\\FileSystem\:\:",""
if ($pfadaktuell -ne $pfadold){
$table += "Hauptverzeichnis: $pfadaktuell"
$table += ""
}
$userandgroup = "$($ace.IdentityReference | %{$_.Translate([System.Security.Principal.NTAccount])} )"
$user = $userandgroup.substring($userandgroup.indexof("\")+1)
$table += "Benutzer/Gruppe: $($user)"
if ($allusers.indexof("$($user)") -cmatch -1) {
$allusers += "$($user),"
}
$table += "Berechtigung(en): $($ace.FileSystemRights)"
$table += "Vererbung: $($ace.IsInherited)"
$table += ""
$pfadold = $pfadaktuell
}
}
foreach ($acl in $(get-childitem $pfad -recurse -Exclude *.*| get-acl) ) {
foreach ($ace in $acl.GetAccessRules($true,$true,
[system.security.principal.securityidentifier]) | Where-Object {($_.PropagationFlags -match "None") -and ($_.IsInherited -notmatch "True")} | select-object FileSystemRights,AccessControlType,IdentityReference,IsInherited) {
$pfadaktuell = "$($acl.path)"
$pfadaktuell = $pfadaktuell -replace "Microsoft\.PowerShell\.Core\\FileSystem\:\:",""
if ($pfadaktuell -ne $pfadold){
$table += "-------------------------------------------------------------------------"
$table += ""
$table += "Unterverzeichnis: $pfadaktuell"
$table += ""
}
$userandgroup = "$($ace.IdentityReference | %{$_.Translate([System.Security.Principal.NTAccount])} )"
$user = $userandgroup.substring($userandgroup.indexof("\")+1)
$table += "Benutzer/Gruppe: $($user)"
if ($allusers.indexof("$($user)") -cmatch -1) {
$allusers += "$($user),"
}
$table += "Berechtigung(en): $($ace.FileSystemRights)"
$table += ""
$pfadold = $pfadaktuell
}
}
$allusersarray = $allusers.Split(",")
$table += ""
$table += "========================================================================="
$table += ""
$table += "BENUTZERGRUPPEN"
$table += ""
$table += "========================================================================="
do{
for ($a = 0; ($allusersarray.length-2 -cge $a); $a++){
$Gruppe = "$($allusersarray[$a])"
$strFilter = "(&(Name=$Gruppe))"
$objDomain = New-Object System.DirectoryServices.DirectoryEntry
$objSearcher = New-Object System.DirectoryServices.DirectorySearcher
$objSearcher.SearchRoot = $objDomain
$objSearcher.PageSize = 1000
$objSearcher.Filter = $strFilter
$objSearcher.SearchScope = "Subtree"
$colProplist = "member"
foreach ($i in $colPropList){$objSearcher.PropertiesToLoad.Add($i)}
$colResults = $objSearcher.FindAll()
$i = 500
foreach ($objResult in $colResults){$i++} #Prüft auf Einträge
if ($i -cge 501){
$aMitglieder = foreach ($objResult in $colResults){
$objitem = $objResult.Properties; $objItem.member
}
for ($b = 0; ($aMitglieder.length-1 -cge $b); $b++){
$aMitglieder2 = $aMitglieder[$b].Split(",")
$aMitglieder[$b] = $aMitglieder2[0]
if ($allusers.indexof("$($aMitglieder[$b].substring(3))") -cmatch -1) {
$allusers += "$($aMitglieder[$b].substring(3)),"
}
}
}
}
$allusersarrayold = $allusersarray
$allusersarray = $allusers.Split(",")
}Until($allusersarrayold.length -cge $allusersarray.length)
for ($a = 0; ($allusersarray.length-2 -cge $a); $a++)
{
$Gruppe = "$($allusersarray[$a])"
$strFilter = "(&(objectCategory=group)(Name=$Gruppe))"
$objDomain = New-Object System.DirectoryServices.DirectoryEntry
$objSearcher = New-Object System.DirectoryServices.DirectorySearcher
$objSearcher.SearchRoot = $objDomain
$objSearcher.PageSize = 1000
$objSearcher.Filter = $strFilter
$objSearcher.SearchScope = "Subtree"
$colProplist = "member"
foreach ($i in $colPropList){$objSearcher.PropertiesToLoad.Add($i)}
$colResults = $objSearcher.FindAll()
$i = 500
$table += foreach ($objResult in $colResults){$i++} #Prüft auf Einträge
if ($i -cge 501){
$table += ""
$table += "Mitglieder der Gruppe $($Gruppe)"
$table += ""
$aMitglieder = foreach ($objResult in $colResults){
$objitem = $objResult.Properties; $objItem.member
}
for ($b = 0; ($aMitglieder.length-1 -cge $b); $b++){
if ($aMitglieder[$b] -notmatch "NULL"){
$aMitglieder2 = $aMitglieder[$b].Split(",")
$aMitglieder[$b] = $aMitglieder2[0]
$table += $aMitglieder[$b].substring(3)
}
}
$table += ""
$table += "-------------------------------------------------------------------------"
}
}
"Done"
$table | Set-Content $protokoll
Problem ist das ich folgenden Fehler zurückbekomme:
Ausnahme beim Aufrufen von "FindAll" mit 0 Argument(en): "Die angegebene Domäne ist nicht vorhanden, oder es konnte keine Verbindung hergestellt werden.
"
Bei C:\Scripts\1.ps1:85 Zeichen:37
+ $colResults = $objSearcher.FindAll <<<< ()
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodExceptionhat einer die Lösung ?
Vielen Dank für eure mithilfe..
Gruß, Michael