antmar904 Posted June 22, 2022 Share Posted June 22, 2022 Hello. Long time since I've posted. I am trying to list all users with two attributes in my whole domain and sub-domains however that script just hangs. #include <AD.au3> ; Open Connection to the Active Directory _AD_Open() If @error Then Exit MsgBox(16, "Active Directory Error", "Function _AD_Open encountered a problem. @error = " & @error & ", @extended = " & @extended) $aUserObjects = _AD_GetObjectsInOU ("", "", 2, "sAMAccountName,displayname") _ArrayDisplay ($aUserObjects) Link to comment Share on other sites More sharing options...
water Posted June 22, 2022 Share Posted June 22, 2022 How many users do you expect to get listed? My UDFs and Tutorials: Spoiler UDFs: Active Directory (NEW 2024-07-28 - Version 1.6.3.0) - Download - General Help & Support - Example Scripts - Wiki ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki Task Scheduler (2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki Standard UDFs: Excel - Example Scripts - Wiki Word - Wiki Tutorials: ADO - Wiki WebDriver - Wiki Link to comment Share on other sites More sharing options...
antmar904 Posted June 22, 2022 Author Share Posted June 22, 2022 2 maybe 3k Link to comment Share on other sites More sharing options...
antmar904 Posted June 22, 2022 Author Share Posted June 22, 2022 maybe it's better to output to a file Link to comment Share on other sites More sharing options...
water Posted June 22, 2022 Share Posted June 22, 2022 The problem might be caused by the default Page Size limit of 1000. You could use function _AD_SetAdoProperties to lift this limit. Please see the _AD_SetAdoProperties-au3 example script. My UDFs and Tutorials: Spoiler UDFs: Active Directory (NEW 2024-07-28 - Version 1.6.3.0) - Download - General Help & Support - Example Scripts - Wiki ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki Task Scheduler (2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki Standard UDFs: Excel - Example Scripts - Wiki Word - Wiki Tutorials: ADO - Wiki WebDriver - Wiki Link to comment Share on other sites More sharing options...
antmar904 Posted June 22, 2022 Author Share Posted June 22, 2022 (edited) So writing the array to a file worked fast, how can I return just user objects, by using a LDAP filter? Edited June 22, 2022 by antmar904 Link to comment Share on other sites More sharing options...
antmar904 Posted June 22, 2022 Author Share Posted June 22, 2022 Disregard the last comment. Link to comment Share on other sites More sharing options...
water Posted June 23, 2022 Share Posted June 23, 2022 So everything works now? My UDFs and Tutorials: Spoiler UDFs: Active Directory (NEW 2024-07-28 - Version 1.6.3.0) - Download - General Help & Support - Example Scripts - Wiki ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki Task Scheduler (2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki Standard UDFs: Excel - Example Scripts - Wiki Word - Wiki Tutorials: ADO - Wiki WebDriver - Wiki Link to comment Share on other sites More sharing options...
antmar904 Posted June 23, 2022 Author Share Posted June 23, 2022 Yes but on to the next part. I'm trying to search the whole AD for all user accounts that contain "contractor or consultant" in different attributes but can't seem to get it working. #include <AD.au3> #include <File.au3> Global $LogFileUsers = @ScriptDir & "\ADUsers.txt" ; Open Connection to the Active Directory _AD_Open() If @error Then Exit MsgBox(16, "Active Directory Error", "Function _AD_Open encountered a problem. @error = " & @error & ", @extended = " & @extended) $aUserObjects = _AD_GetObjectsInOU ("", "(&(objectcategory=person)(objectclass=user)(title=*contractor*) (title=*consultant*) (description=*contractor*) (description=*consultant*))", 2, "sAMAccountName,displayName") $hADUsers = FileOpen ($LogFileUsers, $FO_APPEND) _FileWriteFromArray ($hADUsers, $aUserObjects) _AD_Close() Link to comment Share on other sites More sharing options...
antmar904 Posted June 23, 2022 Author Share Posted June 23, 2022 (edited) My end goal is to search the whole AD for non-FTE (Contractors) and check to see if a 30 day expiration date was set on their account from the account creation date. Unfortunately there is no easy way to search for just Contractors as they can be located in AD anywhere. Edited June 23, 2022 by antmar904 Link to comment Share on other sites More sharing options...
antmar904 Posted June 23, 2022 Author Share Posted June 23, 2022 Getting there. Looks like I had to use the pipe "|" character for OR $aUserObjects = _AD_GetObjectsInOU ("", "(&(objectcategory=person)(objectclass=user)(|(title=*contractor*) (title=*consultant*)(description=*contractor*) (description=*consultant*)))", 2, "sAMAccountName,displayName") Link to comment Share on other sites More sharing options...
antmar904 Posted June 23, 2022 Author Share Posted June 23, 2022 I'm unable to return the "accountExpires" attribute. #include <AD.au3> #include <File.au3> Global $Users = @ScriptDir & "\ADUsers.txt" _GetUsers() Func _GetUsers() ; Open Connection to the Active Directory _AD_Open() If @error Then Exit MsgBox(16, "Active Directory Error", "Function _AD_Open encountered a problem. @error = " & @error & ", @extended = " & @extended) $aUserObjects = _AD_GetObjectsInOU ("", "(&(objectcategory=person)(objectclass=user)(|(title=*contractor*) (title=*consultant*)(description=*contractor*) (description=*consultant*)))", 2, "sAMAccountName,displayName,createTimeStamp,accountExpires") $hADUsers = FileOpen ($Users, $FO_APPEND) _FileWriteFromArray ($hADUsers, $aUserObjects) _AD_Close() EndFunc Link to comment Share on other sites More sharing options...
antmar904 Posted June 23, 2022 Author Share Posted June 23, 2022 Ok, still having issues returning a users "accountexpire" data: #include <AD.au3> #include <File.au3> Global $Users = @ScriptDir & "\ADUsers.txt" _GetUsers() Func _GetUsers() ; Open Connection to the Active Directory. _AD_Open() If @error Then Exit MsgBox(16, "Active Directory Error", "Function _AD_Open encountered a problem. @error = " & @error & ", @extended = " & @extended) ; Search all of AD for contractors and exclude _DT accounts. $aUserObjects = _AD_GetObjectsInOU("", "(&(objectcategory=person)(objectclass=user) (!(sAMAccountName=*_dt)(|(title=*contractor*) (title=*consultant*)(description=*contractor*) (description=*consultant*))))", 2, "sAMAccountName") ;$hADUsers = FileOpen ($Users, $FO_APPEND) ;_FileWriteFromArray ($hADUsers, $aUserObjects) _ArrayDisplay($aUserObjects) For $i = 0 To UBound($aUserObjects) - 1 ;MsgBox(0, "", $aUserObjects[$i]) $aExpires = _AD_GetObjectProperties($aUserObjects[$i], "accountexpires", "", True) Next _ArrayDisplay ($aExpires) _AD_Close() EndFunc ;==>_GetUsers Link to comment Share on other sites More sharing options...
water Posted June 24, 2022 Share Posted June 24, 2022 What is the value of @error and @extended after calling _AD_GetObjectProperties? Could you please try "accountExpires" with upper case "E"? My UDFs and Tutorials: Spoiler UDFs: Active Directory (NEW 2024-07-28 - Version 1.6.3.0) - Download - General Help & Support - Example Scripts - Wiki ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki Task Scheduler (2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki Standard UDFs: Excel - Example Scripts - Wiki Word - Wiki Tutorials: ADO - Wiki WebDriver - Wiki Link to comment Share on other sites More sharing options...
antmar904 Posted June 24, 2022 Author Share Posted June 24, 2022 From the doc: 1 - $vObject could not be found Link to comment Share on other sites More sharing options...
Subz Posted June 24, 2022 Share Posted June 24, 2022 This is normally what I use to get account expiry date: expandcollapse popup#include <AD.au3> _GetUsers() Func _GetUsers() _AD_Open() If @error Then Exit MsgBox(16, "Active Directory Error", "Function _AD_Open encountered a problem. @error = " & @error & ", @extended = " & @extended) ; Search all of AD for contractors and exclude _DT accounts. $aUserObjects = _AD_GetObjectsInOU("", "(&(objectcategory=person)(objectclass=user) (!(sAMAccountName=*_dt)(|(title=*contractor*) (title=*consultant*)(description=*contractor*) (description=*consultant*))))", 2, "sAMAccountName,accountExpires") For $i = 0 To UBound($aUserObjects) - 1 If IsObj($aUserObjects[$i][1]) Then $aUserObjects[$i][1] = _GetADDateTime($aUserObjects[$i][1], 1) Next _ArrayDisplay($aUserObjects) _AD_Close() EndFunc ;==>_GetUsers Func _GetADDateTime($_oADObject, $_iFlag = 0) Local $sAD_DTStruct, $sTemp3 If $_iFlag = 1 Then If $_oADObject.LowPart = -1 Then Return 0 If $_oADObject.LowPart > 0 And $_oADObject.HighPart > 0 Then $sAD_DTStruct = DllStructCreate("dword low;dword high") DllStructSetData($sAD_DTStruct, "Low", $_oADObject.LowPart) DllStructSetData($sAD_DTStruct, "High", $_oADObject.HighPart) $sAD_Temp = _Date_Time_FileTimeToSystemTime(DllStructGetPtr($sAD_DTStruct)) $sTemp3 = _Date_Time_SystemTimeToTzSpecificLocalTime(DllStructGetPtr($sAD_Temp)) Return _Date_Time_SystemTimeToDateTimeStr($sTemp3, 1) EndIf EndIf ; Convert IADsLargeInteger parts to 100ns count $iLowPart = $_oADObject.LowPart $iHighPart = $_oADObject.HighPart If $iLowPart < 0 Then $iHighPart += 1; Compensate for IADsLargeInteger interface error $iDateParts= $iHighPart * 2 ^ 32 $iDateParts+= $iLowPart ; Check if user ever logged in If $iDateParts= 0 Then Return "n/a" Else ; Convert 100ns count to integer seconds $iSeconds = Floor($iDateParts/ 10000000) ; Convert seconds since 12:00AM January 01, 1601 to date string $sDateTime = _DateAdd("S", $iSeconds, "1601/01/01 00:00:00") ; Display result Return $sDateTime EndIf EndFunc SkysLastChance 1 Link to comment Share on other sites More sharing options...
Subz Posted June 24, 2022 Share Posted June 24, 2022 Also unsure why your script hangs we have several thousand users and usually takes several seconds to display the full list of users, although I always use filtered list e.g.: _AD_GetObjectsInOU("", "(&(objectcategory=person)(objectclass=user)(sAMAccountName=*))", 2, "sAMAccountName,accountexpires") Link to comment Share on other sites More sharing options...
antmar904 Posted June 24, 2022 Author Share Posted June 24, 2022 I'm not sure why I can't return the "accountExpires" attribute using "_AD_GetObjectsInOU"? It returns blank. Link to comment Share on other sites More sharing options...
Subz Posted June 24, 2022 Share Posted June 24, 2022 Did you use my script above? The accountExpires returns an object which will not be displayed within the array, which is why I loop through the results and convert the object into a readable date/time. Link to comment Share on other sites More sharing options...
antmar904 Posted June 24, 2022 Author Share Posted June 24, 2022 Doesn't "_AD_GetObjectProperties" $bTranslate = True do the same? I can't even get that to work. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now