pixel0815
Goto Top

Freigabe Informationen via Powershell Sammeln

Moin,

eigentlich wollte ich mir mit diesem Skript alle Freigaben und die Freigabeberechtigungen anzeigen lassen.
Allerdings ist der Output nicht wie ich es mir erhofft hatte. Ich sehe nur die letzte Freigabe und das mehrmals.
Hat jemand ein Tipp? Danke schonmal face-smile

$Serverliste = "Testrechner1"  
$FinalResult = @()
foreach ($Server in $ServerListe) {

    $tempObj = "" | Select-Object Server,FreigabeName,FreigabePfad,FreigabeStatus,Beschreibung,Benutzerkonto,FreigabeTyp,Freigaberechte  
    
    try {
        $Shares =Get-SmbShare -CimSession $Server | select Name,Path,ShareState,Description    
                
        foreach($Share in $Shares){
            
            $ShareRights = Get-SmbShareAccess -CimSession $Server $Share.Name | select-object Name,AccountName,AccessControlType,AccessRight,PSComputerName

            $tempObj.Server = $ShareRights.PSComputerName
            $tempObj.FreigabeName = $Share.Name
            $tempObj.FreigabePfad = $Share.Path
            $tempObj.FreigabeStatus = $Share.ShareState
            $tempObj.Beschreibung = $Share.Description
            $tempObj.Benutzerkonto = $ShareRights.AccountName -join " / "  
            $tempObj.FreigabeTyp = $ShareRights.AccessControlType
            $tempObj.Freigaberechte = $ShareRights.AccessRight -join " / "  
            $FinalResult += $tempObj
            }
         }
    catch {
        $tempObj.Server = ""  
        $tempObj.FreigabeName = ""  
        $tempObj.FreigabePfad = ""  
        $tempObj.Beschreibung = ""  
    }
    #$FinalResult += $tempObj
}
return $FinalResult

Content-ID: 24030146943

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

Ausgedruckt am: 21.11.2024 um 20:11 Uhr

12168552861
Lösung 12168552861 15.03.2024 aktualisiert um 09:10:23 Uhr
Goto Top
Morsche.
Zeile 5 nach Zeile 11 in die Share-Schleife verschieben, denn sonst änderst du für jedes Share immer wieder das selbe Objekt und erstellst kein neues 😉.
Deswegen sind am Ende alle Objekte im
Array gleich wie das letzte, weil es die selben Instanzen sind ...

Der Jung hier hat gestern den selben Fehler begangen
Problem mit verschachtelten ForEachs in Powershell

Gruß pp.
CypH3r-LE
CypH3r-LE 15.03.2024 um 09:47:36 Uhr
Goto Top
Servus,

evtl. möchtest Du noch ein wenig tiefer rein schauen, in einzelne Freigaben bzw. Ordner.
Dafür habe ich bei uns, nebst anderen, auch dieses Script im Einsatz:
$suchordner = "freigabe"  

$objects = Get-ChildItem -Path $suchordner -Recurse | ?{$_.PSIsContainer}
$arrPerm = @()
foreach ($obj in $objects){
    $rules = (get-acl $obj.FullName).Access
    foreach($rule in $rules){
                    $arrPerm += New-Object PSObject -Property @{Ordner=$obj.FullName;Identity=$rule.IdentityReference;Typ=$rule.AccessControlType;Rechte=$rule.FileSystemRights;Vererbt=$rule.IsInherited}
            }
}
$arrPerm | ft Ordner,Identity,Typ,Rechte,Vererbt | Out-File c:\[OUTPUT].txt
pixel0815
pixel0815 15.03.2024 um 11:14:27 Uhr
Goto Top
Ja genau. Bisschen NTFS würd ich da auch gerne auslesen.

$Serverliste = "Testrechner1"    
$FinalResult = @()

