Der heutige Artikel ist der zweite in meiner kleinen Reihe zum PowerShell-Skript NetSendAll, mit dem ich allen PCs unseres Netzwerkes über unterschiedliche Subnets hinweg mittels net send eine Nachricht schicken kann.
Gestern habe ich die Funktion PingPC vorgestellt, die einen einzelnen PC anpingt. Doch woher bekomme ich nun die Info, welche PCs überhaupt angepingt werden sollen? Ganz einfach: Aus einer simplen Textdatei. Diese kann z.B. mittels eines weiteren PowerShell-Skripts mit den PC-Namen aus dem Active Directory gefüllt, oder händisch angelegt werden. Es könnte bspw. so aussehen:
#columns;Name;IP;MAC macke;192.168.100.1;ab-cd-ef-ab-cd-ef macke2;192.168.100.2;ab-cd-ef-ab-cd-f0
Die erste Zeile definiert mir dabei die Informationen, die in jeder folgenden Zeile kommasepariert enthalten sind (PC-Name, IP und MAC). Aus jeder folgenden Zeile der Datei erstellt meine Funktion ReadTextFile jetzt ein anonymes Objekt mit Attributen, deren Bezeichner den in der ersten Zeile definierten entsprechen, also z.B.:
$pc # das anonyme Objekt $pc.Name # ein Attribut "Name", das für die zweite Zeile "macke" enthalten würde $pc.IP $pc.MAC
So kann ich komfortabel auf die in der Textdatei enthaltenen Werte zugreifen und sie weiterverarbeiten. Sollte die erste Zeile fehlen, werden die Spalten einfach nach dem Schema col1, col2 etc. durchnummeriert.
# Reads the content of a textfile and returns the lines as anonymous objects with named attributes.
# Lines starting with "#" are ignored (comments).
# If the first line starts with "#columns" the following values are taken as attribute names for the anonymous objects,
# otherwise they will be named col1, col2, etc.
function ReadTextFile($filename)
{
if (!(test-path $filename))
{
write-host ("File not found: " + $filename) -foregroundcolor "red";
exit;
}
$contents = @();
$lineCounter = 0;
$c = get-content $filename;
foreach ($line in $c)
{
if ($line -ne $null -and $line.trim() -ne "")
{
$lineCounter++;
# read column headers
if ($lineCounter -eq 1)
{
if ($line.startsWith("#columns;"))
{
$headers = $line.substring("#columns;".length, ($line.length - "#columns;".length)).split(";");
}
else
{
$colCounter = $line.split(";").count;
$headers = @();
for ($i = 0; $i -lt $colCounter; $i++)
{
$headers += ("col" + $i);
}
}
}
# create anonymous object from line
if (!$line.startsWith("#"))
{
# create object with header names as properties
$l = "" | select-object $headers;
$c = $line.split(";");
for ($i = 0; $i -lt $headers.count; $i++)
{
$l.($headers[$i]) = $c[$i];
}
$contents += $l;
}
}
}
return $contents;
}
Morgen geht es dann weiter mit der letztlichen Funktion NetSendAll.
Pingback:NetSendAll Teil 3: PowerShell-Script NetSendAll » Stefan Macke