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.
lg
und schönen Sonntag noch
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 670967
Url: https://administrator.de/forum/ps-filter-670967.html
Ausgedruckt am: 12.03.2025 um 16:03 Uhr
13 Kommentare
Neuester Kommentar
Moin,
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
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
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.
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"
}
}
DNS request timed out.
timeout was 2 seconds.
DNS request timed out.
timeout was 2 seconds.
*** Zeitüberschreitung bei Anforderung an dc...
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>
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?