Avatar of wdurrett
wdurrett
Flag for United States of America asked on

Script for Contact Information in AD

Hi Experts.

I have one OU with about 40 child OUs.  In each of these live mail-enabled contacts.  I need  a script that will recursively go through the OUs and generate the following in CSV format:

Name of Contact
Email Address
Title
Office
Group Membership (some contact may be members of up to 5 groups)

Can anyone help me here?  The Group Membership part is the tricky one for me.

Thanks in advance!



PowershellVB ScriptActive Directory

Avatar of undefined
Last Comment
RobSampson

8/22/2022 - Mon
RobSampson

Hi, try this.  Change strOU to suit.

Regards,

Rob.
strOU = "OU=TestUsers,OU=TestOU,"
strOutput = "Contacts.csv"

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objOutput = objFSO.CreateTextFile(strOutput, True)
objOutput.WriteLine """Name"",""Email"",""Title"",""Office"",""Groups"""
Const ADS_SCOPE_SUBTREE = 2
Set objConnection = CreateObject("ADODB.Connection")
Set objCommand =   CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
Set objCommand.ActiveConnection = objConnection
objCommand.Properties("Page Size") = 1000
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
Set objRootDSE = GetObject("LDAP://RootDSE")
strDomain = objRootDSE.Get("defaultNamingContext")
If Trim(strOU) <> "" Then
	If Right(strOU, 1) <> "," Then strOU = strOU & ","
End If
objCommand.CommandText = "SELECT adsPath FROM 'LDAP://" & strOU & strDomain & "' WHERE objectCategory='user' AND objectClass='contact'"
Set objRecordSet = objCommand.Execute
objRecordSet.MoveFirst
While Not objRecordSet.EOF
	Set objUser = GetObject(objRecordSet.Fields("adsPath").Value)
    objOutput.Write """" & objUser.Name & """,""" & objUser.Mail & """,""" & objUser.Title & """,""" & objUser.physicalDeliveryOfficeName & """"
    If TypeName(objUser.MemberOf) = "Empty" Then
    	objOutput.WriteLine ","""
    ElseIf TypeName(objUser.MemberOf) = "String" Then
    	objOutput.WriteLine ",""" & objUser.MemberOf & """"
    Else
    	For Each strGroup In objUser.MemberOf
    		objOutput.WriteLine ",""" & objUser.MemberOf & """"
    	Next
    End If
    objRecordSet.MoveNext
Wend
objOutput.Close
MsgBox "Done. Please see " & strOutput

Open in new window

wdurrett

ASKER
Hi Rob.  Nice to see you agian.  :)

I recived the following error:
Missing '(' after 'if' in if statement.
chapter_info.ps1:17 char:4
+ If  <<<< Trim(strOU) <> "" Then
    + CategoryInfo          : ParserError: (OpenParenToken:TokenId) [], ParseException
    + FullyQualifiedErrorId : MissingEndParenthesisInIfStatement
RobSampson

Hi, sorry, this is not PowerShell.  It's VBS.  Save it as a VBS and run it.

Regarsd,

Rob.
Experts Exchange has (a) saved my job multiple times, (b) saved me hours, days, and even weeks of work, and often (c) makes me look like a superhero! This place is MAGIC!
Walt Forbes
wdurrett

ASKER
Sorry, my bad.   However, I got this new error:

c:>chapter_info.vbs(21, 1) Provider: Table does not exist.

RobSampson

Double check your OU path.  It needs to be listed in reverse order, not including the DC parts.  So, if you need to enumerate:
domain.com/Sites/MainOffice/Users

Then use
strOU = "OU=Users,OU=MainOffice,OU=Sites,"

Regards,

Rob.
wdurrett

ASKER
My bad agian.  I was missing an "s" at the end of my OU.

But now I come back with yet another error:

c:\chapter_info.vbs(32, 7) Microsoft VBScript runtime error: Type mismatch
Get an unlimited membership to EE for less than $4 a week.
Unlimited question asking, solutions, articles and more.
RobSampson

Oh! This time it's my bad.....change this:
          For Each strGroup In objUser.MemberOf
                objOutput.WriteLine ",""" & objUser.MemberOf & """"
          Next

to this
          For Each strGroup In objUser.MemberOf
                objOutput.WriteLine ",""" & strGroup & """"
          Next

Regards,

Rob.
wdurrett

ASKER
OK, that time I did get some output.  However, there are some issues.

1) Iam seeing CN= in front of all the names.  I can deal with this if it has to be this way, but my hope is to pass this along to a non-technical end user for her to run.  That will freak her out.

2) The group names show as "CN=Seattle Core Committee,OU=Seattle,OU=United States,OU=Chapters,OU=Internet Contacts,DC=mydoman,DC=org"  Once again, I woudl like it just say "Seattle Core Committee."

Thanks in advance for your help.

ASKER CERTIFIED SOLUTION
RobSampson

Log in or sign up to see answer
Become an EE member today7-DAY FREE TRIAL
Members can start a 7-Day Free trial then enjoy unlimited access to the platform
Sign up - Free for 7 days
or
Learn why we charge membership fees
We get it - no one likes a content blocker. Take one extra minute and find out why we block content.
Not exactly the question you had in mind?
Sign up for an EE membership and get your own personalized solution. With an EE membership, you can ask unlimited troubleshooting, research, or opinion questions.
ask a question
wdurrett

ASKER
One last request:

If a contact is not a member of any group, can it return "None"?  I am seeing some errors in the output followng a contact that has no group membership.

Thanks dude.  you are awesome.
Experts Exchange is like having an extremely knowledgeable team sitting and waiting for your call. Couldn't do my job half as well as I do without it!
James Murphy
RobSampson

Sure, just change
      If TypeName(objUser.MemberOf) = "Empty" Then
            objOutput.WriteLine ","""

to
      If TypeName(objUser.MemberOf) = "Empty" Then
            objOutput.WriteLine ",None"""

Regards,

Rob.
wdurrett

ASKER
Yes, I just did that before you posted it.

The issue is that for any contact not in a group, the next contact is on the same line.  It is like I need to add a line return in the script for those few contacts.
wdurrett

ASKER
Got it.  I was missing a quote.

Thanks again.
Get an unlimited membership to EE for less than $4 a week.
Unlimited question asking, solutions, articles and more.
RobSampson

No problem. Thanks for the grade.

Regards,

Rob.