[SQL Server] Afficher les noms des comptes AD qui démarrent les différents services SQL Server
--
=============================================
--
Author:     KHARROUBI Zouhaier
--
Create date: 17/09/2021
-- Description:
Afficher tous les comptes AD qui démarrent les services SQL Server
--
=============================================
BEGIN
       -- SET NOCOUNT
ON added to prevent extra result sets from
       -- interfering
with SELECT statements.
       SET NOCOUNT ON;
       IF EXISTS(SELECT * FROM tempdb..sysobjects
WHERE id = object_id(N'[tempdb]..[#Serveurs_LiesTemp]'))
             BEGIN
                    DROP
TABLE #Serveurs_LiesTemp
             END
       IF EXISTS(SELECT * FROM tempdb..sysobjects
WHERE id = object_id(N'[tempdb]..[#Serveurs_Lies]'))
             BEGIN
                    DROP
TABLE #Serveurs_Lies
             END
       IF EXISTS(SELECT * FROM tempdb..sysobjects
WHERE id = object_id(N'[tempdb]..[#Resultat]'))
             BEGIN
                    DROP
TABLE #Resultat
             END
       CREATE TABLE #Serveurs_LiesTemp
       (
       SRV_NAME                         VARCHAR(150),
       SRV_PROVIDERNAME           VARCHAR(150),
       SRV_PRODUCT                      VARCHAR(150),
       SRV_DATASOURCE                   VARCHAR(150),
       SRV_PROVIDERSTRING         VARCHAR(150),
       SRV_LOCATION               VARCHAR(150),
       SRV_CAT                                 VARCHAR(150)
       )                          
       CREATE TABLE #Serveurs_Lies
       (
       Num_Lig                                 INT IDENTITY (1,1),
       SRV_NAME                         VARCHAR(150),
       SRV_DATASOURCE                   VARCHAR(150),
       ServerName                       VARCHAR(150) NULL
       )
       CREATE NONCLUSTERED INDEX
[IDX_#Serveurs_Lies_ServerName] ON #Serveurs_Lies
       (
             ServerName
ASC
       )
       CREATE TABLE #Resultat
       (
       Num_Lig                                                    INT IDENTITY (1,1),
       Serveur_Lie                                          VARCHAR(150) NULL,
       InstanceSQLServer                             VARCHAR(150)    NULL,
       servicename                                          VARCHAR(150)    NULL,
    service_account                                  VARCHAR(150)    NULL,
       Requete                                                     NVARCHAR(MAX)   NULL,
       message_erreur_exec                           VARCHAR(max) NULL
       )
       DECLARE       @Num_Lig                        AS INT
                    ,@Nbre_Lig                       AS
INT
                    ,@Serveur_Lie              AS
VARCHAR(150)
                    ,@ServerName               AS
NVARCHAR(4000)
                    ,@Requete                        AS
NVARCHAR(MAX)
                    ,@LocalHot                       AS
VARCHAR(50)
                    ,@message_erreur_exec      AS VARCHAR(max)     
       
    -- Insert statements
for procedure here
       SELECT
@LocalHot           = @@SERVERNAME
       INSERT INTO #Serveurs_LiesTemp
       EXEC sp_linkedservers  
       INSERT INTO #Serveurs_Lies (SRV_NAME,SRV_DATASOURCE)
       SELECT DISTINCT SRV_NAME,SRV_DATASOURCE FROM
#Serveurs_LiesTemp 
             
             
       SELECT
@Num_Lig=1,@Nbre_Lig=COUNT(Num_Lig) FROM #Serveurs_Lies
       SELECT
@Num_Lig=1,@Nbre_Lig=COUNT(Num_Lig) FROM #Serveurs_Lies
WHILE  @Num_Lig <=
@Nbre_Lig
       BEGIN
             BEGIN
TRY
                    SELECT
@Serveur_Lie =SRV_DATASOURCE FROM #Serveurs_Lies WHERE
Num_Lig=@Num_Lig
                    SELECT
@Requete      =
CASE WHEN
@LocalHot<>@Serveur_Lie THEN N'SELECT
@ServerName_Out=ServerName FROM OPENQUERY(' + QUOTENAME(@Serveur_Lie) + N',''SELECT @@SERVERNAME AS
ServerName'')' ELSE
'SELECT @ServerName_Out=@@SERVERNAME' END
                    EXECUTE
sp_executesql @Requete,N'@ServerName_Out
VARCHAR(150) OUTPUT',@ServerName_Out=@ServerName OUTPUT
                    IF
NOT EXISTS (SELECT ServerName FROM #Serveurs_Lies WHERE
ISNULL(ServerName,'')=@ServerName)
                          BEGIN
                                 UPDATE #Serveurs_Lies 
                                       SET
                                       ServerName=@ServerName
                                 WHERE Num_Lig=@Num_Lig
       
                                 SELECT @Requete = CASE WHEN @LocalHot<>@Serveur_Lie THEN  N'SELECT * FROM
OPENQUERY(' + QUOTENAME(@Serveur_Lie) + ',''' ELSE '' END
                                 SELECT @Requete =
@Requete + N'SELECT
DISTINCT ''''' + @Serveur_Lie + ''''', @@SERVERNAME AS InstanceSQLServer,[servicename],[service_account] FROM [master].[sys].[dm_server_services]'
             
                                 SELECT @Requete = CASE WHEN @LocalHot<>@Serveur_Lie THEN
@Requete + N''')'
ELSE REPLACE(@Requete,'''''','''') END
                                 PRINT @Requete
                                 INSERT INTO #Resultat (Serveur_Lie,InstanceSQLServer,servicename,service_account)
                                 EXECUTE sp_executesql @Requete    
                          END
             END
TRY
             BEGIN
CATCH
                    SELECT
@Serveur_Lie AS Serveur_Lie, ERROR_MESSAGE() AS Message_Erreur
                    INSERT
INTO #Resultat (Serveur_Lie,Requete,message_erreur_exec)
                    VALUES
(@Serveur_Lie,@Requete,ERROR_MESSAGE())
             END
CATCH
             SELECT  @Num_Lig
=  
@Num_Lig + 1
       END
SELECT * FROM #Resultat
DROP TABLE
#Serveurs_LiesTemp
DROP TABLE #Serveurs_Lies
DROP TABLE #Resultat
END
 
