0

好的,所以我们在 SQL 中有一些表,它们通过活动目录中的 Guid 来识别用户。最初开发团队只想在 sql 中镜像用户群,但经理坚持我们将其保存在活动目录中。因此,无论如何,我们尝试执行的操作之一是从 SQL 中获取一个包含用户 Guid 和一些其他信息的表,并将其连接到一个从 openquery 到 AD 生成的表中。

问题是,如果用户从 AD 中删除,则打开的查询会呕吐。我假设这是因为我们试图导航到活动目录中不存在的条目,并且由于它不是实际的查询(本质上是索引),所以它爆炸了。这是我们用来拉取用户的 ldap 字符串

LDAP://<GUID=(guid here)>

或者更具体地说,类似

SELECT * from openquery(ADSI, '
   SELECT displayName, mail
   FROM LDAP://<GUID=(userGuid)>
')

现在,如果这是一个查询而不是索引,或者在这种情况下是一个“过滤器”,(objectGuid=x) 将简单地不返回任何结果而不是引发错误。但这里的问题是 objectGuid 不会作为 guid 返回到 SQL,它作为二进制 0x102938102938 或一些垃圾返回。现在,我想也许将 Guid 转换为十六进制,然后转换为二进制,然后尝试用它来查询 AD,但我什至不知道从哪里开始。

所以我想这里的最终问题是:我如何通过 guid 查询用户的活动目录,如果该 guid 不存在,它不会抛出错误?这样我可以将它加入到 sql 查询中吗?这需要在 T-SQL 中实现,而不是在使用 .net DirectoryServices 帮助器的代码中实现。

如果这看起来很分散,我很抱歉,我只是想把我们一直在处理的事情放在这里。任何意见表示赞赏,包括采取不同路线的建议。TIA

4

1 回答 1

2

所以有几件事:

至于格式化你的 GUID,你会想要做一个CAST(yourColumn as varchar(38)). 此链接解释了有效的格式 - http://msdn.microsoft.com/en-us/library/windows/desktop/ms677985(v=vs.85).aspx。我不知道临时(如果/如何)你可以告诉 SQL 如何格式化转换的值。您可能需要在线挖掘一个可以为您进行 GUID 格式化的功能。

我建议您加入,看看您是否可以在表值函数中进行 AD 查找,您可以在那里捕获错误并且不返回任何行或返回该行并以这种方式加入。

于 2012-06-29T20:20:36.703 回答