2009-08-09 1 views

risposta

10

Una domanda piuttosto generica, ma qui ci sono alcune indicazioni.

È necessario che un server collegato che crea sul server SQL che punta a ADSI (Active Directory Service Interface) qualcosa come questo lo farà.

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

Quindi è possibile utilizzare il seguente tipo di query.


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

Avrai bisogno di impostare il LDAP: // linea in modo appropriato (chiedete al vostro amministratore AD per i dettagli) e di essere consapevole del fatto che adhoc distribuito query utilizzando OpenQuery sono disabilitati per impostazione predefinita in SQL Server. Una volta ottenuto quanto sopra, dovrebbe essere abbastanza facile da google per eventuali variazioni particolari.

+0

Il collegamento ad AD è di sola lettura oppure è possibile inserire anche tramite questo percorso? – Kristen

+0

No, selezionare solo, ma è possibile utilizzare il modello di oggetto COM ADSI per creare utenti. C'è un'introduzione qui http://en.csharp-online.net/User_Management_with_Active_Directory –

5

Sì.

del server collegato:

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'' 
') 

Ci sono un sacco di esempi se Server di ricerca e LDPA collegate su Google. Dico questo perché LDAP può essere abbastanza complicato con cui lavorare.

3

Per superare il limite massimo di 1000 record restituiti alla volta dalle query di Active Directory, è possibile utilizzare la funzione che ho scritto di seguito.

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

Solo una nota; per rimuovere il collegamento utilizzare

exec sp_dropserver 'ADSI'; 
+1

Grazie per aver menzionato questo! – Calanus