Sign in to follow this  
Followers 0
Graywalker

Search Active Directory

9 posts in this topic

#1 ·  Posted (edited)

Here is what I want to do, but am not sure of how exactly to do it...

; Search the Domain for all OUs containing Computers

??

; Do something with each computer name

What I have right now (and want to do differently):

Dim $SearchOus[7]

; Set some Constants
Global $objConnection = ObjCreate("ADODB.Connection"); Create COM object to AD
$objConnection.ConnectionString = "Provider=ADsDSOObject"
$objConnection.Open("Active Directory Provider"); Open connection to AD

$SearchOus[0]="OU=Execs,OU=workstations,OU=MAIN"
$SearchOus[1]="OU=Grunts,OU=workstations,OU=MAIN"
$SearchOus[2]="OU=Old,OU=MAIN"
$SearchOus[3]="OU=Techs,OU=workstations,OU=MAIN"
$SearchOus[4]="OU=ShortBus,OU=workstations,OU=MAIN"
$SearchOus[5]="OU=MajorProject,OU=workstations,OU=MAIN"
$SearchOus[6]="OU=workstations,OU=MAIN"

$LogFile = FileOpen($ResultsFile, $ForWriting)
If @error = -1 Then
    MsgBox(0,"Error","ERROR: Unable to initialize requested log file, " & $ResultsFile & ".")
    FileClose($ResultsFile)
    Exit
EndIf;Err.Number <> 0
ProgressOn("Working...", "Beginning script", "Please wait...",2,-2,18)

For $strOU In $SearchOus
    $objOU = ObjGet("LDAP://" & $strOU & ",DC=YourCompany,DC=local")
;$objOU.Filter = "Computer"
    For $Computer in $objOU
        $strPCName = ($Computer.cn)
        Call("DoSomething", $strPCName)
    Next
Next
Edited by Graywalker

Share this post


Link to post
Share on other sites



Search for adfunctions.au3. This udf has all the functions you need.


My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2017-04-18 - Version 1.4.8.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (NEW 2017-02-27 - Version 1.3.1.0) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2015-04-01 - Version 0.4.0.0) - Download - General Help & Support - Example Scripts
Excel - Example Scripts - Wiki
Word - Wiki
PowerPoint (2015-06-06 - Version 0.0.5.0) - Download - General Help & Support

Tutorials:
ADO - Wiki

 

Share this post


Link to post
Share on other sites

Search for adfunctions.au3. This udf has all the functions you need.

Did that before posting, searched through it - it didn't have what I needed.

If you saw a _ADListComputers function, point it out please. _ADListDomainControllers was about as close as it got.

Share this post


Link to post
Share on other sites

#4 ·  Posted (edited)

Figured it out! The code below grabs every "computer" in the AD and calls the function on each one.

; YOUR DIMS above here

Global $objConnection = ObjCreate("ADODB.Connection"); Create COM object to AD

$objConnection.ConnectionString = "Provider=ADsDSOObject"

$objConnection.Open("Active Directory Provider"); Open connection to AD

$objAD_Recordset = ObjCreate("ADODB.Recordset")

$objAD_Recordset.Open ("SELECT * FROM 'LDAP://DC=YOURDOMAIN,DC=YOURS' WHERE objectClass='computer'", $objConnection,3,3,0x0001)


Do
    $strADPC = $objAD_Recordset.Fields(0).value

    $objPC = ObjGet($strADPC)

    $strPCName = ($objPC.cn)

        Call("DoSomething", $strPCName)

    $objAD_Recordset.MoveNext()

Until $objAD_Recordset.EOF()
    
Exit

; YOUR FUNCTIONS HERE

You can also get more info about the computer with $objPC..operatingSystem or .operatingSystemServicePack, .operatingSystemVersion, .whenChanged, .pwdLastSet, etc.

Edited by Graywalker

Share this post


Link to post
Share on other sites

Hi Graywalker,

to get what you need you would have to use the function _ADGetObjectsInOU of the adfunctions UDF and create a LDAP query to select the required information.

Some of my postings have further information how to create LDAP queries.

If you have further questions just drop me a note.

Thomas


