我遇到了这段代码的问题......显然,它有效,但对我来说太慢了,有没有人有任何想法?当我尝试访问以下
时,它会变慢Dim u As UserPrincipal = UserPrincipal.FindByIdentity(ctx, p.SamAccountName)
同样,下面的代码工作正常,但它作为垃圾很慢。如果我拿出上面的代码,只需要在1秒内搜索p.SamAccountName
,所以我确定我做错了。
Dim sw As New Stopwatch
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
sw.Start()
DataGridView1.ColumnCount = 3
DataGridView1.Columns(0).Name = "Account Name"
DataGridView1.Columns(1).Name = "First Name"
DataGridView1.Columns(2).Name = "Last Name"
Dim ctx = New PrincipalContext(ContextType.Domain, "JOI", DomainName)
Dim userPrin As New UserPrincipal(ctx)
userPrin.Name = "*"
Dim searcher = New System.DirectoryServices.AccountManagement.PrincipalSearcher()
searcher.QueryFilter = userPrin
Dim results = searcher.FindAll()
For Each p As Principal In results
Dim u As UserPrincipal = UserPrincipal.FindByIdentity(ctx, p.SamAccountName)
Dim row As String() = New String() {u.SamAccountName, u.GivenName, u.Surname}
DataGridView1.Rows.Add(row)
Next
sw.Stop()
MessageBox.Show("Finished in :" & sw.Elapsed.Duration.Seconds & " seconds")
End Sub
Private Shared Function DomainName() As String
Dim objRootDSE As New DirectoryEntry("LDAP://RootDSE")
DomainName = objRootDSE.Properties("defaultNamingContext")(0)
End Function
答案 0 :(得分:1)
您已经可以访问搜索结果中的UserPrincipal
,然后您正在对结果中的每个项目执行另一次新搜索。这正是降低你的功能的原因。
我通常会过滤过滤器(LINQ),只会获取UserPrincipal
类型的结果项。这样,它只是一次通过搜索
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
sw.Start()
DataGridView1.ColumnCount = 3
DataGridView1.Columns(0).Name = "Account Name"
DataGridView1.Columns(1).Name = "First Name"
DataGridView1.Columns(2).Name = "Last Name"
Using context As PrincipalContext = New PrincipalContext(ContextType.Domain, "JOI", DomainName)
Using userPrin As UserPrincipal = New UserPrincipal(context)
userPrin.Name = "*"
Using searcher As PrincipalSearcher = New PrincipalSearcher(userPrin)
Dim results = searcher _
.FindAll() _
.OfType(Of UserPrincipal)()
For Each p As UserPrincipal In results
Dim row As String() = New String() {p.SamAccountName, p.GivenName, p.Surname}
DataGridView1.Rows.Add(row)
Next
End Using
End Using
End Using
sw.Stop()
MessageBox.Show("Finished in :" & sw.Elapsed.Duration.Seconds & " seconds")
End Sub