2009-08-09 148 views

回答

10

相当普遍的问题,但这里有一些指针。

您需要在SQL Server上创建指向ADSI(活动目录服务接口)的链接服务器才能做到这一点。

EXEC sp_addlinkedserver 'ADSI', 'Active Directory Services 2.5', 'ADSDSOObject', 'adsdatasource'

然后,您可以使用以下类型的查询。


SELECT * 
FROM OPENQUERY(ADSI, 'SELECT sAMAccountName 
FROM ''LDAP://DC=MyDC,DC=com,DC=uk'' 
WHERE objectCategory = ''Person'' 
AND objectClass = ''user'') 

你需要设置LDAP://线适当地(索要详细信息,请AD管理员),并意识到分布式即席使用OPENQUERY默认情况下在SQL Server中禁用查询。一旦你有了上面的内容,但对于任何特定的变体,Google都应该很容易。

+0

到AD的链接是只读还是可以通过此路由插入呢? – Kristen 2009-11-11 19:28:24

+0

不,它只是选择,但您可以使用ADSI COM对象模型创建用户。这里有一个介绍http://en.csharp-online.net/User_Management_with_Active_Directory – 2009-11-12 17:15:11

5

是的。

链接服务器:

EXEC master.dbo.sp_addlinkedserver 
    @server = N'ADSI', 
    @srvproduct=N'Active Directory Services', 
    @provider=N'ADsDSOObject', 
    @datasrc=N'Servername.domain.com' 

查询:

select * from openquery 
(
ADSI,'SELECT name 
FROM ''LDAP://Servername.domain.com'' 
WHERE objectCategory = ''Person'' AND objectClass = ''user'' 
') 

有很多的例子,如果你搜索链接服务器和LDPA谷歌。 我这样说是因为LDAP可能相当复杂。

3

为了克服Active Directory查询一次返回1000条记录的最大限制,可以使用我在下面写的函数。

CREATE FUNCTION [dbo].[tf_GetAllUsersFromActiveDirectory] 
() 
RETURNS 
    @USERS TABLE 
     ( 
       sAMAccountName VARCHAR(25)    PRIMARY KEY CLUSTERED  
      , givenName VARCHAR(200) 
      , SN VARCHAR(200) 
      , userAccountControl VARBINARY(8) 
      , mail VARCHAR(200) 
     ) 
AS 
BEGIN 

INSERT INTO @Users 
SELECT sAMAccountName,givenName, sn, userAccountControl,mail FROM OpenQuery(ADSI, '<LDAP://YourDomain.com:389>;(&(objectClass=User)(|(sAMAccountName=A*)(sAMAccountName=B*)(sAMAccountName=C*)(sAMAccountName=D*)));sAMAccountName,givenName, sn, mail,userAccountControl;subtree') 
UNION ALL 
SELECT sAMAccountName,givenName, sn, userAccountControl,mail FROM OpenQuery(ADSI, '<LDAP://YourDomain.com:389>;(&(objectClass=User)(|(sAMAccountName=E*)(sAMAccountName=F*)(sAMAccountName=G*)(sAMAccountName=H*)));sAMAccountName,givenName, sn, mail,userAccountControl;subtree') 
UNION ALL 
SELECT sAMAccountName,givenName, sn, userAccountControl,mail FROM OpenQuery(ADSI, '<LDAP://YourDomain.com:389>;(&(objectClass=User)(|(sAMAccountName=I*)(sAMAccountName=J*)(sAMAccountName=K*)(sAMAccountName=L*)));sAMAccountName,givenName, sn, mail,userAccountControl;subtree') 
UNION ALL 
SELECT sAMAccountName,givenName, sn, userAccountControl,mail FROM OpenQuery(ADSI, '<LDAP://YourDomain.com:389>;(&(objectClass=User)(|(sAMAccountName=M*)(sAMAccountName=N*)(sAMAccountName=O*)(sAMAccountName=P*)));sAMAccountName,givenName, sn, mail,userAccountControl;subtree') 
UNION ALL 
SELECT sAMAccountName,givenName, sn, userAccountControl,mail FROM OpenQuery(ADSI, '<LDAP://YourDomain.com:389>;(&(objectClass=User)(|(sAMAccountName=Q*)(sAMAccountName=R*)(sAMAccountName=S*)(sAMAccountName=T*)));sAMAccountName,givenName, sn, mail,userAccountControl;subtree') 
UNION ALL 
SELECT sAMAccountName,givenName, sn, userAccountControl,mail FROM OpenQuery(ADSI, '<LDAP://YourDomain.com:389>;(&(objectClass=User)(|(sAMAccountName=U*)(sAMAccountName=V*)(sAMAccountName=W*)(sAMAccountName=X*)));sAMAccountName,givenName, sn, mail,userAccountControl;subtree') 
UNION ALL 
SELECT sAMAccountName,givenName, sn, userAccountControl,mail FROM OpenQuery(ADSI, '<LDAP://YourDomain.com:389>;(&(objectClass=User)(|(sAMAccountName=Y*)(sAMAccountName=Z*)));sAMAccountName,givenName, sn, mail,userAccountControl;subtree') 

RETURN 
END 
GO 
3

只是一个说明;删除链接使用

exec sp_dropserver 'ADSI'; 
+1

谢谢你提到这个! – Calanus 2010-03-18 14:08:34