Enteo und Automatisierung Teil 2

toolsIn 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:

  1. Überprüfen ob die OU schon existiert
  2. Falls nicht, den übergebenen Abteilungsnamen zeichenweise zerlegen und bei jeder übergeordneten Abteilung ebenfalls überprüfen, ob diese bereits existiert
  3. Die neue OU unter der übergeordneten Abteilung anlegen
  4. Die Abteilungs-OU wieder zurückgeben.

function createOU
{param([string]$name,$ou)
    cd $ou.path
    $ouRT=Get-EmdbOrganizationalUnit -recurse $name
    if (-not $ouRT) {
        $name.toCharArray() | foreach {
            $ouname=$ouname + $_
            $oupath=$ou.path + "\" + $ouname
            $ou=Get-EmdbOrganizationalUnit -recurse $ouname
            if (-not $ou) {
                write-host "Anlegen: " $oupath
                $ou=new-EmdbOrganizationalUnit -Path $oupath
            }
        }
        $ou
    }
    else
    {
        $ouRT
    }
}

Folgendes passiert hier:

  • Zeile 2: die Funktion benötigt als Übergabeparameter einen String mit dem Namen der Abteilung und ein Emdb-OrganisationalUnit Objekt unter dem die neuen OUs angelegt bzw. gesucht werden sollen
  • Zeile 3: Wechsel in den übergebenen Startpfad
  • Zeile 4: Suchen, ob es schon eine OU mit Namen gibt (unterhalb des Startpfads)
  • Zeile 5: Falls keine existiert, dann muss eine neue angelegt werden.
  • Zeile 6: den OU Namen in ein Zeichenarray zerlegen und jedes Zeichen einzelnd durchlaufen
  • Zeile 7+8: den aktuellen OU Namen in der Hierarchie wieder zusammensetzen und den aktuellen OU Pfad entsprechend erweitern
  • Zeile 9-10: kontrollieren, ob diese Hierarchiestufe schon existiert
  • Zeile 11: falls nicht, die OU mit New-EmdbOrganisationalUnit anlegen.
  • Zeile 15-19: Ein Powershell-Funktion gibt ein Ergebnis wieder zurück, indem es die ensprechenden Objekte einfach in die Pipe ausgibt

Funktionen in Powershell werden etwas anders als in den meisten anderen Programmiersprachen aufgerufen. Parameter werden nicht durch Komma, sondern durch ein Leerzeichen getrennt. Diese Funktion lässt sich somit folgendermaßen aufrufen:

$ou=Get-EmdbOrganizationalUnit -recurse "Powershell"
$ou=createOU "ABC" $ou
This entry was posted in Deutsch, Powershell, Tools and tagged , , . Bookmark the permalink.

2 Responses to Enteo und Automatisierung Teil 2

  1. Hallo Markus,

    ein kleiner Tipp: die Suche mit -recurse ist aus Performance-Askpekten nicht ganz optimal, weil ja immer der ganze Baum ab dem Startknoten nach unten durchsucht werden muss.

    Ob ein Pfad (auch im emdb-Laufwerk) existiert, kann man immer auch mit dem PowerShell-Cmdlet “test-path” abfragen. Das liefert True oder False zurück, je nachdem ob der Pfad eben existiert oder nicht…

    Grüße Frank

  2. markus says:

    Hi,

    da hast du sicherlich recht, aber bei knapp 200 OUs und 3000 Rechnern ist der Performanceverlust bei wenigen Läufen wahrscheinlich nicht so hoch. Meine herangehensweise ist bei Programmierung eher das Programm/Script in einem sinnvollen Aufbau zum Laufen zu bekommen und erst wenn sich später Performanceprobleme einstellen zu schauen, in welchem Teilbereich die liegen und genau den zu optimieren. Sonst verkünstelt man sich noch an einer kleinen Funktion, die am Ende nur zu 2% zur langsamen Geschwindigkeit beiträgt

    Schönes WE!

    Markus

Leave a Reply to markus Cancel reply