1

特定のユーザーを検索し、Active Directory から氏名、電子メール、部門を出力する次の VBA コードがあります。

 Public Type LDAPUserInfo
    FullName As String
    Email As String
    Department As String
    AccountStatus As String
 End Type


Function FindUser(ByVal username) As LDAPUserInfo
 On Error GoTo Err

 Dim objRoot As Variant
 Dim LDAPdomainName As String
 Dim cn As Variant
 Dim cmd As Variant
 Dim rs As Variant
 Dim LDAPUserInfo As LDAPUserInfo

 Set cn = CreateObject("ADODB.Connection")
 Set cmd = CreateObject("ADODB.Command")
 Set rs = CreateObject("ADODB.Recordset")

 Set objRoot = GetObject("LDAP://RootDSE")
 LDAPdomainName = objRoot.Get("defaultNamingContext") 'Contains the distinguished name for the domain of which this directory server is a member.
'http://msdn.microsoft.com/en-us/library/windows/desktop/ms684291(v=vs.85).aspx

 cn.Open "Provider=ADsDSOObject;"

 cmd.activeconnection = cn
 'cmd.commandtext = "SELECT ADsPath FROM 'LDAP://" & Domain & "' WHERE sAMAccountName = '" & UserName & "'"
 'To see all attributes names available, connect with Active Directory Explorer and add to Select.
 cmd.commandtext = "SELECT cn, mail, physicalDeliveryOfficeName, userAccountControl  FROM 'LDAP://" & LDAPdomainName & "' WHERE sAMAccountName = '" & username & "'"
 Set rs = cmd.Execute

    Debug.Print rs("cn") & " E-mail: " & rs("mail") & " Dept: " & rs("physicalDeliveryOfficeName")
    LDAPUserInfo.FullName = Nz(rs("cn"), "")
    LDAPUserInfo.Email = Nz(rs("mail"), "")
    LDAPUserInfo.Department = Nz(rs("physicalDeliveryOfficeName"), "")

   FindUser = LDAPUserInfo


If Not rs Is Nothing Then rs.Close
If Not cn Is Nothing Then cn.Close

Exit_Err:

 Set rs = Nothing
 Set cmd = Nothing
 Set cn = Nothing
 Set objRoot = Nothing
 Exit Function

Err:

 If Err <> 0 Then
    MsgBox "Error connecting to Active Directory Database: " & Err.Description & vbCrLf & _
            "User: " & username, , "Error: " & Err.Number
 Else
    If Not rs.BOF And Not rs.EOF Then
        rs.MoveFirst
        MsgBox rs(0)
    Else
        MsgBox "Not Found"
    End If
 End If
 Resume Exit_Err

End Function

メインドメインにいるユーザーと連携します。LDAPdomainNameすべてのサブドメイン内で検索できるように変更する方法はありますか?

4

1 に答える 1

1

答えは、特定のフォレスト構成によってわずかに異なります。

一般に、子ドメインも検索する場合は、ADSIに紹介の追跡と呼ばれる処理を実行するように依頼できます。ADSI +追跡紹介を検索すると、これで大量のヒットが得られます...そして最終的に使用するAPIに応じて、それぞれに答えがあります。これに関するいくつかの情報はここにあります:http ://technet.microsoft.com/en-us/library/cc978014.aspx

とはいえ、いくつかのニュアンスがあります。

  • 名前空間の観点から、フォレスト内のすべてのドメインの親が1つではない複数のドメインがある場合(例:foo.com、bar.foo.com、blech.comのあるフォレストがあると想像してください...単一のドメインはありませんそれらすべてをカバーする親)次に、複数の検索を実行するか、ファントムルートコントロールと呼ばれるものを使用する必要があります(ADに全員を検索するように指示する存在しない最上位の親を渡すことができます)
  • この検索は、フォレスト全体のDCにヒットすることに注意してください...追跡するドメインごとに1つ。限られた属性のセットのみを検索する場合は、代わりにグローバルカタログサーバーにアクセスすることをお勧めします。グローバルカタログサーバーは、その1つのサーバーからすべてのドメインに関する情報を提供できます(つまり、すべてローカルであるため、はるかに高速な検索)。これを行うには、グローバルカタログポート(通常は3268/3269(後者はLDAPS))に接続する必要があります。
于 2012-08-31T22:42:14.947 に答える