Advertisement

02.05.2008 at 02:42PM PST, ID: 23139698
[x]
Attachment Details
[x]
The Solution Rating System

With so many solutions, how can you tell which solutions are most likely to help you and which ones are not? To provide you with a tool to use, we rate our solutions based on various elements that most accurately determine if a solution is a quality solution. To explain what factors affect the solution rating, here are the elements we take into consideration when formulating our solution rating.

  • The Grade of the Solution
  • The Zone Rank of the Expert Providing the Solution
  • The Number of Author and Expert Comments
  • The Number of Experts Contributing
  • The Feedback of the Community

Your Input Matters
Because of the way the system is set up, the most important variable in this equation is you. As a member of Experts Exchange, you are able to cast your vote on the quality of the solutions in regard to how complete, accurate, helpful and easy to understand each solution is. When you provide your feedback, each rating is adjusted accordingly. So, if you see a solution that has a poor rating that you think is a good solution, let us know by rating it. As you do, the rating will be adjusted and will become more accurate for other members of our site.

If you have any suggestions that you would like to make for our rating system, please ask a question in the Suggestions Zone of Community Support.

Thank you!

9.0

Get all AD users (ADODB versus DirectorySearcher) performance issue.

Asked by tobinmarch in Active Directory, Microsoft Visual Basic.Net, Visual Studio

I have 2 serprate functions, One uses an ADODB connection to Active directory and the other is using a DirectorySearcher object to get a "list" of all the user records in our domain.

The intent of this code it to get all our users telephone information from the Cisco Call Manager (LDAP) and import it into Active Directory (Win 2003).

The older method using ADODB is much quicker than the DirectorySearcher method, and the application rusn fine with it enabled. I would like to use the DirectorySearcher method as it doesnt require me to distribute any extra dll's with my application.

What is wrong with this and how could it be optimized to run more efficiently?

We have 2000+ users in AD. The ADODB method takes aprox. 10 sec to populate the array, while the DirectorySearcher method takes over 60sec.

Start Free Trial
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
Imports System
Imports System.IO
Imports System.DirectoryServices
Imports System.DirectoryServices.Protocols
Imports System.Net
Imports System.Text
Imports System.Runtime.InteropServices.COMException
Imports ADODB 'added via reference: C:\Program Files\Microsoft.NET\Primary Interop Assemblies\adodb.dll
 
