Récupération des membres de groupes AD via requête LDAP et commande EXEC
Bonjour
Je rencontre un problème lors de la récupération des membres de groupes AD via requête LDAP et commande EXEC.
Je suis avec SQL Server 2008 et j'ai créé une procédure stockée qui récupère tous mes groupes AD ainsi que leurs membres.
Après avoir récupérer tous les groupes sans problèmes, je dois passer par des requêtes dynamiques pour obtenir les membres.
Voici le code:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
|
declare @ResteATraite int
declare @AdsPath nvarchar(600)
declare @AdsPathReduit nvarchar(600)
declare @Associat_Groupe nvarchar(100)
declare @Requete nvarchar(4000)
declare @DebRequeteInsert nvarchar(2000)
declare @DebRequete nvarchar(2000)
declare @Clause nvarchar(2000)
declare @ClauseRestric nvarchar(2000)
declare @NbLignes int
set @DebRequeteInsert='INSERT INTO Tempo_ComptesGroupes (Associat_Login,Associat_Groupe) '
SELECT @ResteATraite=count(*) FROM dbo.Tempo_GroupesNT WHERE Traite='N'
--boucle pour chaque groupe
While (@ResteATraite>0)
begin
SELECT TOP 1 @AdsPath=AdsPath , @Associat_Groupe=Groupe FROM dbo.Tempo_GroupesNT WHERE Traite='N'
SET @AdsPathReduit= substring(@AdsPath,8,len(@AdsPath)) -- on supprime LDAP://
set @DebRequete='SELECT samAccountName, ''' + replace(@Associat_Groupe,char(39), char(39)+char(39)) + '''
FROM OPENQUERY(ServeurLieAD,
''SELECT samAccountName
FROM ''''LDAP://DC=....,DC=fr'''' '
set @Clause=' WHERE memberOf=''''' + replace(@AdsPathReduit,char(39), char(39)+char(39)+char(39)+char(39)) + ''''' '
set @Requete= @DebRequeteInsert + @DebRequete + @Clause + @ClauseRestric + ' '')'
--print @Requete
execute (@Requete)
-- groupe traite
UPDATE dbo.Tempo_GroupesNT SET Traite='O' WHERE Traite='N' and AdsPath=@AdsPath
SELECT @ResteATraite=count(*) FROM dbo.Tempo_GroupesNT WHERE Traite='N'
end |
Normalement cela bien fonctionner.
Par contre il me semble y avoir des trous. Je veux donc faire des investigations.
Cette procédure est lancée journalièrement par mon agent SQL.
L'historique me dit qu'elle s'est bien déroulée, mais je vois dans le détails (historique de la tâche) toutes les requêtes (tronqué évidement car trop nombreuses).
Lorsque je lance directement le traitement (depuis sql Server Management studio), j'obtiens à l'écran tous les résultats des insert select, comme si je ne faisais pas d'insert et à un moment je plante Management studio (trop de fenêtres).
Comment empêcher ces "retours" d'informations ?
J'ai déja SET NOCOUNT ON, mais évidement pas suffisant.
J'ai tenté
Code:
1 2
|
execute (@Requete) WITH RESULT SETS NONE |
mais studio tique sur le SETS ?!
Merci pour vos conseils
Solution trouvée par moi-même
En fait le code joint était bon (recopie partielle de celui réellement utilisé).
En fait, les groupes pouvant contenir plus de 1000 membres, limite max à partir de laquelle il n'y a plus de retour (erreur) j'avais fait un découpage.
Et mon code oubliait de rajouter des UNION.
C'est maintenant corrigé.
Et je n'ai plus les retours intempestifs que je signalais.
Code:
1 2 3 4 5 6 7 8 9 10 11
|
set @ClauseRestric=' and samAccountName < ''''H'''' '
set @Requete= @DebRequeteInsert + @DebRequete + @Clause + @ClauseRestric + ' '')'
set @ClauseRestric=' and samAccountName >= ''''H'''' and samAccountName < ''''Q'''' '
set @Requete= @Requete + char(10) + 'UNION ' + char(10) + @DebRequete + @Clause + @ClauseRestric + ' '')'
set @ClauseRestric=' and samAccountName >= ''''Q'''' '
set @Requete= @Requete + char(10) + 'UNION ' + char(10) + @DebRequete + @Clause + @ClauseRestric + ' '')'
--print @Requete
execute (@Requete) |
:D