. . . und jetzt scripten wir um das ActiveDirectory herum . . .

Vorweg, ich habe 5 Minuten länger gebraucht als geplant, ansonsten möchte ich darauf hinweisen das Mr. Scott immernoch das Maschinendeck am laufen hält und zwar erfolgreich.

Heute habe ich mich mal mit der Windows Powershell beschäftigt. Ich stand vor dem Problem, das ich 400+ Rechner automatisiert mit einem von mir festgelegten Kontenpasswort im ActiveDirectory anlegen wollte. Dabei handelt es sich um die Linuxrechner hier am Standort die in naher Zukunft unsere DXS Umgebung bereichern sollen.

Schritt 1: lernen wie man mit der PowerShell überhaupt etwas macht, das obligatorische “hallo welt!” war sehr einfach.

Schritt 2: Aufrufe über das ADSI-Commandlet um die API zum anlegen von Objekten zu benutzen, das war auch einfach.

Schritt 3: Herausfinden wo im Technet die UserAccountControl-Zahlen stehen, das hat schon etwas länger gedauert

Schritt 4: MultiValue-Felder .. da benutzt man wohl Arrays und .PutEx

Schritt 5: Passwort setzen auf einen vorgegeben Wert und nicht mehr den Computernamen

Das ganze hat mich jetzt die meiste Zeit des Nachmittages beschäftigt, funktioniert aber schon mal soweit. Morgen mach ich das dann noch schön und ordentlich damit keiner mehr meckert.

Und so sieht das bis jetzt aus:

#/*========================================================================*
# * Dennis erster Versuch mit der Powershell
# * Ziel ist es Computerobjekte automatisiert aus einer CSV-Liste anzulegen
# *========================================================================*/ 

#/*------------------------------------------------------------------------*
# * Variablen, was soll man dazu schon sagen ...
# *------------------------------------------------------------------------*/
$dnsdomain = "die.dns.domain.de"
$krbrealm = "DER.KERBEROS.REALM.DE"
$basedn = "ou=bla,dc=fasel,dc=de"
$input = "computer.csv.txt"

#/*------------------------------------------------------------------------*
# * Wie sich die UAC zusammensetzt steht hier: http://support.microsoft.com/kb/305144/
# * 4128 = 4096 + 32 => WORKSTATION_TRUST_ACCOUNT + PASSWD_NOTREQD
# *------------------------------------------------------------------------*/
$AControl = 4128

$adsi = [adsi]"LDAP://ldap-dc/wie/man/ihn/braucht"

Import-csv $input | foreach {
    $de = $adsi.create("Computer", "cn=" + $_.Hostname);
    $de.SetInfo()

    $de.SAMAccountName = $_.Hostname.ToUpper() + "$"
    $de.dNSHostName = $_.Hostname.ToLower() + "." + $dnsdomain
    $hostservice = "HOST/" + $_.Hostname
    $hostfqdnservice = $hostservice + "." + $dnsdomain
    $services = @($hostservice , $hostfqdnservice)

    #/* 2 = Update */
    $de.PutEx(2, "ServicePrincipalName", $services)
    $de.userPrincipalName = "host/" + $_.Hostname + "." + $dnsdomain + "@" + $krbrealm
    $de.SetInfo()

    $de.SetPassword($_.hostpass.ToString())

    $de.userAccountControl = $AControl
    $de.SetInfo()

    $ktfile = $_.Hostname + ".keytab"
    write-host "Computerkonto f�r" $de.userPrincipalName "angelegt"
    ktpass -crypto ALL -ptype KRB5_NT_SRV_HST -out $ktfile -pass $_.hostpass -princ $de.userPrincipalName | out-null

}

Als kleines extra hab ich mir dann doch nochmal ktpass genauer angesehen worüber ich solang geflucht habe. Offensichtlich schreibt das bei uns einfach nur die Passwörter nicht ins Kerberos was die Option +rndpass etwas unsinnig macht.

Wenn man das aber mit “-pass Klartextpasswort” aufruft erzeugt mir das eine Keytab die auch unter Linux richtig funktioniert.

Zum schluss lass ich mir also die Passwörter zufällig von der PowerShell erzeugen und übergebe die als Parameter an ktpass -> Wiese grün …

Aber auch erst morgen …

Mr. Scott macht jetzt Feierabend

Update: Testweise für 150 Klienten ein Konto angelegt mit Zufallspasswort und zugehöriger Keytab, läuft 🙂

Script ist auch etwas schöner bin nur zu faul es upzudaten, aber ich erstelle jetzt auch unter-OUs und teste vorm anlegen ob  vielleicht schon ein gleichnamiges Objekt vorhanden ist.