Active Directory Funktionen - Neue Version 1.5.0.0 freigegeben!

  • Eine Frage zu AD_Open: Ein Rechner, der ins AD soll, hat ja noch keinerlei Login-Informationen des AD sondern lediglich einen User mit entsprechenden Rechten (Admin). Nun habe ich versucht, mich mit AD_Open(Username, Passwort, Domain) an der Domäne anzumelden. Dies erzeugte einen Fehler 6 der besagt, daß ich einen DC sowie ConfigParam angeben soll. DC ist mir ja soweit noch klar, aber was ist mit ConfigParam gemeint? Wenn ich nur Benutzername und Passwort angebe, dann bekomme ich einen Fehler in @Error "0" und in @Extended auch "0" ...

    Eine Frage zu AD_CreateComputer: Hier kann ich machen was ich will. Das AD_Open ist erfolgreich, leider liefert mit AD_CreateComputer in @Error und @Extension jeweils nur den Wert "0" zurück. Was mache ich hier falsch? Der Rechnername ist der, den ich mit @ComputerName ermittle, der Anmeldename ist identisch mit dem bei AD_Open. Und die OU ist auch korrekt. Wenn ich den Rechner mit meinen Anmeldedaten manuell ins AD aufnehme, dann klappt alles. Auch mit dem NetDom.exe und den Anmeldedaten bzw. der OU funktioniert es. Insofern liegt es zumindest einmal nicht an fehlenden Rechten im AD, irgendetwas habe ich hier wohl falsch gesetzt. Ich bin mit meiner "Weisheit" ein wenig am Ende ... :S

    In dem Zusammenhang (weil - soweit komme ich ja gar nicht): Gibt es etwas, daß ich bei AD_JoinDomain beachten müßte?

    Zu _AD_Open: Du brauchst die komplette Palette an Parametern. Die Beschreibung für _AD_Open bringt folgendes Beispiel für die letzten 3 Parameter:

    $sAD_DNSDomainParam = "DC=subdomain,DC=example,DC=com"
    $sAD_HostServerParam = "servername.subdomain.example.com"
    $sAD_ConfigurationParam = "CN=Configuration,DC=subdomain,DC=example,DC=com"

    Du kannst Dir aber auch die Werte auf einem Computer der in der Domäne ist ausgeben lassen:

    [autoit]

    _AD_Open()
    ConsoleWrite($sAD_DNSDomain & @CRLF)
    ConsoleWrite($sAD_HostServer & @CRLF)
    ConsoleWrite($sAD_Configuration & @CRLF)
    _AD_Close()

    [/autoit]


    Die Fehlerbehandlung bei _AD_Open() ist - bedingt durch das MS Betriebssystem - derzeit mehr als suboptimal. Mit Windows 7 wird das besser. Sobald ich einen W7 Rechner in der Domäne in meine Finger kriege, wird die Fehlerbehandlung optimiert.

    Zu _AD_JoinDomain: _AD_CreateComputer und _AD_JoinDomain gehören zusammen. Bei _AD_CreateComputer wird ein User/eine Gruppe definiert, der diesen Computer in die Domäne hängen darf. Bei _AD_JoinDomain muss dann dieser User bzw. ein User der Mitglied der angegebenen Gruppe ist spezifziert werden.
    Der Computer wird in die durch _AD_Open definierte Domäne gehängt.

    Das Thema ist etwas kompliziert, aber ich hoffe, dass ich die letzten Klarheiten beseitigen konnte.

  • Hallo Water,

    vielen Dank für Deine Antwort.

    AD_Open() funktioniert auch soweit, wenn ich alle Parameter mitgebe. Die Werte hatte ich so ermittelt, wie Du auch vorgeschlagen hat. Das Problem liegt leider immer noch beim Abarbeiten der Funktion AD_CreateComputer(). Rechnername, Benutzername (mal mit, mal ohne Domäne for dem Account), sowie OU sind "eigentlich" ok. Wenn ich den Rechner mit diesen Parametern und NetDom.exe ins AD bringe, dann klappt dies auch wie erwartet. Hast Du evtl. hierfür noch einen Tipp für mich.

    AD_JoinDomain kommt dann als nächstes ... :rolleyes:

    BTW: Deine UDF ist klasse. Der Aufbau der Funktionen ist auch absolut gelungen und vollkommen nachvollziehbar. Insofern keine Panik, verwirrt hat mich das jetzt nicht ... :thumbup:

    Viele Grüße & einen schönen Montag
    TheDude

    Cuiusvis hominis est errare, nullius nisi insipientis in errore perseverare.
    [Cicero, Philippica 12,2]

  • ... Das Problem liegt leider immer noch beim Abarbeiten der Funktion AD_CreateComputer(). Rechnername, Benutzername (mal mit, mal ohne Domäne for dem Account), sowie OU sind "eigentlich" ok. Wenn ich den Rechner mit diesen Parametern und NetDom.exe ins AD bringe, dann klappt dies auch wie erwartet. Hast Du evtl. hierfür noch einen Tipp für mich.

    Kannst Du mir Deinen Funktionsaufruf von _AD_CreateComputer mit allen Parametern (bzw. den Inhalt der Variablen) mal zeigen?
    Vielleicht liegt hier das Problem?
    Andere Frage: Kannst Du @error und @extended nach dem Aufruf von _AD_CreteComputer ausgeben lassen? Vielleicht gibt das mehr Info.

  • Guten Morgen Water,

    ... kein Thema, gerne. Hier die Parameter zu AD_Open():

    _AD_Open("Domäne\MeinLoginName","MeinPWD","Domäne.XYZ.com","StdDC.Domäne.XYZ.com","CN=Configuration," & "DC=Domäne,DC=XYZ,DC=com")

    Das ist alles OK und läuft soweit.

    Und hier nun die Paramater zu AD_CreateComputer():

    $OU="OU=Workstations,OU=ORT,OU=LAND,OU=REGION,OU=COMPANY,DC=DOMÄNE,DC=XYZ,DC=com"
    $ComputerName=@ComputerName
    $ADStatus = _AD_CreateComputer($OU,$ComputerName,"MeinLoginName")

    Rückgabewerte: $ADStatus: 0, @Error: -2147352567, @Extended: 0

    Aber: Das Computer-Object wurde im AD und in der richtigen OU angelegt, dennoch ist der Rückgabewert von AD_CreateComputer() "0", also Fehler. ?(

    Was läuft hier falsch? Ich bin mit meiner "Weisheit" nun wirklich am Ende ... ;(

    Nach einem erneuten Aufruf der Funktion AD_CreateComputer() bekomme ich dann auch als @Error eine "2", die nach Doku besagt, daß das Object bereits existiert. Interessant finde ich auch, daß ich bei AD_Open() den Benutzernamen mit "Domäne\MeinLoginName" angeben muß, bei AD_CreateComputer() dies aber zu einem Fehler führt. Hier darf ich nur "MeinLoginName" übergeben, sonst wird der User nicht gefunden. Dies ist aber kein grundsätzliches Problem.

    Viele Grüße
    TheDude

    Cuiusvis hominis est errare, nullius nisi insipientis in errore perseverare.
    [Cicero, Philippica 12,2]

  • Bei _AD_Open fällt mir das Format des 3. Parameters auf. Meiner Meinung nach müsste der Aufruf lauten:
    _AD_Open("Domäne\MeinLoginName", "MeinPWD", "DC=Domäne,DC=XYZ,DC=com", "StdDC.Domäne.XYZ.com", "CN=Configuration,DC=Domäne,DC=XYZ,DC=com")

    _AD_CreateComputer sieht gut aus. Wenn der Computer in der OU angelegt wird, die nachfolgende Rechtevergabe aber nicht klappt, dann sieht es so aus, als ob der User mit dem Du Dich beim AD angemeldet hast ("Domäne\MeinLoginName") nicht ausreichend Rechte auf dem AD hat.
    Kannst Du _AD_Open mal mit den Credentials eines Domänen Admins aufrufen?

    Die unterschiedliche Schreibweise der Benutzernamen bei _AD_Open und _AD_Createcomputer liegt daran, dass die Funktionen unterschiedliche Formen des Parameters akzeptieren (siehe Help Files zu den Funktionen). _AD_Open erlaubt Windows Login Name, NetBIOS Login Name und User Principal Name während _AD_CreateComputer einen SamAccountName für den User/die Gruppe benötigt.

  • _AD_CreateComputer sieht gut aus. Wenn der Computer in der OU angelegt wird, die nachfolgende Rechtevergabe aber nicht klappt, dann sieht es so aus, als ob der User mit dem Du Dich beim AD angemeldet hast ("Domäne\MeinLoginName") nicht ausreichend Rechte auf dem AD hat.
    Kannst Du _AD_Open mal mit den Credentials eines Domänen Admins aufrufen?

    Die Aussage ist durchaus richtig und andererseits interessant. Ich musste selbst nach einiger Zeit feststellen, das ein "normaler" Domänenbenutzer bis max. 10 Computer zu einer Domäne hinzufügen darf ! Das war die Wucht. Lässt sich aber per Default-Domain-Policy" unterbinden.

    Und dann kann es natürlich sein, das o.a. Problem bei anschließender Rechteveränderung erst auftritt.

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • Hallo Water,

    danke für den Hinweis mit dem Format des 3. Paramaters. Ich werde es anpassen und schauen, was dann passiert. Melde mich dann noch dazu ... vielleicht hilft das ja bei dem anderen Problem ...

    Leider habe ich keinen Zugriff auf die Domäne als Domänen-Admin. Grundsätzlich kann ich aber einen Rechner der Domäne hinzufügen, sei es manuell über Arbeitsplatz->Eigenschaften ... oder aber über z. B. NetDom.exe. Insofern müßten die Rechte meines Accounts ausreichen.

    Ich habe den Rechner jetzt mal manuell (NetDom.exe) hinzugefügt. Es gab keinen Fehler und der Rechner läuft sauber im AD. Es ist alles sehr komisch ...

    Hast Du/habt ihr vielleicht noch eine andere Idee?

    Danke & Grüße
    TheDude

    Cuiusvis hominis est errare, nullius nisi insipientis in errore perseverare.
    [Cicero, Philippica 12,2]

  • Ich musste selbst nach einiger Zeit feststellen, das ein "normaler" Domänenbenutzer bis max. 10 Computer zu einer Domäne hinzufügen darf ! Das war die Wucht. Lässt sich aber per Default-Domain-Policy" unterbinden.

    Danke für die Info! Hast Du da eine Quelle im Internet? Ich würde das gerne als Kommentar in das UDF aufnehmen!

  • ... Grmpf. War zu früh heute morgen ...

    Sorry, die Syntax des 3. Parameters war/ist so, wie Du geschrieben hast. War 'n Fehler meinerseits. Leider liegt das Problem mit AD_CreateComputer() dann doch nicht daran.

    SORRY!

    Grüße
    TheDude

    Cuiusvis hominis est errare, nullius nisi insipientis in errore perseverare.
    [Cicero, Philippica 12,2]

  • Micha_He hat das Problem erkannt! Danke!!
    Ein angemeldeter User kann bis zu 10 Computer in die Domäne hängen. Fehlt ihm aber das Recht die ACL zu ändern, so wird zwar der Computer angelegt, die Rechte können jedoch nicht geändert werden und die Funktion bricht mit dem angegebenen Fehler ab.

    Ich werde mal forschen, welches Recht benötigt wird, dann kann im Vorfeld darauf geprüft werden.

    Um also Dein Problem abzuschliessen: Du hast zu wenig Rechte!

  • Hallo Water & Micha_He,

    verstehe ich soweit. Nur - warum konnte ich den Rechner dann nach meinen (fehlgeschlagenen) Versuchen mit der UDF mittels NetDom.exe ins AD aufnehmen? Irgendwie leuchtet mir im Moment nicht ein, warum das Problem an fehlenden Rechten liegen soll. Aber - ich bin ja wirklich für jede Hilfe dankbar. Wäre prima, wenn ihr das etwas herausfinden könntet. Vielleicht macht ja auch NetDom so eine Rückgabe, aber ich sehe sie nicht, weil ich nicht danach frage ... :S

    Viele Grüße
    Thomas

    Cuiusvis hominis est errare, nullius nisi insipientis in errore perseverare.
    [Cicero, Philippica 12,2]

  • Also ich verstehe die Sache so:

    NETDOM fügt einen PC in die Domäne ein - funktioniert bei Dir
    _AD_CreateComputer fügt einen PC in die Domäne ein - funktioniert bei Dir
    _AD_CreateComputer setzt danach Rechte auf dem definierten PC - funktioniert bei Dir nicht, da Du nicht das Recht hast die Rechte eines Objektes im AD zu ändern.

    Ich denke, dass Du ein ganz "normaler" User bist (aus Sicht des AD). Ein normaler User hat per Default Group Policy das Recht bis zu 10 Computer in die Domäne aufzunehmen (guckst Du hier ). D.h. wenn Du 11 verschiedene Computer in die Domäne aufnehmen willst, dann stellt es Dich auch mit NETDOM auf.

  • Hallo Water,

    Danke für den Link. Die leuchtet mir auch soweit ein.

    Folgendes habe ich mit NetDom vor ein paar Minuten durchgeführt:

    Code
    NETDOM.EXE JOIN RECHNERNAME /Domain:Domain.XYZ.com /OU:OU=Workstations,OU=Ort,OU=Land,OU=Region,OU=Unternehmen,DC=Domain,DC=XYZ,DC=com /UserD:Domain.XYZ.com\MeinUserName /PasswordD:MeinPasswort

    Dies hat auf Anhieb funktioniert. Das Einzige, was anders ist, ist die Zusammensetzung der User-ID. Dies werde ich mit der UDF aber auch mal testen.

    Ansonsten bin ich mit meinem Latein am Ende ... ;(

    Sorry für die Geduldsstrapaze,
    Grüße

    TheDude

    Cuiusvis hominis est errare, nullius nisi insipientis in errore perseverare.
    [Cicero, Philippica 12,2]

  • _AD_CreateComputer tut genau das, was NETDOM auch tut - es fügt einen Computer in die Domäne ein. Sowohl NETDOM als auch _AD_CreateComputer machen das mit Deinem Account erfolgreich. Soweit so gut.

    _AD_CreateComputer macht aber mehr als NETDOM. Nachdem der Computer angelegt ist, setzt es Rechte (nennen wir sie "Objekt-Rechte") auf dem AD-Objekt. Und um dies tun zu können, benötigst Du Rechte (nennen wir sie "AD-Rechte"). Was Dir fehlt sind die AD-Rechte.
    Vermutlich bist Du ein reiner Leseuser.

  • Guten Morgen Water,

    ... OK, JETZT habe ich es verstanden. Wobei ich gestehen muß, daß ein Blick in die AD.au3 in diesem Zusammenhang auch nicht geschadet hätte ... :whistling:

    Wäre es möglich, die Funktion AD_CreateComputer() aus der UDF in das Script zu kopieren und die Teile dann dort herauszulöschen, die für das Verändern der ACL zuständig sind? Ich würde ungerne die UDF verändern, da mit dem nächsten Update alle Änderungen ja wieder gelöscht würden. Oder zu welchem Vorgehen würdest Du mir in diesem Zusammenhang raten? Leider bekomme ich nicht mehr Rechte an den Objekten sodaß ich anders wohl nicht weiterkomme ... ;(

    Folgendes würde dann noch übrig bleiben (wenn ich es richtig interpretiert habe):

    Code
    Func _AD_CreateComputerOwn($sAD_OU, $sAD_Computer, $sAD_User) 
    If Not _AD_ObjectExists($sAD_OU) Then Return SetError(1, 0, 0) 
    If _AD_ObjectExists("CN=" & $sAD_Computer & "," & $sAD_OU) Then Return SetError(2, 0, 0) 
    If Not _AD_ObjectExists($sAD_User) Then Return SetError(3, 0, 0) 
    If StringMid($sAD_OU, 3, 1) <> "=" Then $sAD_OU = _AD_SamAccountNameToFQDN($sAD_OU) ; sAMACccountName provided 
    If StringMid($sAD_User, 3, 1) = "=" Then $sAD_User = _AD_FQDNToSamAccountName($sAD_User) ; FQDN provided 
    Local $oAD_Container = _AD_ObjGet("LDAP://" & $sAD_HostServer & "/" & $sAD_OU) 
    Local $oAD_Computer = $oAD_Container.Create("Computer", "cn=" & $sAD_Computer) 
    Return 1 
    EndFunc

    Eine Frage zu dem AD_JoinDomain() bitte noch: Welches Format hat der erwartete Parameter $sAD_UserParam? Wieder nur der AD-Account oder aber mit einem vorgestellten "Domain\"?

    Nochmals(!) vielen Dank für Deine Hilfe,
    Grüße

    TheDude

    Cuiusvis hominis est errare, nullius nisi insipientis in errore perseverare.
    [Cicero, Philippica 12,2]

  • Hi Dude,

    die AutoIt-ler erweitern eine abgewandelte Funktion meist mit dem Suffic "EX" (wie extended). Daher mein Vorschlag:

    [autoit]

    Func _AD_CreateComputerEX($sAD_OU, $sAD_Computer, $sAD_User)

    [/autoit][autoit][/autoit][autoit]

    If Not _AD_ObjectExists($sAD_OU) Then Return SetError(1, 0, 0)
    If _AD_ObjectExists("CN=" & $sAD_Computer & "," & $sAD_OU) Then Return SetError(2, 0, 0)
    If Not _AD_ObjectExists($sAD_User) Then Return SetError(3, 0, 0)
    If StringMid($sAD_OU, 3, 1) <> "=" Then $sAD_OU = _AD_SamAccountNameToFQDN($sAD_OU) ; sAMACccountName provided
    If StringMid($sAD_User, 3, 1) = "=" Then $sAD_User = _AD_FQDNToSamAccountName($sAD_User) ; FQDN provided
    Local $oAD_Container = _AD_ObjGet("LDAP://" & $sAD_HostServer & "/" & $sAD_OU)
    Local $oAD_Computer = $oAD_Container.Create("Computer", "cn=" & $sAD_Computer)
    $oAD_Computer.Put("sAMAccountName", $sAD_Computer & "$")
    $oAD_Computer.Put("userAccountControl", BitOR($ADS_UF_PASSWD_NOTREQD, $ADS_UF_WORKSTATION_TRUST_ACCOUNT))
    $oAD_Computer.SetInfo
    If @error <> 0 Then Return SetError(@error, 0, 0)
    Return 1

    [/autoit][autoit][/autoit][autoit]

    EndFunc

    [/autoit]


    Eventuell bereiten die beiden ".Put" Befehle noch Probleme. Musst Du ausprobieren. Wobei zumindest der sAMAccountName funktionieren sollte, denn das Feld wird ja dauernd benötigt. Falls es nicht funzt, teste doch mal die AD_Inhalte für den Computer nachdem Du ihn mit NETDOM in die Domäne gehängt hast.

    _AD_JoinDomain benötigt den NetBIOS Name (da das ganze über WMI abgehandelt wird), also ohne "Domain\"

    Viel Glück noch mit Deinem Script
    Water

  • Hallo Water,

    ... YES! Nun klappt alles. Vielen, vielen Dank für Deine Geduld. :thumbup:

    Grüße & einen schönen Tag
    TheDude

    Cuiusvis hominis est errare, nullius nisi insipientis in errore perseverare.
    [Cicero, Philippica 12,2]

  • Pfffft - da haben wir ja nochmal Glück gehabt :)
    Remote Support kann sich manchmal ganz schön ziehen - bin gerade an einem ähnlich komplexen Problem auf der englischen Site dran.
    Gut, dass Dein Skript nun läuft!

  • Hallo Water,

    kann man mit der AD-UDF auch AD-Gruppen zu lokalen Gruppen hinzufügen? Mein Problem ist, daß ich mit "net localgroup" anscheinend nur Gruppen hinzufügen kann, wenn die Namen der Gruppen aus nicht mehr als 20 Buchstaben bestehen. Daher scheitert folgendes leider:

    Code
    RunWait(@Comspec & " /c " & "NET LOCALGROUP " & $LocalAdminGroup & " Eine-wirklich-sehr-sehr-lange-AD-Gruppe /add >> " & $LogFile,"",@SW_HIDE)

    Hast Du evtl. einen Tipp für mich?

    Danke vorab,
    viele Grüße

    The Dude

    Cuiusvis hominis est errare, nullius nisi insipientis in errore perseverare.
    [Cicero, Philippica 12,2]

  • Hi Dude,

    nö, mit lokalen Gruppen hat das AD UDF nichts am Hut ;)
    Das AD UDF beinhaltet nur Funktionen um das AD zu manipulieren - _AD_JoinDomain und _AD_UnJoinDomain sind da fast schon eine Ausnahme.

    Water