AD和DHCP数据整合——(四)通过SQL Server 2008 R2数据库查询AD中的数据

2011年3月27日 | 分类: DB | 标签: , , , , , , ,

经过前文描述,我们已经能够实现自动将DHCP数据导入SQL Server,本文将介绍如何通过SQL Server 来查询AD中的数据,步骤如下:

1. 为数据库建立到AD的连接,SQL Server Management Studio,新建一个查询,执行如下语句:

        sp_addlinkedserver ‘ADSI’, ‘Active Directory Service Interfaces’, ‘ADSDSOObject’, ‘adsdatasource

2. 执行成功后,即可在SQL Server中进行AD数据的查询,查询AD用户的示例如下:

    SELECT     distinguishedName, whenCreated, whenChanged, sAMAccountName AS accountName, sn AS lastName, givenName AS firstName, displayName, mail,
                      telephoneNumber, title, department, manager, ipPhone, badPwdCount, userPrincipalName
FROM         OPENQUERY(ADSI,
                      ‘SELECT distinguishedName, whenCreated, whenChanged, sAMAccountName, sn, givenName, displayName, mail, telephoneNumber, title, department, manager, ipPhone,
badPwdCount, userPrincipalName  FROM ”LDAP://DC=test,DC=com” WHERE objectCategory = ”Person” AND objectClass = ”user”’)

查询AD中组的示例如下:

SELECT  whenCreated, whenChanged, info, sAMAccountName, displayName, distinguishedName as dn, Name, Mail
FROM    OPENQUERY(ADSI,
‘SELECT whenCreated, whenChanged, info, sAMAccountName, displayName, distinguishedName, Name, Mail
FROM ”LDAP://DC=test,DC=com” WHERE objectClass = ”group”’)

一般可以将以上查询写成视图,然后通过查询视图来查询AD数据。

3. 通过上面语句我们是查询AD中所有的用户和组,但是如果AD中数据比较多的话将会存在问题,如果是SQL Server 2005的话,默认只能显示查询结果中的前1000行数据,如果是SQL Server 2008的话默认只能显示前901行数据,否则执行后将会提示消息:“无法从链接服务器 “ADSI” 的 OLE DB 访问接口”ADSDSOObject”提取行。”,遇到此问题可以通过以下方法来解决。

      (1) 在AD中修改MaxPagesize来修改数据显示的数量,我没有试过,具体方法可参见微软文档:http://support.microsoft.com/default.aspx?scid=kb;en-us;315071&sd=tech 

      (2) 以上查询中的ldap路径可以修改成指定OU或Container来查询想要的数据,如LDAP://cn=Users,DC=test,DC=com, 这样就要求我们的AD中用户最好是按公司部门分成不同OU,这样一般来讲一个OU下的用户超过1000的可能性就比较小了。我们为每一个OU创建一个视图,然后再将这些视图合成一个,这样查询数据就基本不会有什么问题了,示例如下:

CREATE VIEW [dbo].[财务部]
AS
SELECT     distinguishedName, whenCreated, whenChanged, sAMAccountName AS accountName, sn AS lastName, givenName AS firstName, displayName, mail,
                      telephoneNumber, title, department, manager, ipPhone, badPwdCount
FROM         OPENQUERY(ADSI,
                      ‘SELECT distinguishedName, whenCreated, whenChanged, sAMAccountName, sn, givenName, displayName, mail, telephoneNumber, title, department, manager, ipPhone,
badPwdCount  FROM ”LDAP://ou=财务部,DC=test,DC=com” WHERE objectCategory = ”Person” AND objectClass = ”user”’)
 

      (3) 这个就是思路了,我们可以在查询中指定具体的查询条件,只查询想要的结果。

通过以上描述,我们就可以实现在SQL Server中查询AD数据了,下一步就可以考虑整合AD用户数据和DHCP数据了。

Written by Nile Jiang
无猖狂以自彰,当阴沉以自深。

目前还没有任何评论.
注意: 评论者允许使用'@user空格'的方式将自己的评论通知另外评论者。例如, ABC是本文的评论者之一,则使用'@ABC '(不包括单引号)将会自动将您的评论发送给ABC。使用'@all ',将会将评论发送给之前所有其它评论者。请务必注意user必须和评论者名相匹配(大小写一致)。