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: 12.03.2025 um 16:03 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 😉
user217
user217 27.01.2025 aktualisiert um 14:59:09 Uhr
Goto Top
Das wird so nie funktionieren ohne Agent vom DNS losgelöst..
Das einfachste und schnellste für sowas ist die managementkonsole vom Virenscanner, Remoteinstaller, Hyena etc..
Wenn sowas nicht vorhanden ist kann du zu deinem ping check noch eine wmi abfrage kombinieren um den hostname gegenzuprüfen..
Alternativ ein Monitoringsystem mit Client (z.B. zabbix)
Oder du machst es andersrum, nimm ein arp Tool der nur eindeutige mac Adressen anzeigt (online/offline) und hol dir dann den PC Namen aus einer anderen Quelle dazu.

# Konfiguration des IP-Bereichs
$StartIP = 1
$EndIP = 254
$Subnet = "192.168.1"  # Beispiel: 192.168.1.0/24 Subnetz  

# Funktion, um die IP-Adressen im Bereich zu scannen und online Computer zu finden
function Get-OnlineComputers {
    $onlineComputers = @()
    for ($i = $StartIP; $i -le $EndIP; $i++) {
        $ip = "$Subnet.$i"  
        if (Test-Connection -ComputerName $ip -Count 1 -Quiet) {
            $onlineComputers += $ip
        }
    }
    return $onlineComputers
}

# Funktion, um die angemeldeten Benutzer eines Computers abzufragen
function Get-LoggedInUsers {
    param (
        [string]$ComputerName
    )

    try {
        $sessions = Get-WmiObject -Class Win32_ComputerSystem -ComputerName $ComputerName
        return $sessions.UserName
    } catch {
        Write-Warning "Fehler beim Abrufen von Benutzerdaten von $ComputerName"  
        return $null
    }
}

# Abrufen der online Computer
$onlineComputers = Get-OnlineComputers

# Durchlaufen der online Computer und Anzeigen der angemeldeten Benutzer
foreach ($computer in $onlineComputers) {
    # Computername von der IP-Adresse abrufen
    try {
        $hostName = [System.Net.Dns]::GetHostEntry($computer).HostName
    } catch {
        $hostName = "Unbekannt"  
    }

    # Abrufen der Benutzerinformationen
    $loggedInUser = Get-LoggedInUsers -ComputerName $computer

    if ($loggedInUser) {
        Write-Host "IP-Adresse: $computer, Computername: $hostName, Angemeldeter Benutzer: $loggedInUser"  
    } else {
        Write-Host "IP-Adresse: $computer, Computername: $hostName, Keine Benutzer angemeldet oder keine Verbindung möglich"  
    }
}
casi4711
casi4711 27.01.2025 um 16:05:24 Uhr
Goto Top
okidoki werde ich mal checken, recht herzlichen Dank noch mal
casi4711
casi4711 27.01.2025 aktualisiert um 18:11:15 Uhr
Goto Top
so also das mit deinem IP scan hab ich gemacht, leider bringt mir das nix bei denen wo ich nur die Namen kenne. Hab das mal näher eingegrenzt, in meiner Liste er halte ich neben denen wo ich pingen kann und rauf komme, Rechner die nicht per freigabe \\pc\c$ sondern nur mit \\IP\c$ erreichbar sind, dort hatte ich dann das Glück die IP mittels nslookup rauszufinden. Dann gibt es aber welche wo ich definitiv weiss, PC ist aus, und ich bekomme keine IP vom DNS sondern:

DNS request timed out.
timeout was 2 seconds.
DNS request timed out.
timeout was 2 seconds.
*** Zeitüberschreitung bei Anforderung an dc...

Kommt das jemandem bekannt vor? Also für mein Script, weiss dass kann nur eine Krücke sein, dann nicht die rausfiltern die nicht per Explorer erreichbar, sind , dass muss wohl anders gelösst werden, aber zumindest die wo ich per nslookup diesen Fehler bekomme
kpunkt
kpunkt 28.01.2025 um 06:32:38 Uhr
Goto Top
DNS request timed out.
timeout was 2 seconds.
DNS request timed out.
timeout was 2 seconds.
*** Zeitüberschreitung bei Anforderung an dc...

Was genau ist der Befehl den du da eingibst?
nslookup <Rechnername>
Oder was anderes?

Wie sind denn die IPs bei euch vergeben? DHCP? Habt ihr da evtl. als secondary DNS was von außen stehen (oder gar Google)?
Eine Firewall grätscht da nicht dazwischen?
casi4711
casi4711 28.01.2025 um 19:37:33 Uhr
Goto Top
wir haben 2 reduntante Domainserver und die Adressen werden per DHCP vergeben, von draussen ist da nix;)