pixel0815
Goto Top

Freigaben, Freigaberechte und ACL Error Handling

Moin,

ich bins wieder face-wink Aktuell bin ich ganz zufrieden bis auf eine kleine Sache.
Wenn ein Computer nicht via PING erreichbar ist, dann soll das ganz nicht ausgeführt werden.
Aktuell behelfe ich mir das am Ende im Report "Online" ein True oder False steht, ist auch OK so.
Um das ganze zu Beschleunigen würde ich mir wünschen das bei einem Test-Connection False das Skript abbricht und in der Tabelle unter dem catch das ganze ebenfalls einfach dokumentiert wird. Bin aber zu doof. Klappt nicht so.
Hat da jemand ne Idee?

Hier das Skript

$ComputerListe= Get-ADComputer -Server "dc1.test.loc" -SearchBase "OU=Server,DC=test,DC=loc" -Filter 'operatingsystem -like "*server*" -and enabled -eq "true"' -Properties * | Select-Object -expand Name 
$BlackList = "*PS-*" 
$ServerListe =  $Computerliste | Where-Object {$_ -notlike $Blacklist} | sort
$FinalResult = @()
$date= Get-Date -Format dd-MM-yyyy_HH-mm
$Logpath = "D:\_LOG-Output" 
$Counter= 0

foreach ($Server in $ServerListe) {
    
      $counter++
      Write-Progress -Activity 'Processing ShareEnumeration' -Status "Processing $($counter) of $($ServerListe.count)" -CurrentOperation $Server -PercentComplete (($counter / $ServerListe.count) * 100) 

      Write-Host "Server: $Server wird auf Freigaben gescannt..." 
                  
            try{        
                $Shares = Get-SmbShare -CimSession $Server -ErrorAction SilentlyContinue | select Name,Path,ShareState,Description | Where-Object {$_.Name -ne "IPC$"} 
                $Ping = Test-Connection -Count 1 -ComputerName $Server -Quiet
            }
            catch{
            Write-Host "Failed to connect retrieve Shares from $Server" -ForegroundColor Red 
        
    }

                   
      foreach($Share in $Shares){
                           
            $tempObj = "" | Select-Object Server,Online,Info,Beschreibung,FreigabeName,FreigabePfad,FreigabeBenutzer,Freigaberechte,NTFSPfad,NTFSBenutzer,NTFSRechte 

        try{
            $Ping = Test-Connection -Count 1 -ComputerName $Server -Quiet

            $ShareRights = Get-SmbShareAccess -CimSession $Server $Share.Name -ErrorAction Stop
            $NTFS = Invoke-Command -Computer $Server -ArgumentList $Share,$NTFS -ScriptBlock{
            param($Share,$NTFS)
            Get-Acl $Share.Path -ErrorAction SilentlyContinue | select -Expand Access | Where-Object {$_.IdentityReference -Match "Jeder" -or $_.IdentityReference -match "test" -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}
           
             
            # Erstelle Liste
            # --------------

            $tempObj.Server = $Server
            $tempObj.Online = $ping
            $tempObj.Info = "" 
            $tempObj.FreigabeName = $Share.Name
            $tempObj.FreigabePfad = $Share.Path
            $tempObj.Beschreibung = $Share.Description
            $tempObj.FreigabeBenutzer = $ShareRights.AccountName -join "`n" 
            #$tempObj.Zugriffstyp = $ShareRights.AccessControlType -join " / "   
            $tempObj.Freigaberechte = $ShareRights.AccessRight -join "`n" 
            #$tempObj.NTFSACLs = ""#$NTFS -join " / " 
            $tempObj.NTFSPfad = $ACLList.Pfad -join "`n" 
            $tempObj.NTFSBenutzer = $ACLList.Benutzer -join "`n" 
            $tempObj.NTFSRechte = $ACLList.Rechte -join "`n" 
            $FinalResult += $tempObj
            
            }
            catch{
            Write-Host "Failed to connect retrieve Share Details from $Server" -ForegroundColor Red 
            $Ping = Test-Connection -Count 1 -ComputerName $Server -Quiet 
            $tempObj.Server = $Server
            $tempObj.Online = $ping
            $tempObj.Info = "Manuell prüfen" 
            $FinalResult += $tempObj
            }
           
        }

    }


$FinalResult | ft -AutoSize -Wrap -GroupBy Server

# HTML Header CSS Style zur besseren sichtbarkeit
$HtmlHead = '<style> 
    body {
        background-color: white;
        font-family:      "Calibri"; 
    }

    table {
        border-width:     1px;
        border-style:     solid;
        border-color:     black;
        border-collapse:  collapse;
        width:            100%;
        word-break:       normal;

    }

    th {
        border-width:     1px;
        padding:          5px;
        border-style:     solid;
        border-color:     black;
        background-color: #98C6F3;
    }

    td {
        border-width:     1px;
        padding:          5px;
        border-style:     solid;
        border-color:     black;
        background-color: White;
    }

    tr {
        text-align:       left;
    }

   
</style>' 
$tableFragment = $FinalResult |ConvertTo-Html -Head $HTMLHead
$tableFragment | out-file "$Logpath\Dom-Share_Report-$Date.html" -Encoding UTF8   
$FinalResult | Export-CSV "$Logpath\Dom-Share_report-$Date.csv" -Delimiter "`t" -Encoding unicode -NoTypeInformation -Force 

Content-Key: 52953935343

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

Printed on: April 27, 2024 at 07:04 o'clock

Member: accessViolation
accessViolation Mar 19, 2024 updated at 07:52:26 (UTC)
Goto Top
Moin,

hier ein kleiner Ansatz für deine grauen Zellen:

# Der Name des Zielcomputers
$computerName = "ZielComputerName" #anpassen auf deine Bedürfnisse  

# Versucht, den Computer zu pingen
try {
    $pingResult = Test-Connection -ComputerName $computerName -Count 1 -ErrorAction Stop
    Write-Host "$computerName ist erreichbar." -ForegroundColor Green  
    # hier deinen "wenn ping erfolgreich" Code rein 

}
catch {
    # Wenn der Ping fehlschlägt, wird der Catch-Block ausgeführt
    Write-Host "$computerName ist nicht erreichbar." -ForegroundColor Red  
    Write-Host "Script wird beendet" -ForegroundColor Red  
}

Edit: ich habe deinen Code zuvor nicht geprüft, sehe aber, dass Du das eigentlich schon eingebaut hast. Zeile 18. Musst nur die Blöcke nun etwas herumschubsen an den richtigen Ort.

Viel Spaß + Erfolg

Gruß