2009-08-09 7 views

Répondre

10

Question assez générale mais voici quelques pointeurs.

Vous avez besoin d'un serveur lié créant sur SQL Server qui pointe vers ADSI (Active Directory Service Interface) quelque chose comme ça le fera.

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

Ensuite, vous pouvez utiliser le type de requête suivant.


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

Vous devez définir le LDAP: // ligne appropriée (demandez à votre administrateur AD pour les détails) et être conscient que adhoc distribué des requêtes en utilisant OpenQuery sont désactivées par défaut dans SQL Server. Une fois que vous avez ce qui précède, il devrait être assez facile de google pour des variations particulières.

+0

Le lien vers AD est-il en lecture seule, ou pouvez-vous Insérer via cette voie aussi? – Kristen

+0

Non, c'est Select uniquement, mais vous pouvez utiliser le modèle d'objet COM ADSI pour créer des utilisateurs. Il y a une intro ici http://fr.csharp-online.net/User_Management_with_Active_Directory –

5

Oui.

serveur lié:

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

Requête:

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

Il y a beaucoup d'exemples si vous le serveur de recherche et Linked LDPA sur Google. Je dis cela parce que LDAP peut être assez compliqué à utiliser.

3

Afin de surmonter la limite maximale de 1000 enregistrements renvoyés à la fois à partir des requêtes Active Directory, vous pouvez utiliser la fonction que j'ai écrite ci-dessous.

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

Juste une note; pour supprimer le lien utiliser

exec sp_dropserver 'ADSI'; 
+1

Merci de mentionner cela! – Calanus