0

私は AD プログラミングの初心者ですが、数週間の調査の結果、アカウント名を検索パラメーターとして使用して Active Directory でユーザーを検索する次の 3 つの方法が見つかりました。

オプション 1 - FindByIdentity

Dim ctx As New PrincipalContext(ContextType.Domain, Environment.MachineName)
Dim u As UserPrincipal = UserPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, "MYDOMAIN\Administrator")
If u Is Nothing Then
    Trace.Warn("No user found.")
Else
    Trace.Warn("Name=" & u.Name)
    Trace.Warn("DisplayName=" & u.DisplayName)
    Trace.Warn("DistinguishedName=" & u.DistinguishedName)
    Trace.Warn("EmployeeId=" & u.EmployeeId)
    Trace.Warn("EmailAddress=" & u.EmailAddress)
End If

オプション 2 - DirectorySearcher

Dim connPath As String = "LDAP://" & Environment.MachineName
Dim de As New DirectoryEntry(connPath)
Dim ds As New DirectorySearcher(de)
ds.Filter = String.Format("(&(objectClass=user)(anr={0}))", Split(User.Identity.Name, "\")(1))
ds.PropertiesToLoad.Add("name")
ds.PropertiesToLoad.Add("displayName")
ds.PropertiesToLoad.Add("distinguishedName")
ds.PropertiesToLoad.Add("employeeId")
ds.PropertiesToLoad.Add("mail")
Dim src As SearchResult = ds.FindOne()
If src Is Nothing Then
    Trace.Warn("No user found.")
Else
    For Each propertyKey As String In src.Properties.PropertyNames
        Dim valueCollection As ResultPropertyValueCollection = src.Properties(propertyKey)
        For Each propertyValue As Object In valueCollection
            Trace.Warn(propertyKey & "=" & propertyValue.ToString)
        Next
    Next
End If

オプション 3 - プリンシパルサーチャー

Dim ctx2 As New PrincipalContext(ContextType.Domain, Environment.MachineName)
Dim sp As New UserPrincipal(ctx2)
sp.SamAccountName = "MYDOMAIN\Administrator"
Dim s As New PrincipalSearcher
s.QueryFilter = sp
Dim p2 As UserPrincipal = s.FindOne()
If p2 Is Nothing Then
    Trace.Warn("No user found.")
Else
    Trace.Warn(p2.Name)
    Trace.Warn(p2.DisplayName)
    Trace.Warn(p2.DistinguishedName)
    Trace.Warn(p2.EmployeeId)
    Trace.Warn(p2.EmailAddress)
End If

これらの 3 つの方法はすべて同じ結果を返しますが、特定の方法が他の方法よりも優れているか劣っているのか疑問に思っていました。

厳密に型指定されたプロパティ名を提供するため、オプション 1 または 3 が最適と思われますが、間違っている可能性があります。私の全体的な目的は、サイトで Windows 認証を使用するときに Web ブラウザー経由で渡されたユーザー プリンシパル値に基づいて、AD 内で単一のユーザーを見つけることです (例: "MYDOMAIN\MyUserAccountName")

4

1 に答える 1

1

私にとって、1と3はまったく同じです。C# での LDAP のクエリの回答では、 System.DirectoryServices.Protocols (S.DS.P)を使用した低レベル (ネイティブ LDAP) プロトコルであるマネージ コードを使用する 3 番目の方法を紹介します。

あなたの目的が単にユーザーを認証することなのか、ユーザーを認証して Active-Directory からいくつかのデータ (プロファイル) を取得することなのかはわかりませんが、LDAP クエリは最初はクエリであり、古い方法 (ソリューション2) 取得するプロパティを指定しましょう。選択する前に、パフォーマンスの観点からテストを行ってください。

認証だけが必要な場合は、別の記事のネイティブ LDAPユーザー プリンシパルの応答を比較できます。

于 2012-11-27T05:01:59.570 に答える