foreach ($Server in $ServerListe) {     
    
      $Shares =Get-SmbShare -CimSession $Server | select Name,Path,ShareState,Description | Where-Object {$_.Name -ne "IPC$"}     
                   
      foreach($Share in $Shares){

             
            $tempObj = "" | Select-Object Server,FreigabeName,FreigabePfad,Beschreibung,FreigabeBenutzer,Zugriffstyp,Freigaberechte,NTFSBenutzer,NTFSRechte  
            
            $ShareRights = Get-SmbShareAccess -CimSession $Server $Share.Name 
            
            $NTFS =Get-Acl $Share.Path | select -Expand Access | Where-Object {$_.IdentityReference -Match "Jeder" -or $_.IdentityReference -match "test.dom" -or $_.IdentityReference -match "VORDEFINIERT"}|  
             % { $Share.Path  + "," + $_.IdentityReference + "," + $_.FileSystemRights }  

            $ACLList = @() 
            foreach($AclLine in $NTFS){
                   $tempList = "" | Select-Object Pfad,Benutzer,Rechte  
                   $AclLine =$ACLLine.split(',')  
                   $TempList.Pfad = $AclLine[0]
                   $TempList.Benutzer = $AclLine[1]
                   $TempList.Rechte = "Benutzer:" + $AclLine[1] + " "+ $AclLine[2] + $AclLine[3] + $AclLine[4]  
                   $ACLList += $tempList
            }

            $tempObj.Server = $Server
            $tempObj.FreigabeName = $Share.Name
            $tempObj.FreigabePfad = $Share.Path
            $tempObj.Beschreibung = $Share.Description
            $tempObj.FreigabeBenutzer = $ShareRights.AccountName -join " /"  
            $tempObj.Zugriffstyp = $ShareRights.AccessControlType -join " / "    
            $tempObj.Freigaberechte = $ShareRights.AccessRight -join " / "  
            #$tempObj.NTFSACLs = ""#$NTFS -join " / " 
            #$tempObj.NTFSPfad = ""#$ACLList.Pfad -join " / " 
            $tempObj.NTFSBenutzer = $ACLList.Benutzer -join " / "  
            $tempObj.NTFSRechte = $ACLList.Rechte -join " / "  
            $FinalResult += $tempObj
            }
           
}


return $FinalResult | ft -Autosize # Out-GridView
}

Die Ausgabe ist schon gar nicht mal so schlecht.
Überlege noch wie man das etwas hübscher gestalten kann.
Damit ich die ganzen -Join nicht mehr verwenden muss.

Server           : Testrechner1
FreigabeName     : print$
FreigabePfad     : C:\Windows\system32\spool\drivers
Beschreibung     : Druckertreiber
FreigabeBenutzer : Jeder /VORDEFINIERT\Administratoren
Zugriffstyp      : Allow / Allow
Freigaberechte   : Read / Full
NTFSBenutzer     : Jeder / Jeder / VORDEFINIERT\Administratoren / VORDEFINIERT\Administratoren
NTFSRechte       : Benutzer:Jeder ReadAndExecute Synchronize / Benutzer:Jeder -1610612736 / Benutzer:VORDEFINIERT\Administratoren 268435456 / Benutzer:VORDEFINIERT\Administratoren FullControl

Server           : Testrechner1
FreigabeName     : PIXSHARE
FreigabePfad     : C:\USERS\Test1\APPDATA\ROAMING\ISIS DRIVERS\NETWORK SETUP
Beschreibung     : ISIS Networking Share
FreigabeBenutzer : Everyone
Zugriffstyp      : Allow
Freigaberechte   : Full
NTFSBenutzer     : VORDEFINIERT\Benutzer / VORDEFINIERT\Administratoren / test.dom\test1
NTFSRechte       : Benutzer:VORDEFINIERT\Benutzer ReadAndExecute Synchronize / Benutzer:VORDEFINIERT\Administratoren FullControl / Benutzer:test.dom\test1 FullControl
pixel0815
pixel0815 15.03.2024 um 11:18:16 Uhr
Goto Top
Und danke dir ganz herzlich pp face-smile Das hat geklappt. Hab irgendwie den Wald vor lauter Bäumen nicht mehr gesehen.
CypH3r-LE
CypH3r-LE 15.03.2024 um 11:49:55 Uhr
Goto Top
Servus,

zur Gestaltungsfrage...
Du hast die Wahl.
Zeile 33-47

# Ordner der gescannt werden soll
$ORDNER = "C:\Temp"  
# Ausgabe-Datei (HTML)
$OUTPUT = $env:USERPROFILE + "\Desktop\Berechtigungen.html"  


