2

このコードに問題があります...どうやら動作しますが、私には遅すぎます。誰かアイデアはありますか? 以下にアクセスしようとすると遅くなります

Dim u As UserPrincipal = UserPrincipal.FindByIdentity(ctx, p.SamAccountName)

繰り返しますが、次のコードは問題なく動作しますが、非常に遅いです。上記のコードを取り出して検索するp.SamAccountNameと、1秒以内に完了するので、何か間違ったことをしていると確信しています。

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
4

1 に答える 1

1

検索結果の へのアクセスが既にありUserPrincipal、結果の各項目に対して別の新しい検索を実行しています。それがまさにあなたの機能を遅くしているものです。

私は通常、フィルター (LINQ) をフィルター処理し、UserPrincipal型の結果アイテムのみを取得します。そうすれば、検索を1回通過するだけです

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
于 2016-06-11T02:12:35.173 に答える