My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2017-04-18 - Version 1.4.8.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (NEW 2017-02-27 - Version 1.3.1.0) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2015-04-01 - Version 0.4.0.0) - Download - General Help & Support - Example Scripts
Excel - Example Scripts - Wiki
Word - Wiki
PowerPoint (2015-06-06 - Version 0.0.5.0) - Download - General Help & Support

Tutorials:
ADO - Wiki

 

Share this post


Link to post
Share on other sites

Hi Graywalker,

to get what you need you would have to use the function _ADGetObjectsInOU of the adfunctions UDF and create a LDAP query to select the required information.

Some of my postings have further information how to create LDAP queries.

If you have further questions just drop me a note.

Thomas

Can you give an example of how that would let me get a list of every single Computer object in the entire domain?

Share this post


Link to post
Share on other sites

#7 ·  Posted (edited)

*Sigh* Actually... the last "Solution" works fine if you have less than 1000 computers in your Active Directory... we, however, have around 4000.

So...

; Prepare Active Directory and Query
Global $objConnection = ObjCreate("ADODB.Connection"); Create COM object to AD
$objConnection.ConnectionString = "Provider=ADsDSOObject"
$objConnection.Open("Active Directory Provider"); Open connection to AD
$objAD_Command = ObjCreate("ADODB.Command")
$objAD_Command.ActiveConnection = $objConnection
$objAD_Command.CommandText = "SELECT * FROM 'LDAP://DC=YOURDOMAIN,DC=YOURS' WHERE objectClass='computer'"
$objAD_Command.Properties("Page Size") = 1000
$objAD_Command.Properties("Searchscope") = 2
$objAD_Recordset = $objAD_Command.Execute
$RecordCount = $objAD_Recordset.recordcount

Do
    $strDN = $objAD_Recordset.Fields(0).value
    $objPC = ObjGet($strDN)
    $strPCName = ($objPC.cn)
    $pcc = $pcc+1; Counts the number of computers you've completed for the progress window.
        $i = 1
        ProgressSet($i, $pcc & " of " & $RecordCount, "Working on " & $strPCName)
        Call("DoSomething", $strPCName, $objPC, $pcc)
    $objAD_Recordset.MoveNext()
Until $objAD_Recordset.EOF()

I should probably note that this carries the OBJECT of the PC over - with the entire fully distinguished name and all. So you can, in your "DoSomething" Function still do things like $OS = $objPC.operatingSystem and such. You would need to turn the progress on with whatever you wanted, but the $pcc keeps a PC count so you can tell where the script is in the task - and relatively how long it has to finish.

Edited by Graywalker

Share this post


Link to post
Share on other sites

That's quite easy

$sOU = "DC=microsoft,DC=com"
_ADGetObjectsInOU($asUser, $sOU, "(objectCategory=computer)", 2, "cn, operatingsystem")
Returns an array ($asUser) of all computers in your domain (defined by $sOU). For every computer the AD fields cn and operatingsystem are returned.


My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2017-04-18 - Version 1.4.8.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (NEW 2017-02-27 - Version 1.3.1.0) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2015-04-01 - Version 0.4.0.0) - Download - General Help & Support - Example Scripts
Excel - Example Scripts - Wiki
Word - Wiki
PowerPoint (2015-06-06 - Version 0.0.5.0) - Download - General Help & Support

Tutorials:
ADO - Wiki

 

Share this post


Link to post
Share on other sites

That's quite easy

$sOU = "DC=microsoft,DC=com"
_ADGetObjectsInOU($asUser, $sOU, "(objectCategory=computer)", 2, "cn, operatingsystem")
Returns an array ($asUser) of all computers in your domain (defined by $sOU). For every computer the AD fields cn and operatingsystem are returned.
Ah... I guess I was stuck with it looking for USERS and thinking it required an actual OU.... doah!

That would do a list...

Of course, I'd probably need to add a variable where you got "cn, operatingsystem" ;

something like

$returns = "cn, distinguishedName, operatingSystem, operatingSystemServicePack, operatingSystemVersion, whenCreated, whenChanged, etc"

I did use the _ADRecursiveGetMemberOf function, that worked out very good. (what I needed the distinguished name for)

For my current purposes, I think what I came up with works better, but will keep this in mind for later projects - Thank you!

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0