Koda ist ein Teil von SciTe. Aufruf mit Alt+m für den grafischen GUI Editor.
Beiträge von water
-
-
Das kannst Du relativ einfach selbst schnitzen:
- GUI mit Koda erstellen
- Mein Active Directory UDF herunterladen (siehe Signatur)
- Felder (properties) definieren in denen die gewünschten Informationen liegen nach denen gesucht werden soll oder die anzuzeigen sind
- LDAP query erstellen und mit Funktion _AD_GetObjectsInOU abfragen
- Ergebnis anzeigen
-
Wow, schon wieder was gelernt
Gehört sowas in die Doku rein? -
Also bei mir sieht das so aus wenn ich Deine Datei auf C:\temp\System1.ini ablege.
autoit.de/wcf/attachment/15293/ -
Super, dass es nun funktioniert!
-
Was steht in Element 5 der Tabelle? Kannst Du einen Screenshot der gesamten Tabelle posten?
-
Dann lautet das AutoIt statement:
[autoit]If @LogonDomain = "xxx" Or @LogonDomain = "xxxx.INT" Or @LogonDNSDomain = "xxx.INT" Then ; Weiterverarbeitung
[/autoit]oder, damit wie in Deinem Fall das Programm beendet werden kann, das ganze negieren:
[autoit]If Not (@LogonDomain = "xxx" Or @LogonDomain = "xxxx.INT" Or @LogonDNSDomain = "xxx.INT") Then Exit
[/autoit]oder wenn man die Klammer auflösen möchte:
[autoit]If @LogonDomain <> "xxx" And @LogonDomain <> "xxxx.INT" And @LogonDNSDomain <> "xxx.INT" Then Exit
[/autoit]Die Bool'sche Logik erinnert doch stark an Mathe, oder?
-
Andersrum. Ich versuche mal zu formulieren, was Du möchtest:
Das Skript soll nur weiterlaufen, wenn die Domäne des Benutzers "dom1" oder "dom2" oder die LogonDNSDomäne gleich "logondnsdomain" ist.
Korrekt? -
Schreib mal in einem Satz, was Du prüfen möchtest. Dann können wir Dir sagen, ob das Autoit Skript das auch tut.
"Wenn die Domäne nicht ... dann Programmende". -
Auf was Greenhorn hinaus will:
Deine Abfrage führt immer zu "True" nach Abarbeitung der ersten beiden Vergleiche. Der dritte Vergleich wird nie berechnet.
autoit.de/wcf/attachment/15285/
Statt "Or" gehört eher "And" hinein: Beende wenn nicht eine der 3 Domänen übereinstimmen. -
So sollte es gehen:
[autoit]Global $aFolder = _OL_FolderAccess($oOutlook, "", $olFolderInbox)
[/autoit]In $aFolder[5] steht dann der Pfad zur Inbox.
-
Bin gerade nicht an meinem Windows PC und kann's daher nicht testen. Aber: Über den DefaultFolder kommt man auf die StoreId und über die ID zum Namen des Stores.
Mal sehen, wie ich das unter Outlook 2010 hinkriege und dann können wir das auch mit Outlook 2003 testen.
Ich melde mich. -
Versucht mal _OL_StoreGet. Was kriegst Du da?
-
Die Bereinigung der DC Tabelle macht die Funktion selbst.
Probleme gibt es, wenn ein DC nicht erreichbar ist, dann dauert das ewig, da die Funktion zuerst in einen Timeout läuft.Grunsätzlich stellt sich natürlich die Frage, ob es innvoll ist 2400 User auf das Datum der letzten Anmeldung zu prüfen.
Falls ja, dann sollte es auch egal sein, wenn die Geschichte etwas länger läuft.Lass Dir mal nach dem Aufruf von _AD_GetLastLoginDate die Werte von @error und @extended ausgeben. Die geben an, wie viele Probleme während der Prüfung auftraten bzw. wie viele DCs für den User angefragt wurden:
-
Was meisnt Du mit "neue Mails"? Die die reinkommen oder die die rausgehen?
Wohin verbindest Du Dich mit Outlook? Auf einen Exchange Server, ...? -
Du must die gesamte Tabelle übergeben:
[autoit]
[/autoit]
;------list dc's----
Local $aDC = _AD_ListDomainControllers()
;_ArrayDisplay($aDC,
"Active Directory Functions - Example 1 - All Domain Controllers,
distinguished name, DNS host name, and the site name")
;-------------------
;scriptabschnitt _AD_GetLastLoginDate
Local $iLLDate = _AD_GetLastLoginDate($aObjects[$i][0],"sitename",$aDC) -
Du kannst ja mal diese modifizierte Version testen. Erstelle in Deinem Script vor der Schleife wo Du die 2400 user checkst die Liste der DCs. Dann übergib diesen Array als Parameter 3 an die neue Funktion:
Spoiler anzeigen
[autoit]; #FUNCTION# ====================================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Name...........: _AD_GetLastLoginDate
; Description ...: Returns the lastlogin information from all DCs using the SamAccountName.
; Syntax.........: _AD_GetLastLoginDate([$sAD_User = @Username[, $sAD_Site = ""[, $aAD_DCList = ""]]])
; Parameters ....: $sAD_User - Optional: SamAccountName of a user account to get the last login date (default = @Username).
; $sAD_Site - Optional: Only query DCs that belong to this site(s) (default = all sites).
; +This can be a single site or a list of sites separated by commas
; $aAD_DCList - Optional: one-based two dimensional array of Domain Controllers as returned by function _AD_ListDomainControllers (default = "")
; Return values .: Success - Last login date returned as YYYYMMDDHHMMSS. @extended is set to the total number of Domain Controllers.
; +@error could be > 0 and contains the number of DCs that could not be reached or returns no data
; Failure - 0, sets @error to:
; |1 - $sAD_User could not be found. @extended = 0
; |2 - $sAD_User has never logged in to the domain. @extended = 0
; |3 - $aAD_DCList has to be an array or blank
; |4 - $aAD_DCList has to be a 2-dimensional array
; Warning - Last login date returned as YYYYMMDDHHMMSS (see Success), sets @error and @extended to:
; |x - Number of DCs which could not be reached. Result is returned from all available DCs. @extended is set to the total number of Domain Controllers
; Author ........: Jonathan Clelland
; Modified.......: water, Stephane
; Remarks .......: If it takes (too) long to get a result either some DCs are down or you have too many DCs in your AD.
; +Case one: Please check @error and @extended as described above
; +Case two: Specify parameter $sAD_Site to reduce the number of DCs to query and/or retrieve the list of DCs yourself and pass the array as parameter 3
; Related .......:
; Link ..........: http://blogs.technet.com/b/askds/archiv…w-it-works.aspx
; Example .......: Yes
; ===============================================================================================================================
Func _AD_GetLastLoginDate($sAD_User = @UserName, $sAD_Site = "", $aAD_DCList = "")If _AD_ObjectExists($sAD_User) = 0 Then Return SetError(1, 0, 0)
[/autoit] [autoit][/autoit] [autoit]
If Not IsArray($aAD_DCList) And $aAD_DCList <> "" Then Return SetError(3, 0, 0)
If IsArray($aAD_DCList) And UBound($aAD_DCList, 0) <> 2 Then Return SetError(4, 0, 0)
If $aAD_DCList = "" Then $aAD_DCList = _AD_ListDomainControllers()
Local $aAD_Site, $sAD_SingleDC, $bAD_WasIn
; Delete all DCs not belonging to the specified site
$aAD_Site = StringSplit($sAD_Site, ",", 2)
If UBound($aAD_Site) > 0 And $aAD_Site[0] <> "" Then
For $iAD_Count1 = $aAD_DCList[0][0] To 1 Step -1
$bAD_WasIn = False
For $sAD_SingleDC In $aAD_Site
If $aAD_DCList[$iAD_Count1][3] = $sAD_SingleDC Then $bAD_WasIn = True
Next
If Not $bAD_WasIn Then _ArrayDelete($aAD_DCList, $iAD_Count1)
Next
$aAD_DCList[0][0] = UBound($aAD_DCList, 1) - 1
EndIf
; Get LastLogin from all DCs
Local $aAD_Result[$aAD_DCList[0][0] + 1]
Local $sAD_LDAPEntry, $oAD_Object, $oAD_RecordSet
Local $iAD_Error1 = 0, $iAD_Error2 = 0
For $iCount1 = 1 To $aAD_DCList[0][0]
If Ping($aAD_DCList[$iCount1][2]) = 0 Then
$iAD_Error1 += 1
ContinueLoop
EndIf
$oAD_Command.CommandText = "<LDAP://" & $aAD_DCList[$iCount1][2] & "/" & $sAD_DNSDomain & ">;(sAMAccountName=" & $sAD_User & ");ADsPath;subtree"
$oAD_RecordSet = $oAD_Command.Execute ; Retrieve the ADsPath for the object
; -2147352567 or 0x80020009 is returned when the service is not operational
If @error = -2147352567 Or $oAD_RecordSet.RecordCount = 0 Then
$iAD_Error1 += 1
Else
$sAD_LDAPEntry = $oAD_RecordSet.fields(0).value
$oAD_Object = _AD_ObjGet($sAD_LDAPEntry) ; Retrieve the COM Object for the object
$aAD_Result[$iCount1] = $oAD_Object.LastLogin
; -2147352567 or 0x80020009 is returned when the attribute "LastLogin" isn't defined on this DC
If @error = -2147352567 Then $iAD_Error2 += 1
$oAD_Object.PurgePropertyList
EndIf
Next
_ArraySort($aAD_Result, 1, 1)
; If error count equals the number of DCs then the user has never logged in
If $iAD_Error2 = $aAD_DCList[0][0] Then Return SetError(2, 0, 0)
Return SetError($iAD_Error1, $aAD_DCList[0][0], $aAD_Result[1])EndFunc ;==>_AD_GetLastLoginDate
[/autoit] -
Mit dieser Konfiguration kann das natürlich seine Zeit dauern. 2400 mal wird die Liste aller DCs erstellt, dann wird pro User jeder der 19 DCs nach dem lastlogin date angefragt und danach das letzte Anmeldedatum errechnet.
Man könnte die Funktion so anpassen, dass die Liste der DCs als Parameter übergeben wird und somit nur einmal berechnet werden muss. -
Hab's mir nicht im Detail angesehen, aber das sieht ziemlich umfangreich aus.
- Wie lang läuft denn das ganze Skript?
- Wie viele Benutzer werden verarbeitet ?
- Wieviele Domänen Controller gibt es in der Domäne?
-
Bei mir dauert _AD_GetlastLoginDate unter 1 Sekunde.
Hatten wir nicht das PerformanceProblem bereits gestern in einem anderen Thread behoben?