casi4711
Goto Top

PS Filter

Hallo liebe PS Experten,

ich habe ein kleines Problem. Ich habe das foglende Script um derzeit an der Domäne angemeldete Rechner zu sehen. Da ich hier aber auch ping Ergebnisse bekomme bei rechnern, wo ich über \\pc\c$ nicht raufkomme, und diese auch definitiv auch nicht online sein können, geh ich mal von veralteten Dns Einträgen aus. Ich hatte mir nun gedacht, diese, die nicht via Freigabe erreichbar sind rauszufiltern, leider gelingt mir das nicht so, vielleicht hat ja einer eine Idee.


# CSV-Dateipfad
$csvPath = "\\domain\Summary.csv"  

# Manuelles Einlesen der CSV mit korrektem Encoding (ISO-8859-1)
$bytes = [System.IO.File]::ReadAllBytes($csvPath)
$csvContent = [System.Text.Encoding]::GetEncoding("ISO-8859-1").GetString($bytes)  
$csvData = $csvContent | ConvertFrom-Csv -Delimiter ";"  

# Abrufen der Computer, deren Namen mit "A" und "N" beginnen  
$ComputersA = Get-ADComputer -Filter "Name -like 'A*'"  
$ComputersN = Get-ADComputer -Filter "Name -like 'N*'"  
$Computers = $ComputersA + $ComputersN

# Funktion zum Pingen der Computer
function ping2 {
    param(
        [array]$Computers,
        [int]$TimeOut = 800
    )
    
    $Tasks = [System.Collections.Generic.List[Object]]::new()

    foreach ($address in $Computers) {
        $Tasks.Add(
            [pscustomobject]@{
                Target = $address.Name
                pingTask = [System.Net.NetworkInformation.Ping]::new().SendPingAsync($address.Name, $TimeOut)
            }
        )
    }

    $Results = foreach ($Task in $Tasks) {
        try {
            $Task.pingTask.Wait()  # Warte auf das Ende der Ping-Task
            $Status = $Task.pingTask.Result.Status
        } catch {
            $Status = "Error"  
        }
        
        [pscustomobject]@{
            Target = $Task.Target
            Status = $Status
        }
    }

    return $Results
}

# Funktion zur Überprüfung der Erreichbarkeit über SMB
function Check-SMB {
    param (
        [string]$ComputerName
    )
    try {
        $null = Test-Path "\\$ComputerName\c$"  
        return $true
    } catch {
        return $false
    }
}

# Ausführen der Ping-Funktion
$PingResults = ping2 -Computers $Computers

# Erfolgreiche Pings und Beschreibung aus der CSV-Datei zuordnen
$TableRows = ""  
$PingResults | Where-Object { $_.Status -eq "Success" } | Sort-Object Target | ForEach-Object {  
    if (Check-SMB -ComputerName $_.Target) {
        # Suche in der CSV nach dem entsprechenden Computer (PCname)
        $cleanedTarget = $_.Target.Trim('"').ToUpper()  
        $csvEntry = $csvData | Where-Object { 
            ($_.'hostname' -ne $null) -and ($_.hostname.Trim('"').ToUpper() -eq $cleanedTarget)  
        }
        
        # Beschreibung aus CSV auslesen
        $description = if ($csvEntry -and $csvEntry.Beschreibung) { 
            $csvEntry.Beschreibung -join ", "  
        } else { 
            "Keine Beschreibung gefunden"   
        }
        
        # Zeile für die HTML-Tabelle
        $TableRows += "<tr><td>$cleanedTarget</td><td>$description</td></tr>"  
    }
}

