Domänenabfrage

  • Hallo zusammen,

    eines vorweg: ich weiss, dass es irgendwo eine AD.au3 gibt. Diese möchte ich jedoch nicht nutzen, da ich nur sehr wenig an der AD auslesen möchte, und das sonst Overkill wäre.
    Zudem möchte ich auch selber etwas lernen ;)

    Also hier mein Problem: Ich möchte von einem gegebenen Benutzer gewisse Informationen (Voller Name, Telefonnummern etc.) aus dem Active Directory auslesen. Dazu gibt es diesen MSDN Artikel.
    Die Groups kann ich auch in einer Schleife erfolgreich abfragen. Aber mit dem Rest funktioniert nichts....

    Hier mein Script:

    Spoiler anzeigen
    [autoit]

    $FQDN = "CN=User,OU=General,OU=Departement,DC=company,DC=com"

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

    $oIADsUser = ObjGet("LDAP://" & $FQDN) ;http://msdn.microsoft.com/en-us/library/…0(v=VS.85).aspx
    If @error Or Not IsObj($oIADsUser) Then MsgBox(0,"","Fehler1")

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

    ;*******************************Funktioniert!!!
    For $Group In $oIADsUser.Groups
    MsgBox(0,"",$Group.Name)
    MsgBox(0,"",$Group.Description)
    Next

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

    ;*******************************Funktioniert NICHT!!!
    MsgBox(0,"",$oIADsUser.Get("FullName"))
    $oIADsUser = 0

    [/autoit]

    Vielleicht findet jemand einen Fehler!

    Einmal editiert, zuletzt von veronesi (24. Mai 2011 um 13:05)

  • Nun besteht noch folgendes Problem:
    Wenn eine Eigenschaft bei dem bestimmten Benutzer nicht ausgefüllt ist, dann bricht AutoIt ab. Ich möchte dies aber abfangen und einfach einen leeren String haben!
    Wie geht das?

    Hier das Script:

    Script
    [autoit]

    #include "S:\UE_Std\TestPC\Source\Functions\Func_GetFQDN.au3"
    Dim $FQDN = _GetFQDN(InputBox("Benutzernamen eingeben", "Bitte geben Sie den Benutzernamen ein, über welchen Sie etwas wissen möchten", @UserName))
    Dim $sInfo = ""

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

    $oIADsUser = ObjGet("LDAP://" & $FQDN) ;http://msdn.microsoft.com/en-us/library/…0(v=VS.85).aspx / http://msdn.microsoft.com/en-us/library/…0(v=VS.85).aspx
    If Not @error And IsObj($oIADsUser) Then
    $sInfo &= "Name: " & @TAB & @TAB & $oIADsUser.Get("displayName") & @LF
    $sInfo &= "Abteilung: " & @TAB & $oIADsUser.Get("description") & @LF
    $sInfo &= "Geschäftsnummer: " & @TAB & $oIADsUser.Get("telephoneNumber") & @LF
    $sInfo &= "Natelnummer: " & @TAB & $oIADsUser.Get("mobile") & @LF
    $sInfo &= "Fax: " & @TAB & @TAB & $oIADsUser.Get("facsimileTelephoneNumber") & @LF
    EndIf
    MsgBox(64, "Info", $sInfo)
    $oIADsUser = 0

    [/autoit]

    Und hier die benötigte _GetFQDN UDF:

    _GetFQDN
    [autoit]

    #cs
    ==================================================================================
    Function: _GetFQDN($User)
    Description: Returns the FQDN (Fully Qualified Domain Name) of the given user
    Parameter(s): $User = @Username

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

    Return Value(s): On Success - Return FQDN String (@Error = 0)
    On Failure: - Return 0, @ERROR <> 0
    Author(s): Veronesi
    http://www.cb-net.co.uk/index.php?opti…script&Itemid=8
    ==================================================================================
    #ce

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

    #include-once

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

    Func _GetFQDN($User = @UserName)
    Local $oRoot, $oDomain, $fqDomain, $oConnection, $oCommand, $oRecordSet, $FQDN
    $oRoot = ObjGet("LDAP://rootDSE")
    If @error Or Not IsObj($oRoot) Then
    $oRoot = 0
    Return SetError(1, 1, 0)
    EndIf

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

    $oDomain = ObjGet("LDAP://" & $oRoot.Get("defaultNamingContext"))
    If @error Or Not IsObj($oDomain) Then
    $oRoot = 0
    $oDomain = 0
    Return SetError(2, 2, 0)
    EndIf

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

    $fqDomain = $oRoot.Get("defaultNamingContext")

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

    $oConnection = ObjCreate("ADODB.Connection")
    If @error Or Not IsObj($oConnection) Then
    $oConnection.Close
    $oRoot = 0
    $oDomain = 0
    $oConnection = 0
    Return SetError(3, 3, 0)
    EndIf

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

    $oConnection.Open("Provider=ADsDSOObject")
    $oCommand = ObjCreate("ADODB.Command")
    If @error Or Not IsObj($oCommand) Then
    $oConnection.Close
    $oRoot = 0
    $oDomain = 0
    $oConnection = 0
    $oCommand = 0
    Return SetError(4, 4, 0)
    EndIf

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

    $oCommand.ActiveConnection = $oConnection

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

    $oCommand.CommandText = "<LDAP://" & $fqDomain & ">;(&(objectCategory=" & "User" & ")" & "(samAccountName=" & $User & "));samAccountName,distinguishedName;subtree"
    $oRecordSet = $oCommand.Execute
    If $oRecordSet.RecordCount = 0 Then
    $oConnection.Close
    $oRoot = 0
    $oDomain = 0
    $oConnection = 0
    $oCommand = 0
    $oRecordSet = 0
    Return SetError(5, 5, 0)
    EndIf

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

    $FQDN = $oRecordSet.Fields("distinguishedName").Value
    $oConnection.Close

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

    $oRoot = 0
    $oDomain = 0
    $oConnection = 0
    $oCommand = 0
    $oRecordSet = 0

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

    Return $FQDN
    EndFunc ;==>_GetFQDN

    [/autoit]

    Gruss Veronesi

  • Also ich würde das AD UDF einsetzen - und das nicht nur weil ich es geschrieben habe ;)
    Wenn Du den Obfuscator über dein Skript laufen lässt, dann wirft er alles raus, was nicht verwendet wird und reduziert die Größe der EXE.
    Ausserdem hat die UDF Error handling bereits fix eingebaut.
    Das was Du brauchst ist dann in 5 Minuten erledigt.

    Wenn Du das AD UDF einsetzen möchtest und Fragen hast - gerne!

  • Hallo Water,

    ganz ehrlich: Deine AD UDF ist genial! Auch die Beispiele. Da werde ich sicher einiges daraus gebrauchen können!

    Trotzdem wäre es mir manchmal lieber, eine Funktion selber zu schreiben, um sie auch zu verstehen!
    Den Obfuscator setze ich eher weniger ein, da er mir auch schon ein Script zerschossen hat. (Gut er macht ja vorher ein Backup.... - trotzdem)

    Lange rede, kurzer Sinn: Deine UDF werde ich sicher verwenden. Aber einiges möchte ich auch selber machen.
    Gruss Veronesi

  • Den Obfuscator setze ich eher weniger ein, da er mir auch schon ein Script zerschossen hat. (Gut er macht ja vorher ein Backup.... - trotzdem)


    Der Obfuscator hat einen Parameter namens striponly. Damit werden nur unnötige Funktionen / Kommentare entfernt und sonst nichts gemacht. Das sollte das Skript nicht zerschießen (Höchstens, du verwendest manche Funktionen ausschließelich in Call / Execute, bei AutoItObject könnte es deshalb evtl auch Probleme geben)