【问题标题】:Excel VBA - Getting a users LDAP string correctExcel VBA - 正确获取用户 LDAP 字符串
【发布时间】:2011-06-23 16:15:32
【问题描述】:

我不知道我出了什么问题,但我无法正确处理这个字符串!我有这张 Excel 用户信息表,我想通过 LDAP 连接到 AD,但我收到了这个自动化错误“-2147217900 (80040e14)”,这可能意味着 LDAP 字符串中存在语法错误。现在,我使用这个函数来获取用户的专有名称。然后我返回它并尝试通过 adoConnection.Execute 传递它。

返回的 LDAP 字符串如下所示:

<LDAP://CN=Bowie\,David,OU=Geniouses,OU=Music,DC=MasterDomain,DC=local>;ADsPath;subtree

代码如下所示:

ldapStr = "<LDAP://" & getUsersDN("dbowie") & ">;ADsPath;subtree"

函数如下:

Public Function getUsersDN(ByVal strUsername As String)
Const ADS_SCOPE_SUBTREE = 2

Set objConnection = CreateObject("ADODB.Connection")
Set objCommand = CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
Set objCommand.ActiveConnection = objConnection

objCommand.Properties("Page Size") = 1000
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE

objCommand.CommandText = _
    "SELECT distinguishedName FROM 'LDAP://dc=MasterDomain,dc=local' " & _
        "WHERE objectCategory='user' " & _
            "AND sAMAccountName='" & strUsername & "'"
Set objRecordSet = objCommand.Execute

objRecordSet.MoveFirst
Do Until objRecordSet.EOF
    strDN = objRecordSet.Fields("distinguishedName").Value
    getUsersDN = strDN
    objRecordSet.MoveNext
Loop
End Function

【问题讨论】:

    标签: vba vbscript active-directory excel ldap


    【解决方案1】:

    尝试包装关键代码来处理错误,例如:

    on error resume next
    Set objRecordSet = objCommand.Execute
    if err.Number <> 0 then MsgBox "Exception occured: " & err.Description
    on error goto 0
    

    好的,试试其他的。 很久以前我为此编写了存储过程,可能会对您有所帮助

    CREATE   PROCEDURE sp_get_ad_user_info (
        @DomainName  varchar (64),
        @AccountName varchar (128)
    )
    AS
    BEGIN
      DECLARE @adsiSQL nvarchar(1024)
    
      SELECT @adsiSQL = 
         'SELECT samAccountName, Name, mail, Company, l [City], extensionAttribute1 [BirthDay], extensionAttribute2 [HireDay],department,title,telephoneNumber 
          FROM OPENQUERY( ADSI, 
         ''SELECT samAccountName, Name, mail, company, l, extensionAttribute1, extensionAttribute2,department,title,telephoneNumber
          FROM ''''LDAP://' + @DomainName + '''''
          WHERE objectCategory = ''''Person'''' AND objectClass = ''''user'''' AND samAccountName=''''' + @AccountName + '''''' + 
          ''')'
    
      exec sp_executesql @adsiSQL 
    
      RETURN 
    END
    

    【讨论】:

    • 好的,这给了我消息:'发生异常:处理命令期间发生一个或多个错误。 ' 那里的信息真的不多。
    • 这不是 SQL 查询吗?我可以在 VBA 中使用它吗?
    • 这是一个存储过程。你必须在你的 SQL Server 上编译它。哦……你没有 SQL Server?
    • 是的,但我确实不太擅长 SQL。但是这件事应该也可以用 VBA 来实现,对吧?可能是字符串不正确。我有从 AD 导入数据的 VBA 代码。但它针对域中的所有用户。因此,LDAP 字符串不像针对特定用户的那样具体。
    • 是的,它可以使用 VBA。区别在于sql查询。 vb 脚本不会运行 SELECT 而是运行 exec 存储过程。此过程将返回包含所有用户 AD 信息的结果集
    【解决方案2】:

    实际上我自己使用 AzAD Scriptomatic 得到了答案 :)

    代码现在看起来像这样:

            Set objRootDSE = GetObject("LDAP://rootDSE")
            Dim strQuery As String
            strQuery = ("LDAP://" & getUsersDN("dbowie"))
    
            Set objItem = GetObject(strQuery)
    
            '***********************************************
            '*         End connect to an object           *
            '***********************************************
    
            objItem.Put "description", "test"
            objItem.SetInfo
    
        Public Function getUsersDN(ByVal strUsername As String)
            Const ADS_SCOPE_SUBTREE = 2
    
            Set objConnection = CreateObject("ADODB.Connection")
            Set objCommand = CreateObject("ADODB.Command")
            objConnection.Provider = "ADsDSOObject"
            objConnection.Open "Active Directory Provider"
            Set objCommand.ActiveConnection = objConnection
    
            objCommand.Properties("Page Size") = 1000
            objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
    
            objCommand.CommandText = _
                "SELECT distinguishedName FROM 'LDAP://dc=myDomain,dc=local' " & _
                    "WHERE objectCategory='user' " & _
                        "AND sAMAccountName='" & strUsername & "'"
            Set objRecordSet = objCommand.Execute
    
            objRecordSet.MoveFirst
            Do Until objRecordSet.EOF
                strDN = objRecordSet.Fields("distinguishedName").Value
                getUsersDN = strDN
                objRecordSet.MoveNext
            Loop
    End Function
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-11
      • 2021-04-27
      • 1970-01-01
      • 1970-01-01
      • 2018-10-29
      • 2014-12-08
      相关资源
      最近更新 更多