Welche Version des AD UDFs verwendest Du und wieviele Domänen Controller hast Du?
Beiträge von water
-
-
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# ====================================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; 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)Local $oAD_DC, $oAD_Site, $oAD_Result
[/autoit] [autoit][/autoit] [autoit]
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_ResultEndFunc ;==>_AD_ListDomainControllers
[/autoit] -
Oder über mein Active Directory UDF.
-
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 . -
Die Lösung findet Ihr hier .
-
Happy Birthday, UEZ!
Feier schön und genieße das neue Jahrzehnt!
-
Version 0.2.2.0 ist freigegeben.
Viel Spaß!
Für download siehe bitte den Link in meiner Signatur.
-
So sollt es funzen:
[autoit]#include <ad.au3>
[/autoit]
#AutoIt3Wrapper_AU3Check_Parameters= -d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
#AutoIt3Wrapper_AU3Check_Stop_OnWarning=Y
#include <AD.au3>
_AD_Open()
Global $aProperties = _AD_GetObjectProperties(@UserName, "pwdlastset")
Global $zuletzt = _DateTimeFormat($aProperties[1][1], 2) & " " & _DateTimeFormat($aProperties[1][1], 4)
$aProperties = _AD_GetObjectProperties(@ComputerName & "$", "cn,description")
Global $PCName = $aProperties[1][1]
Global $PCBeschreibung = $aProperties[2][1]
MsgBox(4144, "", "PC-Name: " & $PCName & @CRLF & "Beschreibung: " & $PCBeschreibung & @CRLF & "Passwort zuletzt geändert: " & $zuletzt)
_AD_Close() -
Ja, geht noch etwas kürzer:
[autoit]#include <ad.au3>
[/autoit]
#AutoIt3Wrapper_AU3Check_Parameters= -d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
#AutoIt3Wrapper_AU3Check_Stop_OnWarning=Y
#include <AD.au3>
_AD_Open()
Global $aProperties = _AD_GetObjectProperties(@UserName, "pwdlastset")
Global $ddd = $aProperties[1][1]
$ddd = _DateTimeFormat($ddd, 2)
Global $zuletzt = _DateTimeFormat($ddd, 2) & " " & " " & _DateTimeFormat($ddd, 4)
$aProperties = _AD_GetObjectProperties(@ComputerName & "$", "cn,description")
Global $PCName = $aProperties[1][1]
Global $PCBeschreibung = $aProperties[2][1]
MsgBox(4144, "", $PCName & " " & $PCBeschreibung)
_AD_Close() -
Wenn Du eh schon beide Funktionen aufrufst, dann nimm doch pwdlastset von _AD_PasswordInfo und den Rest aus _AD_GetObjectProperties.
_AD_PasswordInfo liefert die verlässlichere Info. -
_AD_PasswordInfo gibt einen Array zurück. Element 8 enthält "Password last changed (YYYY/MM/DD HH:MM:SS in local time of the calling user)" oder Element 10 enthält "Password last changed (YYYY/MM/DD HH:MM:SS in UTC)". Beide Elemente enthalten "1601/01/01 00:00:00" wenn das Passwort noch nie gesetzt wurde.
Ruf einfach nur _AD_PasswordInfo auf und lass Dir das Erbgebnis mit _ArrayDisplay anzeigen. -
Gibt es hier auch Leute, die nicht allgemeine Floskeln von sich geben sondern wirklich helfen? Alle meine bisher erhaltenen Antworten sind überflüssig. Kann mir jemand mein vorgeschlagenes Script so umschreiben, dass die Anmeldung funktioniert?
Aber sonst geht's Dir gut? Du bist derjenige, der hier Hilfe erwartet. Da würde ich an Deiner Stelle einen anderen Ton an den Tag legen!
-
Ist aus Sicherheitsgründen aber schwer bedenklich. Das Passwort wird ja nicht umsonst abgefragt. Und wenn Du das über das AutoIt Skript erledigen lässt, dann musst Du das Passwort im Code ablegen.
-
Dieses Problem sollte mit IT-Technik abgefangen werden z.B. mit 802.1X
-
Bei diesem Thread geht's los. Weitere Beispiele findest Du, wenn Du nach "Excel ADO SQL" suchst.
-
Du brauchst die Excel-Datei nicht in eine Datenbank zu exportieren um SQL-Befehle abzusetzen.
Excel kann per ADO direkt als Datenbank angesprochen werden.
Details liefere ich, falls Du diesen Ansatz weiterverfolgen möchtest. -
Wenn Du es über AutoIt lösen willst, dann geht das auch.
Mit meinem AD UDF rufst Du Funktion "_AD_Open" mit den ersten 5 Parametern auf.
Dann bist Du in der Domäne und kannt mit Funktion "_AD_SetPassword" das Passwort ändern.
Dann noch mit "_AD_Close" von der Domäne abmelden.
Fertig. -
Hier im Wiki wird beschrieben, wie aus einem Appointment ein Meeting wird.
-
Schau mal in meine OutlookEX UDF. Funktion _OL_ItemRecipientAdd sollte helfen.
Für Download siehe bitte unten. -
Der Nachteil es über Auoit direkt zu machen wäre dass wenn sich änderungen ergeben eine neue Exe raus muss.
Aber das Problem hast Du mit einer Batch-Datei doch auch, oder nicht?