Enteo: Powershell und schnelles Gruppenfüllen
Auch diesmal wieder ein Script, um schnell eine statische Gruppen füllen zu können. Als Input wird nur eine Textdatei mit den PC Namen benötigt. Die Gruppe wird ebenfalls als Name hinterlegt.
Add-PSSnapin NwcServices.BlsAdministration
$server="\\enteoWebServiceServer"
$csvfile="C:\Computerliste.csv"
$groupName="Statische Gruppe"
New-PSDrive -Name emdb -psProvider BlsEmdb -Root $server
cd "emdb:\rootdse"
$csv=import-csv $csvfile
$grp=get-emdbgroup -recurse $groupName
if (-not $grp) {
write-host "ERROR: Software nicht gefunden: " $groupName
}
else
{
$csv | forEach-Object {
write-host $_.pc
$pc=get-emdbcomputer -recurse $_.pc
$grp.addMember($pc)
}
}
Die CSV Datei muss als erste Zeile die Überschrift definieren, d.h. eine Zeile mit PC besitzen. Das Skript selber ist wie üblich aufgebaut. Zuerst wird die Verbindung zum Enteo Webservice Server aufgebaut und danach die Zielgruppe gesucht. Wird diese gefunden, dann wird die CSV Datei geladen und aus jeder Zeile der Wert in der Spalte PC genommen. Nach diesem Namen wird gesucht und der gefundene PC der Gruppe hinzugefügt.
Enteo: Statische Computer-Gruppenzuordnung klonen
Wird Software in Enteo per statischen Gruppen zugeordnet, so ist es bei einem Hardwareaustausch notwendig, die Zuordnungen des alten PCs auf den neuen zu übertragen. Dies kann man natürlich durch manuelles Drag&Drop machen, oder aber über ein kleines Powershell Skript:
param([string]$sourcename="source", [string]$targetname="target")
Add-PSSnapin NwcServices.BlsAdministration
$server="\\enteoserver"
New-PSDrive -Name emdb -psProvider BlsEmdb -Root $server
cd "emdb:\rootdse"
$source=get-emdbcomputer -recurse $sourcename
if ($source)
{
$target=get-emdbcomputer -recurse $targetname
if ($target)
{
$source.GetAssociatedItems() | where {$_.SchemaDisplayName -eq 'Static Group'} |foreach-Object{
write-host "Cloning group " $_.Name " from $sourcename to $targetname"
$_.addMember($target)
}
}
else
{
write-host "Target $targetname cannot be found!"
}
}
else
{
Write-host "Source $sourcename cannot be found!"
}
Das Skript selber ist recht einfach aufgebaut. Es wird der Quellcomputer gesucht und das Objekt abgefragt, welche Verbindungen es hat.
Diese Verbindungen werden nach dem Typ statische Gruppen gefiltert. Über diese Gruppen wird iteriert und jeweils dem Zielobjekt hinzugefügt.
Enteo, Powershell und PnP IDs
Heute mal wieder eine kurze Powershell Zeile, um alle in Enteo hinterlegten PnP-IDs in den Driver Packages auszulesen und auszugeben.
Interessant kann diese Liste sein, um sie mit einer Enteo-externen Inventur zu vergleichen oder zu überprüfen, ob eine neue Hardware bereits unterstützt wird.
(Get-EmdbSoftwarePackage -recurse -Filter "SchemaTag=PnpPackage" |
where {$_.PnPEnabledIdList -ne $null}) |
foreach-object{$_.PnPEnabledIdList.Split(",")} > c:\temp\pnpids.txt
Zuerst wird in allen Software Paketen nach dem Typ PnPPackage gesucht. Aus diesen Ergebnissen werden alle Treiber ohne PnP Ids ausgefiltert. Das Ergebnis ist eine kommaseparierte Liste pro Treiber-Paket, die beim Komma getrennt wird. Am Ende steht eine Liste mit jeweils einer PnP Id pro Zeile:
Enteo, Powershell und Installationsstatus
Zentraler Punkt in dem Script ist die Erkennung in welchem status die Installation gerade ist. Folgende Status sind möglich:
- Installation noch nicht eingeplant
- Installation eingeplant aber noch nicht gestartet
- Installation ist angelaufen aber noch nicht beendet
- Installation ist durchgelaufen
Zur Ermittlung dierer Status greifen wir wieder auf das Auslesen von PolicyInstancen zurück. Dazu werden am Anfang einige Policy-IDs definiert, die die verschiedene Status beschreiben:
Enteo, Powershell, Status und Ping
In diesem Blog-Post werden zwei weitere Komponenten des Scripts vorgestellt: Ping und somit den Status eines Rechners ermitteln und die Ermittlung ob ein Benutzer angemeldet ist.
Je nach dem Status des Systems kann ein Rechner sofort neuinstalliert werden (wenn er aus ist, oder er läuft aber an einem Client kein Benutzer angemeldet ist). Sollte ein Benutzer angemeldet sein, dann darf eine Neuinstallation nur nach einer gewissen Uhrzeit erzwungen werden (z.B. ausserhalb der normalen Arbeitszeit).
Enteo, Powershell, ReInstall
Jetzt wo wir einen Rechner per Powershell aufwecken können kommt als nächstes die Funktion um eine Neuinstallation anzustossen und sie wieder abzubrechen.
Der Abbruch ist deswegen relevant, da u.U. das WoL nicht funktioniert. Startet der Benutzer am nächsten Morgen den PC wieder ganz normal an, so würde die Installation direkt startet und er könnte ein paar Stunden nicht arbeiten. Daher stoppt das Script die Installation automatisch, falls sie nicht innerhalb eines bestimmten Zeitfenster gestartet werden konnte.
Enteo, Powershell und Wake on Lan (WoL)
Wie versprochen geht es weiter mit der Automatisierung von Enteo durch Powershell. In diesem Blog Eintrag nehme ich mir die Funktion für das Aufwecken eines PCs vor. Leider funktioniert hier die WoL Funktion von Enteo nicht immer. Das liegt u.a. daran, dass bei einem neuen PC nicht alle Informationen vorliegen. In den meisten Netzen wird ein normales WoL Paket (ein Broadcast Paket) nicht an alle Subnetze verteilt. Der Enteo Server und der zu weckende Client sind im Allgemeinen in unterschiedlichen Subnetzen beheimatet. Daher muss mit einem directed Broadcast gearbeitet werden. Dazu wird das Broadcast Paket direkt an die Broadcast Adresse des Zielsubnetzes geschickt. Dazu ist aber die IP Adresse und die Subnetzmaske zur Ermittlung der Broadcast Adresse notwendig. Diese Information liegt Enteo nicht immer vor und ich habe noch keinen Weg gefunden, diese Info beim Erstellen des Computerkontos mitzugeben.
Enteo und Automatisierung Teil 4
In diesem Teil werden die Code Schnippchen zusammengebaut. Als Input benötigt das Script eine CSV Datei mit folgendem Header:
client,OU,User,Mac,OS,Softwareliste
- Client: Name des neuen Computers
- OU: Abteilungsname (wird als OrganisationalUnit abgebildet)
- User: Benutzername (wird in Description hinterlegt)
- Mac: MAC-Adresse des Computers (wird in InitialMacAddress hinterlegt)
- OS: Gruppe, in der der Computer für die OS-Installation eingeordnet werden muss
- Softwareliste: CSV Liste der zuzuordnenden Software (muss in ” stehen)
Somit sieht das Powershell Script so aus:
Enteo und Automatisierung Teil 3
Kommen wir nun zum dritten Teil der Powershell Beispiele. Nach diesem Teil haben wir alle wesentlichen Bausteine für die automatisierte Rechnervorbereitung zusammen.
In diesem Teil wird die Software zu dem neu angelegten Computer zugeordnet. Dabei wird davon ausgegangen, dass die Software über statische Gruppen verteilt wird.
Als Input wird das fertige Programm eine CSV Datei erhalten, in der pro Zeile ein Computer steht. In der letzten Spalte mit dem Namen Softwareliste steht eine Liste der zuzuordnenden Software, die wiederum per Komma getrennt ist.
Enteo und Automatisierung Teil 2
In diesem Blog Post werde ich eine Funktion vorstellen, die anhand eines Abteilungsnamens eine Hierarchie von Organisationseinheiten in Enteo erstellt.
Nehmen wir an, dass die Abteilungen nach einem klaren Muster benannt sind. Jede Hierarchie wird durch einen Buchstaben dargestellt. Eine Abteilung ABC steht somit an dritter Stelle in der Hierarchie. Über ihr steht die Abteilung AB und darüber A.
Diese Hierarchie soll beim Provisionieren eines Computers nachgebildet werden. Der neu zu installierende PC aus der Abteilung ABC wird daher in die OU A\AB\ABC abgelegt werden.
Dies ermöglicht einen abteilungsweisen Rollout.
Die hier vorgestellte Funktion muss daher folgendes leisten:
- Überprüfen ob die OU schon existiert
- Falls nicht, den übergebenen Abteilungsnamen zeichenweise zerlegen und bei jeder übergeordneten Abteilung ebenfalls überprüfen, ob diese bereits existiert
- Die neue OU unter der übergeordneten Abteilung anlegen
- Die Abteilungs-OU wieder zurückgeben.