Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
?
Solved

Find users who have the same contacts from ADS

Posted on 2007-12-01
9
Medium Priority
?
266 Views
Last Modified: 2010-07-27
We have many users and many contacts that we have the same.Is there a way a script can get only users and contacts that has the same names from the ADS.With the descriptions to a file.

Regards
Sharath
0
Comment
Question by:bsharath
  • 5
  • 2
  • 2
9 Comments
 
LVL 11

Expert Comment

by:cup
ID: 20390609
Please correct me if I'm wrong: I'm not sure about what you're asking or saying.

1) You have many users
2) You have many contacts
3) Some of the users and contacts are the same
4) There is something called the ADS which presumably has some details about the users and contacts.
5) You want to get the users and contacts that have the same name, look them up in the ADS and dump them into a file.

Is that a fair analysis of what you're trying to achieve?  If not, could you please explain what you really want.

Is ADS the Automated Deployment Service for Windows 2003 or is it something completely different?
0
 
LVL 11

Author Comment

by:bsharath
ID: 20390639
You are right but i just want to find users and contacts that have the same Fullname (Displayname)
Any way to get just the users that have contacts and user names the same.
0
 
LVL 11

Expert Comment

by:cup
ID: 20392367
Where are the users and contacts stored?  Is it somewhere in a file or database or do they just login into the system and their id is on some global server.

What is ADS?
0
Concerto's Cloud Advisory Services

Want to avoid the missteps to gaining all the benefits of the cloud? Learn more about the different assessment options from our Cloud Advisory team.

 
LVL 11

Author Comment

by:bsharath
ID: 20393421
The users and contacts are stored in ADS (Active Directory)
0
 
LVL 65

Expert Comment

by:RobSampson
ID: 20562246
Sharath, try this script:

