Active Directory Funktionen - Neue Version 1.5.0.0 freigegeben!

  • Hallo Water,

    ... ich habe hier etwas gefunden, muß es nur mal verstehen: [ gelöst ] Active Directory: per AutoIt globale Gruppe einer lokalen Gruppe hinzufügen


    Code
    Func _ADAddgGroupTolGroup($ggroup, $lgroup) 
    $oggroup = ObjGet("LDAP://" & $strHostServer & "/" & _ADSamAccountNameToFQDN($ggroup)) ; $ggroup in FQDN wandeln und Infos über lokale Gruppe holen 
    $olgroup = ObjGet("LDAP://" & $strHostServer & "/" & _ADSamAccountNameToFQDN($lgroup)) ; $lgroup in FQDN wandeln und Infos über globale Gruppe holen 
    $olgroup.Add ($oggroup.AdsPath) ; Infos der globalen Gruppe der lokalen Gruppe hinzufügen 
    $olgroup.SetInfo 
    $oggroup = 0 
    $olgroup = 0 
    EndFunc ;==>_ADAddgGroupTolGroup

    Mal sehen, ob ich es hingebaut bekomme. Ansonsten werde ich mal den Autor fragen. Die UDF "adfunctions.au3" scheint ja ein "Vorläufer" Deiner AD.au3 zu sein, daher weiß ich nicht, ob ich das alles so 1:1 übernehmen kann ...

    Nochmals Danke,
    Grüße

    TheDude

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

    Einmal editiert, zuletzt von TheDude (22. Juni 2010 um 15:05)

  • Hallo Water,

    ... leider habe ich das bisher nicht zum Laufen gebracht. Was aber als Workaround funktioniert wäre folgendes:

    Hiermit könnte man sogar die Gruppe remote auf einem entfernten Rechner hinzufügen. Ist als Lösung sicherlich nicht schön, klappt aber. :P

    Grüße
    TheDude

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

  • Hi Dude,

    sieht etwas wild aus :)
    Sollte erhöhter Bedarf bestehen, überlege ich mir, ob es in die AD UDF reingehört. Aber derzeit ist es so ruhig, dass ich glaube, dass alle halbwegs "happy" sind.

    Schöne Grüße
    Water

  • Gibts ne Möglichkeit die extended-Rückmeldung bei AD-Anmeldung sichtbar zu machen?

    [autoit]

    Global $objDSO = ObjGet ("LDAP:")
    Const $ADS_SERVER_BIND= 512 ;0x200
    Global $username = "DOMAIN\Username"
    Global $Passwort = "secret"
    $obj1 = $objDSO.OpenDSObject("LDAP://xxx.xxx.xxx.xxx", $username, $Passwort, $ADS_SERVER_BIND)

    [/autoit]


    Gibts ne andere Methode statt $objDSO.OpenDSObject für das LDAP-Objekt, wie ich den Fehlercomment darstellen kann?


    Hi card0384,

    Ich habe nun meine W7 Machine und spiele gerade mit der Fehlerhehandlung bei _AD_Open(). Funzt ganz gut und kriege ich vermutlich auch bald mal hin.
    Nun habe ich aber ein Problem, wenn ich nicht bei jedem Aufruf Name und Passwort übergeben will. OpenDSObject erlaubt zwar die Parameter auf NULL zu setzen. Dann werden die default credentials verwendet.
    Aber wie setze ich einen Parameter auf NULL? Default funzt nicht.
    Ich habe beim engl. Forum schon einen Thread offen, aber vielleicht hast Du (oder sonst wer) ne Idee?

  • Hallo Water,

    Der Rückgabewert der UDF _AD_MoveObject() ist bei mir stets -2147352567. Wir hatten ja mal über fehlende Rechte im AD gesprochen, wahrscheinlich deutet dies wieder darauf hin.

    Was ich jedoch nicht verstehe ist, dass ich Objekte mit dem "AD Users and Computers" über Drag 'n Drop mit meinem Account verschieben und auch löschen kann. Wie kann ich erreichen, dass dies auch mit den AD-UDF funktioniert?

    Bei dem Anlegen von Objekten im AD hattest Du mir ja den Tipp gegeben, die entsprechende Function anzupassen, was auch wunderbar klappt. Aber in der Function _AD_MoveObject() finde ich keinen Hinweis darauf, warum sie in meinem Context nicht funktioniert.

    Hast Du hier evtl einen Tipp für mich?

    Danke vorab,
    viele Grüße

    TheDude

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

  • Hi Dude,

    ein paar Fragen:

    • wie sieht Dein Aufruf von _AD_MoveObject aus? Der erste Parameter muss als FQDN angegeben werden, der zweite kann entweder als FQDN oder als SamAccountName angegeben werden. Falls Du einen Computer moven möchtest und SamAccountName als Format für den zweiten Parameter verwendest, dann musst du ihn mit einem "$" abschliessen.
    • Was willst Du moven - einen User oder einen Computer?
    • Einige Problemfälle werden im englischen Forum behandelt - suche mal nach _AD_MoveObject.
    • Falls Du die Parameter als FQDN angibst, hast Du Sonderzeichen (Komma, Backslash, Raute) in dern Parametern?

    Kannst Du mal einen Beispielaufruf posten (persönliche Daten kannst Du ja aussternen, mir geht es um die Form des Aufrufs).

    Water

  • Hallo Water,

    sorry, es geht hierbei um das Verschieben eines Computer-Objekts. :wacko:

    • Zuerst ermittle ich mit _AD_ObjectExists(@ComputerName & "$"), ob das Objekt generell im AD existiert - funktioniert.
    • Wenn dies der Fall ist, ermittle ich mit $ComputerFQDN=_AD_SamAccountNameToFQDN($ComputerName & "$"), in welcher OU der Rechner sich befindet. In $ComputerFQDN steht nun die Lokalisierung des Objektes als Fully Qualified - funktioniert.
    • Wenn nun das Objekt im Default-Container "Computers" ist, dann soll es verschoben werden. Dazu verwende ich den Aufruf $Status=_AD_MoveObject($TargetOU,$ComputerFQDN) - hierbei kommt es zum Abbruch.
    • In $TargetOU steht dabei folgendes: OU=MeineComputer,OU=Standort,OU=Land,OU=Region,OU=Unternehmen,DC=Domaene,DC=HauptDomaene,DC=com - dies stimmt mit der Struktur im AD überein.
    • In $ComputerFQDN steht der Rückgabewert aus _AD_SamAccountNameToFQDN($ComputerName & "$"): CN=RechnerName,CN=Computers,DC=Domaene,DC=HauptDomaene,DC=com

    In $TargetOU und in $ComputerFQDN gibt es auch keine Sonderzeichen, Umlaute oder Leerzeichen. Das einzige, was kein echter Buchstabe ist, ist ein "-" im Rechnernamen.

    So richtig weiß ich nicht wirklich weiter ... :wacko:

    Viele Grüße
    TheDude

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

    Einmal editiert, zuletzt von TheDude (24. August 2010 um 16:13)

  • Hi Dude,

    habe mir das Problem angeschaut. Ist ein Bug im UDF. Das Problem liegt darin, dass Dein $ComputerFQDN kein "OU=" enthält und ich daher den CN falsch berechne.
    Gib daher bitte den Common Name (CN) als dritten Parameter ohne "CN=" an.
    $Status=_AD_MoveObject($TargetOU,$ComputerFQDN,"RechnerName")

    Oder binde bitte folgende Testversion in Dein Skript ein und rufe dann die geänderte Funktion auf:
    $Status=_AD_MoveObjectEX ($TargetOU,$ComputerFQDN)

    [autoit]

    Func _AD_MoveObjectEX($sAD_OU, $sAD_Object, $sAD_CN = "")

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

    If Not _AD_ObjectExists($sAD_OU, "distinguishedName") Then Return SetError(1, 0, 0)
    If Not _AD_ObjectExists($sAD_Object) Then Return SetError(2, 0, 0)
    If StringMid($sAD_Object, 3, 1) <> "=" Then $sAD_Object = _AD_SamAccountNameToFQDN($sAD_Object) ; sAMAccountName provided
    If $sAD_CN = "" Then
    $sAD_CN = "CN=" & _AD_GetObjectAttribute($sAD_Object,"cn")
    Else
    $sAD_CN = "CN=" & $sAD_CN
    EndIf
    $sAD_CN = _AD_FixSpecialChars($sAD_CN) ; escape all special characters
    If _AD_ObjectExists($sAD_CN & "," & $sAD_OU, "distinguishedName") Then Return SetError(3, 0, 0)
    Local $oAD_OU = _AD_ObjGet("LDAP://" & $sAD_HostServer & "/" & $sAD_OU) ; Pointer to the destination container
    $oAD_OU.MoveHere("LDAP://" & $sAD_HostServer & "/" & $sAD_Object, $sAD_CN)
    If @error <> 0 Then Return SetError(@error, 0, 0)
    Return 1

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

    EndFunc

    [/autoit]


    Bitte melde kurz, was rauskommt!

  • Hallo Water,

    ... Du bist ein echter "Trickser" - beide Möglichkeiten funktionieren. Vielen herzlichen Dank für Deine Hilfe! :thumbup:

    Ich habe im Script jetzt erst einmal die Methode $Status=_AD_MoveObject($TargetOU,$ComputerFQDN,@ComputerName) stehen gelassen. Wenn eine neue Version der UDF kommt (und ich hoffentlich daran denke :whistling: ), werde ich das Script entsprechend anpassen.

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

    P. S. Der Tipp mit dem englischen Forum war prima - auch dafür nochmals vielen Dank!

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

  • Version 0.40 ist freigegeben.
    Für download siehe bitte den Link in meiner Signatur.

  • Version 0.41 ist freigegeben.
    Für download siehe bitte den Link in meiner Signatur.

  • Die größten Änderungen fanden in Version 0.40 statt. Besonders die verbesserte Fehlerprüfung bei _AD_Open.
    Deine Skripte sollten problemlos laufen. Habe zumindest noch keine Beschwerden bekommen ;)

    Ach ja. Die Entwicklung ist derzeit abgeschlossen. Ausser Bugfixing tut sich nicht mehr viel. Ausser Ihr habt Wünsche oder Beschwerden!

  • Auch die schreibenden Funktionen sollten funktionieren und sind getestet. Ein Australier hat mir die ganzen Funktionen auf seinem Testsystem durchprobiert.
    Auf der anderen Seite: Der Teufel schläft nicht. Vielleicht in einer Testdomäne oder mit einem User mit eingeschränkten Rechten testen.

  • Schön - wenn was fehlt oder nicht funzt, melde Dich einfach!

  • Auf der Suche nach einer Lösung um alte Computer in der Domäne zu finden, habe ich folgendes probiert:

    [autoit]

    #include <AD.au3>

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

    _AD_Open()

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

    $sOU = "DC=dom,DC=suf"
    $aObjects = _AD_GetObjectsInOU($sOU, "(objectcategory=Computer)", 2, "cn,operatingsystem,pwdlastset")
    If @error > 0 Then
    MsgBox(64, "", "Nichts gefunden")
    Else
    _ArrayDisplay($aObjects)
    EndIf

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

    _AD_Close()

    [/autoit]

    Das Array liefert zwar alle Computer (teilweise mit Betriebssystem) zurück, leider ist das Feld "pwdlastset" nicht gefüllt.
    Liegt es daran, das mit der oben genutzten Funktion, den Interger8-Wert des Zeitstempels, nicht interpretiert kann ?

    Hat einer eine Idee ?

    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"

  • Richtig, _AD_GetObjectsInOU liefert die Daten "uninterpretiert".
    Du kannst nun entweder für jeden gefundenen Computer den Wert mit _AD_GetOjectProperties holen (dauert dann aber) oder die entsprechende Konvertierung gleich im Script durchführen.
    Das sieht dann so aus:

    [autoit]

    #include <AD.au3>

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

    _AD_Open()

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

    $sOU = "DC=dom,DC=suf"
    $aObjects = _AD_GetObjectsInOU("", "(objectcategory=Computer)", 2, "cn,operatingsystem,pwdlastset")
    If @error > 0 Then
    MsgBox(64, "", "Nichts gefunden")
    Else
    For $iIndex = 1 To $aObjects[0][0]
    Local $sAD_Temp = DllStructCreate("dword low;dword high")
    DllStructSetData($sAD_Temp, "Low", $aObjects[$iIndex][2].LowPart)
    DllStructSetData($sAD_Temp, "High", $aObjects[$iIndex][2].HighPart)
    Local $sAD_Temp2 = _Date_Time_FileTimeToSystemTime(DllStructGetPtr($sAD_Temp))
    Local $sAD_Temp3 = _Date_Time_SystemTimeToTzSpecificLocalTime(DllStructGetPtr($sAD_Temp2))
    $aObjects[$iIndex][2] = _Date_Time_SystemTimeToDateTimeStr($sAD_Temp3, 1)
    Next
    _ArrayDisplay($aObjects)
    EndIf

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

    _AD_Close()

    [/autoit]

    BTW: Du braucht die neueste AutoIT Version, da sonst _Date_Time_SystemTimeToDateTimeStr den zweiten Parameter nicht versteht.

  • Ich werde es morgen testen und von Erfolg oder Misserfolg berichten !

    Edit: Klappt !

    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"

    Einmal editiert, zuletzt von Micha_he (16. November 2010 um 10:07)