sql-server - 在 SQL Server 中存储和检索 Active Directory 对象 GUID

标签 sql-server active-directory

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

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

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

我认为它是数据类型(128 长度字节数组?)并且需要转换,但我不确定如何转换。

从事件目录中选择一条记录并插入到一个表中显示数据类型inserted objectGUID as 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+'

但返回错误:数据类型的运算符无效。运算符等于 add,类型等于 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'' ')

关于sql-server - 在 SQL Server 中存储和检索 Active Directory 对象 GUID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27114839/

相关文章:

iis - http 请求如何与 Active Directory 配合使用?

SQL Server : UPDATE statement where MAX query

sql - 只要事务尚未提交,SQL Server 是否允许事务中出现约束违规?

ios - 对 MS Graph API 的请求给了我 "Authorization Request Denied - Insufficient privileges to complete the operation"

azure - Windows Azure Active Directory 和 Office 365 集成

powershell - 如何查找在某个日期范围内被禁用的用户

sql-server - 优化select的执行

sql-server - 同一行上具有相同节点的 T-SQL 解析 XML

sql - 单个 SQL 查询中的分组和聚合字段

windows - 获取AD计算机不像专有名称