Module modMain
 
    Sub Main()
        getADUsers_ADODB() '~10sec
        getADUsers_NEW() 'long time
    End Main
 
    Function getADUsers_ADODB()
        Dim arrADUsers As New ArrayList
 
        Try
            Dim oConn As New ADODB.Connection
            Dim oRS As New ADODB.Recordset
            Dim oComm As New ADODB.Command
            'Dim strComputerName As String = Nothing
            Dim strDomainName As String = "saws.org"
 
            ' set connection properties
            With oConn
                .Provider = "ADsDSOObject"
                .Open("Active Directory Provider")
            End With
 
            ' set command properties
            With oComm
                .ActiveConnection = oConn
                .CommandText = "<LDAP://DC=domain,DC=org>;(&(ObjectClass=user)(!ObjectClass=computer)(!description=Built-in*));sAMAccountName,employeeID,telephoneNumber,mail,distinguishedName"
            End With
 
            ' open recordset
            oRS = oComm.Execute
 
            If Not oRS.EOF Then
                oRS.MoveFirst()
                Do Until oRS.EOF
                    Dim arrADUser As New ArrayList
                    If Not oRS.Fields(0).Value.ToString = "" Then
 
                        arrADUser.Add(oRS.Fields(0).Value)
 
                        If Not oRS.Fields(1).Value.ToString = "" Then
                            arrADUser.Add(oRS.Fields(1).Value)
                        Else
                            arrADUser.Add("null")
                        End If
 
                        If Not oRS.Fields(2).Value.ToString = "" Then
                            arrADUser.Add(oRS.Fields(2).Value)
                        Else
                            arrADUser.Add("null")
                        End If
 
                        If Not oRS.Fields(3).Value.ToString = "" Then
                            arrADUser.Add(oRS.Fields(3).Value)
                        Else
                            arrADUser.Add("null")
                        End If
 
                        If Not oRS.Fields(4).Value.ToString = "" Then
                            arrADUser.Add(oRS.Fields(4).Value)
                        Else
                            arrADUser.Add("null")
                        End If
 
                    End If
                    arrADUsers.Add(arrADUser)
                    oRS.MoveNext()
                Loop
            End If
 
            ' clean up objects
            oRS.Close()
            oConn.Close()
            oRS = Nothing
            oComm = Nothing
            oConn = Nothing
 
 
        Catch ex As Exception
            Console.WriteLine()
            Console.WriteLine(ex.Message)
            Console.WriteLine()
            Console.WriteLine(ex.ToString)
        End Try
 
        Return arrADUsers
 
    End Function
 
 Function getADUsers_NEW()
        Dim arrADUsers As New ArrayList
 
        Try
            Dim de As DirectoryEntry = getDirectoryEntry()
            Dim ds As New DirectorySearcher(de)
 
            Dim filter As New StringBuilder
            filter.Append("(&(objectCategory=Person)(objectClass=user))")
 
            ds.Filter = filter.ToString
            ds.SearchScope = DirectoryServices.SearchScope.Subtree
            Dim results As SearchResultCollection = ds.FindAll
 
            Console.WriteLine("User COUNT: {0}", results.Count)
            Console.WriteLine()
 
            For Each result As SearchResult In results
                Dim dey As DirectoryEntry = getDirectoryEntry(result.Path)
                Console.WriteLine("User  : {0}", dey.Properties("sAMAccountName").Value)
                Console.WriteLine("Phone : {0}", dey.Properties("telephoneNumber").Value)
                Console.WriteLine()
                dey.Close()
            Next
 
            de.Close()
 
        Catch ex As Exception
            Console.WriteLine()
            Console.WriteLine(ex.Message)
            Console.WriteLine()
            Console.WriteLine(ex.ToString)
        End Try
 
        Return arrADUsers
 
    End Function
 
    Function getDirectoryEntry(Optional ByVal argPath As String = Nothing) As DirectoryEntry
        Dim de As New DirectoryEntry
        If argPath Is Nothing Then
            de.Path = "LDAP://DC=domain,DC=org"
        Else
            de.Path = argPath
        End If
        de.Username = "domain\username"
        de.Password = "password"
        Return de
    End Function
 
End Module
[+][-]02.06.2008 at 03:56AM PST, ID: 20831206

At Experts Exchange, members can ask their questions to thousands of technology professionals, also known as Experts. Experts compete and collaborate to answer those questions by leaving comments like this one.

Start your 7-day free trial to view this Expert Comment or ask the Experts your question.

 
[+][-]02.06.2008 at 04:07AM PST, ID: 20831254

At Experts Exchange, members can ask their questions to thousands of technology professionals, also known as Experts. Experts compete and collaborate to answer those questions by leaving comments like this one.

Start your 7-day free trial to view this Expert Comment or ask the Experts your question.

 
[+][-]02.06.2008 at 04:16AM PST, ID: 20831298

View this solution now by starting your 7-day free trial. Setting up your free trial is quick, easy, and secure. We will return you to this solution, unlocked, when you're done.

 

About this solution

Zones: Active Directory, Microsoft Visual Basic.Net, Visual Studio
Sign Up Now!
Solution Provided By: Chris-Dent
Participating Experts: 1
Solution Grade: A
 
 
[+][-]02.06.2008 at 08:25AM PST, ID: 20833299

Often, when Experts are collaborating with members who have asked questions, they will request additional information about the problem. Askers respond with an author comment like this one.

Start your 7-day free trial to view this Author Comment or ask the Experts your question.

 
[+][-]02.06.2008 at 09:02AM PST, ID: 20833630

At Experts Exchange, members can ask their questions to thousands of technology professionals, also known as Experts. Experts compete and collaborate to answer those questions by leaving comments like this one.

Start your 7-day free trial to view this Expert Comment or ask the Experts your question.

 
[+][-]02.06.2008 at 11:46AM PST, ID: 20835048

Often, when Experts are collaborating with members who have asked questions, they will request additional information about the problem. Askers respond with an author comment like this one.

Start your 7-day free trial to view this Author Comment or ask the Experts your question.

 
 
Loading Advertisement...
20080716-EE-VQP-32 / EE_QW_2_20070628