我即将完成这项工作。我需要在我们的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'' ')