我即将完成这项工作。我需要在我们的Intranet上标识一个用户。我需要将该用户的objectGUID存储在SQL Server数据库表中,并能够再次检索该记录。我有几个不同的应用程序,PHP,ASP Classic和ASP.Net。我认为在SQL Server中执行AD查找可能是最简单的。

我可以使用本教程http://sql.dzone.com/news/querying-active-directory-thro中的步骤连接到AD

我可以检索objectGUID以及我需要的其他任何内容,但是我不确定如何在数据库中存储objectGUID或如何使用objectGUID查询数据库。

我认为这是数据类型(128个长度的字节数组?),需要进行转换,但是我不确定该怎么做。

从活动目录中选择一条记录并插入到表中,显示插入的数据类型objectGUID为varbinary(256)

select  *
into temp_table
from  openquery(adsi, '
select  givenName,
                sn,
                sAMAccountName,
                objectGUID
from    ''LDAP://dc=somedomain,dc=com''
where   sAMAccountName = ''some_user''
')


为了测试,我尝试使用从上面的temp_table检索的objectGUID查询AD。

declare @qry varchar(8000)
declare @var varbinary(256)
set @var = (SELECT objectGUID from temp_table)
set @qry = 'select *
from openquery(ADSI, ''
    select
    givenName,
    sn,
    sAMAccountName
    from ''''LDAP://DC=somedomain,DC=com''''
    where objectGUID = ''''+@var+''''
    ORDER BY displayName
'')'

exec(@qry)


不返回任何行...

最初我认为这是带引号的正确语法

where objectGUID = '+@var+'


但返回错误:数据类型的运算符无效。运算符等于加号,类型等于varchar

所以也许我的语法错误,还是数据类型问题呢?

提前致谢。

最佳答案

若要在单个查询中从AD检索数据,当您请求特定的对象GUID或多个GUID时,可以使用where子句代替from LDAP://<GUID=your guid>表达式(在查询单个GUID时非常方便) 。

查询的where子句中Active Directory对象的GUID必须具有字符串形式,其中GUID以十六进制表示的每个字节均以反斜杠符号开头:

\1B\C1\93\F8\25\32\72\4E\8B\48\48\62\BB\44\49\7A


例如,您有GUID:F893C11B-3225-4E72-8B48-4862BB44497A。首先,必须将其转换为binary(16)类型(长度为16的字节数组),然后转换为十六进制字符串,最后插入反斜杠,如上例所示:

declare @g uniqueidentifier = 'F893C11B-3225-4E72-8B48-4862BB44497A';
declare @gs nvarchar(max);

set @gs = CONVERT(nvarchar(max), CONVERT(binary(16), @g), 2);

declare @c int = 16;
while @c > 0
begin
set @c = @c - 1;
set @gs = STUFF(@gs, (2 * @c) + 1, 0, '\');
end;

declare @q nvarchar(max) =
'select * from openquery(AD,
'' select cn from ''''LDAP://DC=domain,DC=com''''
where objectGUID = ''''' + @gs + '''''
'')';

exec(@q);


上面的代码创建以下查询:

select * from openquery(AD, 'select cn from ''LDAP://DC=domain,DC=com'' where objectGUID = ''\1B\C1\93\F8\25\32\72\4E\8B\48\48\62\BB\44\49\7A'' ')

10-05 20:32