【问题标题】:How get multi value data form Active Directory using SQL如何使用 SQL 从 Active Directory 中获取多值数据
【发布时间】:2013-01-14 11:29:17
【问题描述】:

是否可以从 AD 中获取多值属性,例如 description、memberOf。如果我只是通过添加 memberOf 来运行,则会出现错误

select * 
FROM OPENQUERY(ADSI,'SELECT initials, samAccountName, displayName, distinguishedName, mail, memberOf FROM ''LDAP://DC=corp, DC=contoso, DC=com'' WHERE objectClass=''Person''')

错误:

消息 7346,第 16 级,状态 2,第 1 行
无法获取该行的数据 来自链接服务器“ADSI”的 OLE DB 提供程序“ADSDSOObject”。 由于符号以外的原因无法转换数据值 不匹配或溢出。

这是因为 memberOf 是 Active Directory 中的多值属性。我正在使用 SQL Server 2008 R2

【问题讨论】:

    标签: sql-server active-directory sql-server-2008-r2


    【解决方案1】:

    不,你不能这样做 - 也没有“技巧”或黑客让它工作。

    SQL Server 的 ADSI 提供程序相当有限 - 不支持多值属性是这些限制之一。

    所以你需要找到另一种方法来做到这一点,例如通过使用 SQl-CLR 集成并通过 .NET 访问 Active Directory,或者通过例如将您需要的数据公开为您从 SQL Server 使用的 Web 服务。

    【讨论】:

    • 您知道自您发布此答案以来的 5 年内是否对此有任何更改?具体来说,从lDAPAdminLimits 读取MaxPageSizestackoverflow.com/questions/50622579/…?充满希望但令人怀疑。
    【解决方案2】:

    虽然您不能使用 ADSI 返回 memberof,但您可以查询 memberof,因此如果您有一个要检查的组,您可以执行以下操作,其中 extenstionAttribute3 是员工 ID:

    SELECT displayName
    FROM OPENQUERY(ADSI,
    'SELECT displayName
    FROM ''LDAP://DC=company,DC=com''
    WHERE memberof = ''CN=staff,OU=SharepointGroups,DC=company,DC=com''
    AND extensionAttribute3 = ''12345678''
    ')
    

    如果返回值不为空,那么您可以假设用户是该组的一部分。

    【讨论】:

      【解决方案3】:

      这是我让它发挥作用的技巧/窍门:

      exec xp_cmdshell 'powershell -command "get-aduser -filter * -properties SamAccountName, <MultiValue> | Select samaccountname, <MultiValue>"' 
      

      &lt;MultiValue&gt; 更改为您要提取的任何属性。它将在 SQL 中以逗号分隔的形式输出值。根据需要更改 PowerShell cmdlet。您所要做的就是收集输出,对其进行格式化,并将其加入您的其他数据中。此外,请确保您的服务器具有 AD PowerShell 模块并且您已在 SQL 中启用 xp_cmdshell。

      【讨论】:

        【解决方案4】:

        刚刚写了一个sql脚本,在我们公司的Intranet目录中包含描述(多值)字段。我所做的是使用 powershell 分隔导出 csv,然后将该信息批量插入到表中。对我来说最简单的解决方案,因为我们只有大约 650 名员工(记录)。

        exec xp_cmdshell 'powershell.exe -command "get-aduser -filter * -properties SamAccountName, Description,GivenName,sn,title,telephoneNumber,mobile,mail,physicalDeliveryOfficeName| Select SamAccountName, Description,GivenName,sn,title,telephoneNumber,mobile,mail,physicalDeliveryOfficeName| export-csv -encoding unicode -delimiter "`t" -path C:\SQLJobs\addir.csv -notype"'
        
        Go
        
        CREATE TABLE dbLiftowDir.dbo.ADDir
        (
        [SamAccountName] NVARCHAR(4000),
        [Description] NVARCHAR(4000),
        [GivenName] NVARCHAR(4000),
        [sn] NVARCHAR(4000),
        [title] NVARCHAR(4000)COLLATE French_CI_AS NOT NULL,
        [telephoneNumber] NVARCHAR(4000),
        [mobile] NVARCHAR(4000),
        [mail] NVARCHAR(4000),
        [physicalDeliveryOfficeName] NVARCHAR(4000),
        )
        
        BULK
        INSERT dbLiftowDir.dbo.ADDir
        FROM 'C:\SQLJobs\addir.csv'
        WITH
        (
         CODEPAGE = 'ACP',
           DATAFILETYPE ='char',
           FIELDTERMINATOR = '\t',
           ROWTERMINATOR = '\n',
           FIRSTROW = 2
        

        我做的其他事情是使用 set column replace value 从字段值中删除 ",并删除非人工帐户的行。因为我发现在 SQL 中执行它比将代码传递到 powershell 更容易。

        【讨论】:

          猜你喜欢
          • 2011-02-20
          • 2020-09-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多