function List-FolderRights{
    param(
        [parameter(mandatory=$true)][string]$RootFolder,
        [bool]$IncludeInheritedRights = $true
    )
    $accessrules = @()
    $folders = gci $RootFolder -Recurse | ?{$_.PSIsContainer}
    foreach($folder in $folders){
        try{
            $acl = Get-Acl $folder.FullName
            $acl.GetAccessRules($true,$IncludeInheritedRights,[System.Security.Principal.NTAccount]) | %{
                $accessrules += New-Object PSObject -Property @{
                    "Folder" = $folder.FullName  
                    "Account" = $_.IdentityReference  
                    "Rights" = $_.FileSystemRights  
                    "AccessControlType" = $_.AccessControlType  
                    #"InheritanceFlags" = $_.InheritanceFlags  
                }
            }
        }catch{write-host $_.Exception.Message -ForegroundColor Red}
    }
    return $accessrules
}

$result = List-FolderRights $ORDNER -IncludeInheritedRights $false | sort Folder,Account | select Folder,Account,Rights,AccessControlType,InheritanceFlags

# OUTPUT OPTIONS --------------------------------------

# Output to Console
# $result | ft -AutoSize -Wrap -GroupBy Folder

# Output to GridView
# $result | out-gridview

# Output to CSV
# $result | export-csv "C:\temp\folderrights.csv" -NoType -Delimiter ";" -Encoding UTF8  

# Output to very simple html table
# $result | Convertto-HTML -Title "Berechtigungen" | out-file "C:\temp\folderrights.html" -Encoding UTF8  

#-------------------------------------------------------------

# HTML Output

$html = @"  
<!doctype html>
<html>
<head>
<meta charset="utf-8">  
<title>Berechtigungen</title>
<style type="text/css">  
body {
	font-family: Verdana, Geneva, sans-serif;
	font-size: 13px;
}
H1{font-size:1.8em}
table td {
	vertical-align:middle;	
}
th {
	text-align: left;
	background-color: #666;
	color: white;
	height: 20px;
	padding: 5px;
}
tr.bodyrow td{
	height: 20px;
	border-bottom-width: 1px;
	border-bottom-style: dashed;
	border-bottom-color: #CCC;
}
tr.grouprow td {
	height: 20px;
	border-bottom-width: 1px;
	border-bottom-style: dashed;
	border-bottom-color: #CCC;
	background-color: #96B0F5;
	padding: 2px;
	font-weight: bold;
	color: #333;
}
</style>
</head>

<body>
<h1>Übersicht der Berechtigungen</h1>
<table width="100%" border="0" cellspacing="0" cellpadding="0">  
  <tr>
    <th>Folder</th>
    <th>Account</th>
    <th>Rights</th>
    <th>Type</th>
    <th>InheritanceFlags</th>
  </tr>
  $($result | group Folder | %{
@"  
<tr class="grouprow">  
    <td colspan="5">Ordner: $($_.Name)</td>  
</tr>
"@  
$($_.Group | %{
@"  
<tr class="bodyrow">  
    <td>$($_.Folder)</td>
    <td>$($_.Account)</td>
    <td>$($_.Rights)</td>
    <td>$($_.AccessControlType)</td>
    <td>$($_.InheritanceFlags)</td>
</tr>
"@  
})
})
</table>
</body>
</html>
"@ | out-file $OUTPUT -Encoding UTF8  
Start-Process $OUTPUT

Das ist auch gleichzeitig noch ein anderes Script welches wir nutzen.
12168552861
12168552861 15.03.2024 aktualisiert um 11:59:19 Uhr
Goto Top
Zitat von @CypH3r-LE:
Das ist auch gleichzeitig noch ein anderes Script welches wir nutzen.

Was dann wohl von hier stammt.
Vergebene Rechte dokumentieren - Gibt es hierfür ein anwenderfreundliches Tool?
CypH3r-LE
CypH3r-LE 15.03.2024 um 12:03:01 Uhr
Goto Top
Zitat von @puderpader:

Zitat von @CypH3r-LE:
Das ist auch gleichzeitig noch ein anderes Script welches wir nutzen.

Was dann wohl von hier stammt.
Vergebene Rechte dokumentieren - Gibt es hierfür ein anwenderfreundliches Tool?

🤣..Nee tatsächlich nicht.
Hatte ich damals in den tiefen des Netzes gefunden und für "gut" bewertet.