'====================
If Right(LCase(WScript.FullName), 11) = "wscript.exe" Then
      Set objShell = CreateObject("WScript.Shell")
      objShell.Run "cmd /k cscript """ & WScript.ScriptFullName & """", 1, False
      Set objShell = Nothing
      WScript.Quit
End If

Set adoCommand = CreateObject("ADODB.Command")
Set adoConnection = CreateObject("ADODB.Connection")
adoConnection.Provider = "ADsDSOObject"
adoConnection.Open "Active Directory Provider"
adoCommand.ActiveConnection = adoConnection

 ' Search entire Active Directory domain.
Set objRootDSE = GetObject("LDAP://RootDSE")

strDNSDomain = objRootDSE.Get("defaultNamingContext")
'strOUPath = "ou=users,ou=TestOU,"
strOUPath = ""
strBase = "<LDAP://" & strOUPath & strDNSDomain & ">"

strFilter = "(&(objectCategory=person)(objectClass=contact))"
'(profilePath=" & strOldPath & "*)
'strFilter = "(&(objectClass=computer)(cn=" & strComputer & "))"

' Comma delimited list of attribute values to retrieve.
'strAttributes = "sAMAccountName,cn"
strAttributes = "displayName, distinguishedName"

' Construct the LDAP syntax query.
strQuery = strBase & ";" & strFilter & ";" & strAttributes & ";subtree"
adoCommand.CommandText = strQuery
adoCommand.Properties("Page Size") = 100
adoCommand.Properties("Timeout") = 30
adoCommand.Properties("Cache Results") = False

' Run the query for contacts
Set adoContactsRecordset = adoCommand.Execute

' Enumerate the resulting recordset.
Do Until adoContactsRecordset.EOF
      ' Retrieve values and display.
      strContactName = adoContactsRecordset.Fields("displayName").Value
      strContactDN = adoContactsRecordset.Fields("distinguishedName").Value
      WScript.Echo "Checking Contact: " & strContactName & ": " & strContactDN

      'Change and run the query for user accounts
      strFilter = "(&(objectCategory=person)(objectClass=user)(displayName=" & strContactName & "))"
      strQuery = strBase & ";" & strFilter & ";" & strAttributes & ";subtree"
      adoCommand.CommandText = strQuery
      Set adoUsersRecordset = adoCommand.Execute

      Do Until adoUsersRecordset.EOF
            strUserName = adoUsersRecordset.Fields("displayName").Value
            strUserDN = adoUsersRecordset.Fields("distinguishedName").Value
            If LCase(strContactName) = LCase(strUserName) Then
                  WScript.Echo
                  WScript.Echo ">>> " & "CONTACT " & strContactName & ": " & strContactDN
                  WScript.Echo ">>> " & "USER    " & strUserName & ": " & strUserDN
                  WScript.Echo
            End If
            adoUsersRecordset.MoveNext
      Loop

      ' Move to the next record in the recordset.
      adoContactsRecordset.MoveNext
Loop

' Clean up.
adoContactsRecordset.Close
Set adoContactsRecordset = Nothing

adoConnection.Close

WScript.Echo
WScript.Echo "Done"
MsgBox "Done"
'====================

Regards,

Rob.
0
 
LVL 11

Author Comment

by:bsharath
ID: 20562313
Thanks Rob this works perfect.
How does the script nmatch the contacts and NTlogins?
Can i get the output to a file.
0
 
LVL 65

Accepted Solution

by:
RobSampson earned 2000 total points
ID: 20562342
It takes each full Display Name of each Contact object, then searches for a full Display Name from a User object that matches.

This will also output the same text to a file:

'=================
If Right(LCase(WScript.FullName), 11) = "wscript.exe" Then
      Set objShell = CreateObject("WScript.Shell")
      objShell.Run "cmd /k cscript """ & WScript.ScriptFullName & """", 1, False
      Set objShell = Nothing
      WScript.Quit
End If

Set objFSO = CreateObject("Scripting.FileSystemObject")
strOutputFile = Replace(WScript.ScriptFullName, WScript.ScriptName, "") & "Contacts_With_Same_Display_Name_As_Users.txt"
Set objOutputFile = objFSO.CreateTextFile(strOutputFile, True)

Set adoCommand = CreateObject("ADODB.Command")
Set adoConnection = CreateObject("ADODB.Connection")
adoConnection.Provider = "ADsDSOObject"
adoConnection.Open "Active Directory Provider"
adoCommand.ActiveConnection = adoConnection

 ' Search entire Active Directory domain.
Set objRootDSE = GetObject("LDAP://RootDSE")

strDNSDomain = objRootDSE.Get("defaultNamingContext")
'strOUPath = "ou=users,ou=TestOU,"
strOUPath = ""
strBase = "<LDAP://" & strOUPath & strDNSDomain & ">"

strFilter = "(&(objectCategory=person)(objectClass=contact))"
'(profilePath=" & strOldPath & "*)
'strFilter = "(&(objectClass=computer)(cn=" & strComputer & "))"

' Comma delimited list of attribute values to retrieve.
'strAttributes = "sAMAccountName,cn"
strAttributes = "displayName, distinguishedName"

' Construct the LDAP syntax query.
strQuery = strBase & ";" & strFilter & ";" & strAttributes & ";subtree"
adoCommand.CommandText = strQuery
adoCommand.Properties("Page Size") = 100
adoCommand.Properties("Timeout") = 30
adoCommand.Properties("Cache Results") = False

' Run the query for contacts
Set adoContactsRecordset = adoCommand.Execute

' Enumerate the resulting recordset.
Do Until adoContactsRecordset.EOF
      ' Retrieve values and display.
      strContactName = adoContactsRecordset.Fields("displayName").Value
      strContactDN = adoContactsRecordset.Fields("distinguishedName").Value
      WScript.Echo "Checking Contact: " & strContactName & ": " & strContactDN

      'Change and run the query for user accounts
      strFilter = "(&(objectCategory=person)(objectClass=user)(displayName=" & strContactName & "))"
      strQuery = strBase & ";" & strFilter & ";" & strAttributes & ";subtree"
      adoCommand.CommandText = strQuery
      Set adoUsersRecordset = adoCommand.Execute

      Do Until adoUsersRecordset.EOF
            strUserName = adoUsersRecordset.Fields("displayName").Value
            strUserDN = adoUsersRecordset.Fields("distinguishedName").Value
            If LCase(strContactName) = LCase(strUserName) Then
                  WScript.Echo
                  WScript.Echo ">>> " & "CONTACT " & strContactName & ": " & strContactDN
                  WScript.Echo ">>> " & "USER    " & strUserName & ": " & strUserDN
                  WScript.Echo
                  objOutputFile.WriteLine ""
                  objOutputFile.WriteLine ">>> " & "CONTACT " & strContactName & ": " & strContactDN
                  objOutputFile.WriteLine ">>> " & "USER    " & strUserName & ": " & strUserDN
                  objOutputFile.WriteLine ""
            End If
            adoUsersRecordset.MoveNext
      Loop

      ' Move to the next record in the recordset.
      adoContactsRecordset.MoveNext
Loop

' Clean up.
adoContactsRecordset.Close
Set adoContactsRecordset = Nothing

adoConnection.Close

objOutputFile.Close
Set objOutputFile = Nothing
Set objFSO = Nothing

WScript.Echo
WScript.Echo "Done"
MsgBox "Done"
'=================

Regards,

Rob.
0
 
LVL 11

Author Closing Comment

by:bsharath
ID: 31412102
Excellent Rob....
0

Featured Post

Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

In threads here at EE, each comment has a unique Identifier (ID). It is easy to get the full path for an ID via the right-click context menu. However, we often want to post a short link within a thread rather than the full link. This article shows a…
Article by: evilrix
Looking for a way to avoid searching through large data sets for data that doesn't exist? A Bloom Filter might be what you need. This data structure is a probabilistic filter that allows you to avoid unnecessary searches when you know the data defin…
The goal of the video will be to teach the user the difference and consequence of passing data by value vs passing data by reference in C++. An example of passing data by value as well as an example of passing data by reference will be be given. Bot…
Video by: Mark
This lesson goes over how to construct ordered and unordered lists and how to create hyperlinks.
Suggested Courses

578 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question