2009-08-09 129 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