2009-08-09 35 views

Trả lời

10

Câu hỏi khá chung nhưng dưới đây là một số gợi ý.

Bạn cần một máy chủ được liên kết tạo trên máy chủ SQL trỏ đến ADSI (Giao diện dịch vụ thư mục hoạt động) một cái gì đó như thế này sẽ làm điều đó.

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

Sau đó, bạn có thể sử dụng loại truy vấn sau.


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

Bạn sẽ cần phải đặt LDAP: // dòng một cách thích hợp (yêu cầu AD admin của bạn cho các chi tiết) và lưu ý rằng Adhoc phân phối truy vấn sử dụng OpenQuery bị vô hiệu hóa theo mặc định trong SQL Server. Một khi bạn có ở trên mặc dù nó phải được khá dễ dàng để google cho bất kỳ biến thể cụ thể.

+0

Có phải liên kết đến chỉ đọc AD hoặc bạn có thể chèn qua tuyến đường này không? – Kristen

+0

Không, nó chỉ chọn nhưng bạn có thể sử dụng mô hình đối tượng COM ADSI để tạo người dùng. Có phần giới thiệu ở đây http://en.csharp-online.net/User_Management_with_Active_Directory –

5

Có.

Linked server:

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

Query:

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

Có rất nhiều ví dụ nếu bạn tìm kiếm liên kết máy chủ và LDPA trên Google. Tôi nói điều này vì LDAP có thể khá phức tạp để làm việc.

3

Để khắc phục giới hạn tối đa 1000 bản ghi được trả lại cùng một lúc từ truy vấn Active Directory, bạn có thể sử dụng hàm mà tôi đã viết bên dưới.

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

Chỉ cần lưu ý; để xóa liên kết sử dụng

exec sp_dropserver 'ADSI'; 
+1

Cảm ơn bạn đã đề cập đến điều này! – Calanus

Các vấn đề liên quan