Active Directory Funktionen - Neue Version 1.5.0.0 freigegeben!

  • Wie schaut das Skript von Dir aus?

    Edit: Laut Google handelt es sich beim attribut userParameters um ein blob (binary large object). Abhängig vom Server den Du verwendest, kannst Du jedoch die in userParameters verschlüsselten properties direkt über die ms-TS-* attribute ansprechen.
    Hier der Einstiegslink dazu.

  • Danke,
    das mit dem BLOB hatte ich auch schon gelesen.
    Ich habe mir den Artikel auf der verlinken Seite auch angesehen, werde aber nicht so recht schlau daraus....

    Dann wird das zunächst wohl nicht auszulesen sein.

    Gruß
    Wolke

  • Schau Dir doch die ms-TS-* Attribute an und versuch auf eines davon zuzugreifen. Wenn das funktioniert brauchts Du das
    userParameters nicht.

  • Version 1.2.0 ist freigegeben.

    Bitte ausgiebig testen vor Übernahme in die Produktion!

    Für download siehe bitte den Link in meiner Signatur.

  • Habe ein neues Beispielskript gepostet - ADAT (Active Directory Administration Tool).
    Je Administrationsfunktion ist ein eigener Reiter vorgesehen. Das Tool ist leicht zu erweitern - eine entsprechende Doku liegt bei.
    Details dazu gibt es hier .

  • water

    versuche eben die funktion _AD_GetLastLoginDate zu benutzen!

    in der AD_1.1.0_Functions bzw. AD_1.0.0_Functions bekomm ich folgenden fehler:

    D:\Data\scripte\AD_1.1.0_Funktions\AD.au3 (1400) : ==> Error in expression.:
    Local $sAD_DsServiceDN = $oAD_DCRootDSE.Get("dsServiceName")
    Local $sAD_DsServiceDN = ^ ERROR

    Spoiler anzeigen
    [autoit]


    #include <AD.au3>

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

    ; Open Connection to the Active Directory
    _AD_Open()
    Global $result
    ;If @error Then Exit MsgBox(16, "Active Directory Example Skript", "Function _AD_Open encountered a problem. @error = " & @error & ", @extended = " & @extended)
    ; Get last login date for the current user
    Global $iLLDate = _AD_GetLastLoginDate("username","sitename")
    MsgBox(64, "Active Directory Functions - Example 1", "Last Login Date for User '" & @UserName & "'" & @CRLF & $iLLDate)
    $result = StringLeft($iLLDate, 8)
    MsgBox(0, "Leftmost 3 characters are:", $result)

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

    ; Close Connection to the Active Directory
    _AD_Close()

    [/autoit]

    mit der Version AD_0.43_Funktions und früher geht es aber!

    kannst du das prüfen?

    danke

    Gruß gmmg ;)

  • Hat was mit dem Global Catalog zu tun. Ab 1.1.0 wird automatisch geprüft, ob auf dem DC auch ein GC eingerichtet ist. Ab der nächsten Version ist diese Funktion defaultmäßig wieder deaktiviert.
    Ersetz mal die _AD_ListDomainControllers Funktion mit dieser:

    Spoiler anzeigen
    [autoit]

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _AD_ListDomainControllers
    ; Description ...: Enumerates all Domain Controllers (returns information about: Domain Controller, site, subnet and Global Catalog).
    ; Syntax.........: _AD_ListDomainControllers([$bAD_ListRO = False[, $bAD_ListGC = False]])
    ; Parameters ....: $bAD_ListRO - Optional: If set to True only returns RODC (read only domain controllers) (default = False)
    ; $bAD_ListGC - Optional: If set to True queries the DC for a Global Catalog. Disabled for performance reasons (default = False)
    ; Return values .: Success - One-based two dimensional array with the following information:
    ; |0 - Domain Controller: Name
    ; |1 - Domain Controller: Distinguished Name (FQDN)
    ; |2 - Domain Controller: DNS host name
    ; |3 - Site: Name
    ; |4 - Site: Distinguished Name (FQDN)
    ; |5 - Site: List of subnets that can connect to the site using this DC in the format x.x.x.x/mask - multiple subnets are separated by comma
    ; |6 - Global Catalog: Set to True if the DC is a Global Catalog (only if flag $bAD_ListGC = True. If False then "" is returned)
    ; Failure - "", sets @error to:
    ; |1 - No Domain Controllers found
    ; Author ........: water (based on VB functions by Richard L. Mueller)
    ; Modified.......:
    ; Remarks .......: This function only lists writeable DCs (default). To list RODC (read only DCs) use parameter $bAD_ListRO
    ; Related .......:
    ; Link ..........: http://www.rlmueller.net/Enumerate%20DCs.htm
    ; Example .......: Yes
    ; ===============================================================================================================================
    Func _AD_ListDomainControllers($bAD_ListRO = False, $bAD_ListGC = False)

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

    Local $oAD_DC, $oAD_Site, $oAD_Result
    Local Const $NTDSDSA_OPT_IS_GC = 1
    $oAD_Command.CommandText = "<LDAP://" & $sAD_HostServer & "/" & $sAD_Configuration & ">;(objectClass=nTDSDSA);ADsPath;subtree"
    If $bAD_ListRO Then $oAD_Command.CommandText = "<LDAP://" & $sAD_HostServer & "/" & $sAD_Configuration & ">;(objectClass=nTDSDSARO);ADsPath;subtree"
    Local $oAD_RecordSet = $oAD_Command.Execute
    If Not IsObj($oAD_RecordSet) Or $oAD_RecordSet.RecordCount = 0 Then Return SetError(1, 0, "")
    ; The parent object of each object with objectClass=nTDSDSA is a Domain
    ; Controller. The parent of each Domain Controller is a "Servers"
    ; container, and the parent of this container is the "Site" container.
    $oAD_RecordSet.MoveFirst
    Local $aAD_Result[1][7], $iCount1 = 1, $aAD_SubNet, $aAD_Temp, $sAD_Temp
    Do
    ReDim $aAD_Result[$iCount1 + 1][7]
    $oAD_Result = _AD_ObjGet($oAD_RecordSet.Fields("AdsPath").Value)
    $oAD_DC = _AD_ObjGet($oAD_Result.Parent)
    $aAD_Result[$iCount1][0] = $oAD_DC.Get("Name")
    $aAD_Result[$iCount1][1] = $oAD_DC.serverReference
    $aAD_Result[$iCount1][2] = $oAD_DC.DNSHostName
    $oAD_Result = _AD_ObjGet($oAD_DC.Parent)
    $oAD_Site = _AD_ObjGet($oAD_Result.Parent)
    $aAD_Result[$iCount1][3] = StringMid($oAD_Site.Name, 4)
    $aAD_Result[$iCount1][4] = $oAD_Site.distinguishedName
    $aAD_SubNet = $oAD_Site.GetEx("siteObjectBL")
    For $iCount2 = 0 To UBound($aAD_SubNet) - 1
    $aAD_Temp = StringSplit($aAD_SubNet[$iCount2], ",")
    $sAD_Temp = StringMid($aAD_Temp[1], 4)
    If $iCount2 = 0 Then
    $aAD_Result[$iCount1][5] = $sAD_Temp
    Else
    $aAD_Result[$iCount1][5] = $aAD_Result[$iCount1][5] & "," & $sAD_Temp
    EndIf
    Next
    If $bAD_ListGC Then
    ; Is the DC a GC? Taken from: http://www.activexperts.com/activmonitor/w…rmanagement/ad/
    Local $oAD_DCRootDSE = _AD_ObjGet("LDAP://" & $oAD_DC.DNSHostName & "/rootDSE")
    Local $sAD_DsServiceDN = $oAD_DCRootDSE.Get("dsServiceName")
    Local $oAD_DsRoot = _AD_ObjGet("LDAP://" & $oAD_DC.DNSHostName & "/" & $sAD_DsServiceDN)
    Local $iAD_DCOptions = $oAD_DsRoot.Get("options")
    If BitAND($iAD_DCOptions, $NTDSDSA_OPT_IS_GC) = 1 Then
    $aAD_Result[$iCount1][6] = True
    Else
    $aAD_Result[$iCount1][6] = False
    EndIf
    EndIf
    $oAD_RecordSet.MoveNext
    $iCount1 += 1
    Until $oAD_RecordSet.EOF
    $oAD_RecordSet.Close
    $aAD_Result[0][0] = UBound($aAD_Result, 1) - 1
    $aAD_Result[0][1] = UBound($aAD_Result, 2)
    Return $aAD_Result

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

    EndFunc ;==>_AD_ListDomainControllers

    [/autoit]
  • Experimentelle Version 1.2.1.0 ist freigegeben.

    Nur für Tests!
    Benötigt AutoIt 3.3.9.2 beta wegen der Änderungen in der Handhabung von COM Fehlern!

    Für download siehe bitte den Link in meiner Signatur.

  • Wofür ist denn diese UDF ;D?

    Sind TV-Quizfragen zu einfach? A) Ja B) Harry Potter

    Spoiler anzeigen

    Ich gebe zu dieser Post hat wahrscheinlich nicht viel geholfen,
    aber ich versuche wenigstens zu helfen :rolleyes:

  • Für Firmennetzwerke die mit Microsofts Active Directory (AD) als zentralem Repository arbeiten.
    Damit kannst Du Informationen aus dem AD auslesen, Benutzer anlegen ...

  • water

    Hi,
    hab da ne Frage...
    Ist es möglich mit deiner UDF alle Computer aus dem AD auszulesen und in ein Array zu schreiben?
    Also z.B. ich möchte alle PCs, deren Name mit CX- oder mit VM- anfängt...

    Hab dazu jetzt nicht wirklich etwas funktionierendes gefunden...
    Es gäbe zwar die manuelle Möglichkeit mit csvde und dann anhand der Excel Liste Filtern und selbst eine Datei nur noch mit den Namen erstellen, aber das ist erstens zeitaufwendig und zweitens hat die Liste immer nur den Stand der Erstellung. . .

    Grüße
    Markus

    P.S.: Ansonsten is ne verdammt coole UDF :) Hat mir mein Admin Leben um einiges erleichtert :)

  • Ist es möglich mit deiner UDF alle Computer aus dem AD auszulesen und in ein Array zu schreiben?
    Also z.B. ich möchte alle PCs, deren Name mit CX- oder mit VM- anfängt...

    Klar geht das, ist eine der einfacheren Übungen 8)
    $aResult = _AD_GetObjectsInOU("", "(&(objectcategory=computer)(|(name=CX*)(name=VM*)))", 2, "samaccountname")

    Funktion _AD_GetObjectsInOU ist das Schweizer Messer der AD UDF.

  • Thx für deine sau schnelle Antwort :)
    Ich glaube diese Funktion hab ich sogar schonmal probiert, allerdings kommt da leider folgende Fehlermeldung:

    Code
    C:\Program Files (x86)\AutoIt3\Include\AD.au3 (1271) : ==> Variable must be of type "Object".:
    $oAD_Command.Properties("Searchscope") = $iAD_SearchScope
    $oAD_Command^ ERROR

    Leider kann ich damit mal so ziemlich gar nichts anfangen :)

  • Du hast wahrscheinlich vergessen "_AD_Open()" am Anfang des Skripts einzufügen.

  • Verdammt du bist es :)
    Hab in meinem Script weiter unten _AD_Open und auch Close zwar eingetragen, aber nicht an der Stelle wo ich deinen Code eingefügt habe ;)
    Soll heißen jetzt funktioniert es!
    Dankeschön :)

    Schönes Wochenende :)

  • Kaum macht man es richtig, funktioniert es auch schon :)

  • Experimentelle Version 1.2.2.0 ist freigegeben.

    Nur für Tests!
    Benötigt AutoIt 3.3.9.2 beta wegen der Änderungen in der Handhabung von COM Fehlern!

    Für download siehe bitte den Link in meiner Signatur.

  • Hallo Water,

    bei meinem aktuellen Projekt habe ich ein Problem mit der Funktion _AD_CreateComputer(), mit dem ich einfach nicht weiterkomme ...

    Die Verbindung zum AD läßt sich mit_AD_Open() einwandfrei herstellen. Anschließend kann ich mit _AD_ObjectExists(@ComputerName & "$") ohne Fehler abfragen, ob das Computerobjekt bereits existiert oder nicht.

    Wenn es nicht existiert, möchte ich es mit _AD_CreateComputer($OU,@ComputerName,$MeinAdAccount) hinzufügen. Hierbei kommt es dann immer zum Rückgabewert "0", allerdings steht in @Error und @Extended ebenfalls nur "0".

    Ich habe dann die Variable $iAD_Debug = 2 gesetzt um zu sehen, was genau "passiert":

    Leider bringt mich das nun nicht weiter. Ich bin mir auch ziemlich sicher, daß die Inhalte der Parameter (OU, Rechnername und Benutzername) korrekt sind. Auch habe ich versucht, dem Benutzernamen die Domäne mit "\" voranzustellen - aber ebenfalls leider ohne Erfolg.

    Wenn ich den betreffenden Rechner manuell über Arbeitsplatz (ist ein XP) -> Eigenschaften -> ComputerName -> Ändern -> Domäne der Domäne hinzufüge, dann klappt das mit meinem AD.Account einwandfrei.

    Wir hatten das Thema ja bereits in der Vergangenheit in diesem Thread bereits einmal gehabt/besprochen, jedoch tritt der aktuelle Fehler auch bei der von Dir vorgeschlagenen _AD_CreateComputerEx(...) ebenfalls auf.

    AutoIt-Version ist 3.3.8.0, AD-Functions-Version ist 1.2.0 ...

    Hast Du hierzu evtl. eine Idee?

    Danke vorab,
    viele Grüße

    TheDude

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

    2 Mal editiert, zuletzt von TheDude (13. September 2012 um 09:58)

  • Seltsam. Kannst Du das Skript bitte mal unkompiliert laufen lassen, damit wir sehen bei welchem Statement die Meldung aufpoppt?