3

是否可以从 AD 中获取多值属性,例如描述、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

4

4 回答 4

5

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

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

因此,您需要找到另一种方法来执行此操作,例如通过使用 SQl-CLR 集成并通过 .NET 访问 Active Directory,或者通过例如将您需要的数据公开为您从 SQL Server 使用的 Web 服务。

于 2013-01-14T11:33:54.250 回答
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''
')

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

于 2013-10-31T15:11:59.450 回答
0

这是我让它工作的技巧/技巧:

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

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

于 2018-07-18T19:14:29.657 回答
0

刚刚写了一个 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

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

于 2019-08-07T17:58:59.857 回答