# HTML-Code für die Tabelle mit Formatierung und JavaScript für Sortierbarkeit
$html = @"  
<!DOCTYPE html>
<html lang='de'>  
<head>
    <meta charset='UTF-8'>  
    <title>PC-Ping Ergebnisse</title>
    <style>
        body { font-family: Arial, sans-serif; }
        table { width: 100%; border-collapse: collapse; }
        th, td { padding: 8px; text-align: left; cursor: pointer; }
        tr:nth-child(even) { background-color: #e6ffe6; } /* Hellgrüner Zebra-Effekt */
        tr:nth-child(odd) { background-color: #ccffcc; }
        th { background-color: #009900; color: white; }
    </style>
    <script>
        function sortTable(n) {
            var table, rows, switching, i, x, y, shouldSwitch, dir, switchcount = 0;
            table = document.querySelector("table");  
            switching = true;
            dir = "asc";   
            while (switching) {
                switching = false;
                rows = table.rows;
                for (i = 1; i < (rows.length - 1); i++) {
                    shouldSwitch = false;
                    x = rows[i].getElementsByTagName("TD")[n];  
                    y = rows[i + 1].getElementsByTagName("TD")[n];  
                    if (dir == "asc") {  
                        if (x.innerHTML.toLowerCase() > y.innerHTML.toLowerCase()) {
                            shouldSwitch = true;
                            break;
                        }
                    } else if (dir == "desc") {  
                        if (x.innerHTML.toLowerCase() < y.innerHTML.toLowerCase()) {
                            shouldSwitch = true;
                            break;
                        }
                    }
                }
                if (shouldSwitch) {
                    rows[i].parentNode.insertBefore(rows[i + 1], rows[i]);
                    switching = true;
                    switchcount++; 
                } else {
                    if (switchcount == 0 && dir == "asc") {  
                        dir = "desc";  
                        switching = true;
                    }
                }
            }
        }
    </script>
</head>
<body>
    <h2>PC-Ping Ergebnisse</h2>
    <table border="1">  
        <tr>
            <th onclick="sortTable(0)">Computername</th>  
            <th onclick="sortTable(1)">Beschreibung</th>  
        </tr>
        $TableRows
    </table>
</body>
</html>
"@  

# Temporäre HTML-Datei speichern und im Standardbrowser öffnen
$tempHtmlPath = "$env:TEMP\PC_Ping_Ergebnisse.html"  
$html | Out-File -Encoding UTF8 -FilePath $tempHtmlPath
Start-Process $tempHtmlPath


lg
und schönen Sonntag noch

Content-ID: 670967

Url: https://administrator.de/forum/ps-filter-670967.html

Ausgedruckt am: 27.01.2025 um 13:01 Uhr

DivideByZero
DivideByZero 26.01.2025 um 14:14:26 Uhr
Goto Top
Moin,

Da ich hier aber auch ping Ergebnisse bekomme bei rechnern, wo ich über \\pc\c$ nicht raufkomme, und diese auch definitiv auch nicht online sein können, geh ich mal von veralteten Dns Einträgen aus.

da ist etwas anderes im Argen. Wenn ein Ping beantwortet wird, dann hängt da auch ein aktives Gerät, egal, was für eines. Sollte es ein PC sein, dann ist dieser sehr wohl online. Sonst antwortet halt ein anderes Gerät unter dieser IP.
Es wäre daher falsch, hier etwas herauszufiltern mit der Maßgabe, das Ergebnis sei sozusagen nicht korrekt.

Gruß

DivideByZero
casi4711
casi4711 26.01.2025 aktualisiert um 15:03:26 Uhr
Goto Top
Gut klingt ja ziemlich logisch, aber ich brauch ja nur in den Nachbarraum zu gehen um zu sehen dass der rechenr mit dem Namen auch aus ist
DivideByZero
DivideByZero 26.01.2025 um 15:22:49 Uhr
Goto Top
Das ändert nichts daran, dass da ein Gerät antwortet. Klingt nicht logisch, ist Technik 😉
Schau Dir mal die IP-Adressen an, nicht die Namen.
casi4711
casi4711 26.01.2025 um 23:57:39 Uhr
Goto Top
ja aber welche geräte? mir ist ja schon klar dass das wohl Probleme mit dem DNS server vorliegen, zumindest antworten die falschen Rechner, auch mit einem nslookup ist leider nichts rauszufinden.
kpunkt
kpunkt 27.01.2025 um 06:18:10 Uhr
Goto Top
Aus dem Bauch raus sind das Smartphones, die am Wlan angemeldet sind.
Am AP sieht man die Dinger dann oft mit Herstellerbezeichnung.
DivideByZero
DivideByZero 27.01.2025 um 08:47:13 Uhr
Goto Top
Schau Dir doch mal die IPs an (manueller Lookup an dem Recher, der das Skript ausführt, da muss dann ja zwingend eine IP bei raus kommen) und im DHCP, wohin die vergeben werden.
casi4711
casi4711 27.01.2025 um 11:18:14 Uhr
Goto Top
Aber da script filert ja nur Rechner die mit A und N an , also Smarrtphone, und dann auch noch am Wochenende, ich see es via VPN Terminalsever, ist doch äusserst unwahrscheinlich

lg und eien schöne Woche
DivideByZero
DivideByZero 27.01.2025 um 12:41:18 Uhr
Goto Top
Um Gewissheit zu haben, daher die IP-Adressen ermitteln und im DHCP nachschauen, da hast Du es schwarz auf weiß und musst nicht rätseln 😉