IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Nom d'une instance SQL via ID du processus


Sujet :

C#

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Septembre 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2
    Points : 4
    Points
    4
    Par défaut Nom d'une instance SQL via ID du processus
    Bonjour à tous,
    je développe en ce moment une application winform en c# qui doit, entre autre, interroger des serveurs distants et récupérer des données sur leurs utilisation (process tournant, utilisation ram, ...)
    Parmi ces serveurs il y a le cas des "serveurs de données" qui sont des serveur windows NT sous lesquels tournent un certains nombre d'instances sqlexpress.
    J'arrive bien a récupérer un processus "sqlservr" par instances en cours mais j'aimerais différencier les différentes instances...
    Mais là je bloque...

  2. #2
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Tu ne pourras pas distinguer les instances en passant par le process. Il faut passer par WMI pour interroger la liste des services qui tournent. A noter, WMI ne permet pas de detecter des instances qui utilisent une version anterieure a SQL Server 2005.

    Voici un code copie/colle de cette page :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Management;
     
    namespace ExpressDetection
    {
        class Program
        {
            static void Main(string[] args)
            {
                if (!EnumerateSQLInstances())
                {
                    Console.WriteLine("There are no instances of SQL Server 2005 or SQL Server 2008 installed");
                }
            }
     
            /// <summary>
            /// Enumerates all SQL Server instances on the machine.
            /// </summary>
            /// <returns></returns>
            public static bool EnumerateSQLInstances()
            {
                string correctNamespace = GetCorrectWmiNameSpace();
                if (string.Equals(correctNamespace, string.Empty))
                {
                    return false;
                }
     
                string query = string.Format("select * from SqlServiceAdvancedProperty where SQLServiceType = 1 and PropertyName = 'instanceID'");
                ManagementObjectSearcher getSqlEngine = new ManagementObjectSearcher(correctNamespace, query);
                if (getSqlEngine.Get().Count == 0)
                {
                    return false;
                }
     
                Console.WriteLine("SQL Server database instances discovered :");
                string instanceName = string.Empty;
                string serviceName = string.Empty;
                string version = string.Empty;
                string edition = string.Empty;
                Console.WriteLine("Instance Name \t ServiceName \t Edition \t Version \t");
     
                foreach (ManagementObject sqlEngine in getSqlEngine.Get())
                {
                    serviceName = sqlEngine["ServiceName"].ToString();
                    instanceName = GetInstanceNameFromServiceName(serviceName);
                    version = GetWmiPropertyValueForEngineService(serviceName, correctNamespace, "Version");
                    edition = GetWmiPropertyValueForEngineService(serviceName, correctNamespace, "SKUNAME");
                    Console.Write("{0} \t", instanceName);
                    Console.Write("{0} \t", serviceName);
                    Console.Write("{0} \t", edition);
                    Console.WriteLine("{0} \t", version);
                }
     
                return true;
            }
     
            /// <summary>
            /// Method returns the correct SQL namespace to use to detect SQL Server instances.
            /// </summary>
            /// <returns>namespace to use to detect SQL Server instances</returns>
            public static string GetCorrectWmiNameSpace()
            {
                String wmiNamespaceToUse = "root\\Microsoft\\sqlserver";
                List<string> namespaces = new List<string>();
     
                try
                {
                    // Enumerate all WMI instances of
                    // __namespace WMI class.
                    ManagementClass nsClass =
                        new ManagementClass(
                        new ManagementScope(wmiNamespaceToUse),
                        new ManagementPath("__namespace"),
                        null);
     
                    foreach (ManagementObject ns in
                        nsClass.GetInstances())
                    {
                        namespaces.Add(ns["Name"].ToString());
                    }
                }
                catch (ManagementException e)
                {
                    Console.WriteLine("Exception = " + e.Message);
                }
     
                if (namespaces.Count > 0)
                {
                    if (namespaces.Contains("ComputerManagement10"))
                    {
                        //use katmai+ namespace
                        wmiNamespaceToUse = wmiNamespaceToUse + "\\ComputerManagement10";
                    }
                    else if (namespaces.Contains("ComputerManagement"))
                    {
                        //use yukon namespace
                        wmiNamespaceToUse = wmiNamespaceToUse + "\\ComputerManagement";
                    }
                    else
                    {
                        wmiNamespaceToUse = string.Empty;
                    }
                }
                else
                {
                    wmiNamespaceToUse = string.Empty;
                }
     
                return wmiNamespaceToUse;
            }
     
            /// <summary>
            /// method extracts the instance name from the service name
            /// </summary>
            /// <param name="serviceName"></param>
            /// <returns></returns>
            public static string GetInstanceNameFromServiceName(string serviceName)
            {
                if (!string.IsNullOrEmpty(serviceName))
                {
                    if (string.Equals(serviceName, "MSSQLSERVER", StringComparison.OrdinalIgnoreCase))
                    {
                        return serviceName;
                    }
                    else
                    {
                        return serviceName.Substring(serviceName.IndexOf('$') + 1, serviceName.Length - serviceName.IndexOf('$')-1);
                    }
                }
                else
                {
                    return string.Empty;
                }
            }
     
            /// <summary>
            /// Returns the WMI property value for a given property name for a particular SQL Server service Name
            /// </summary>
            /// <param name="serviceName">The service name for the SQL Server engine serivce to query for</param>
            /// <param name="wmiNamespace">The wmi namespace to connect to </param>
            /// <param name="propertyName">The property name whose value is required</param>
            /// <returns></returns>
            public static string GetWmiPropertyValueForEngineService(string serviceName, string wmiNamespace, string propertyName)
            {
                string propertyValue = string.Empty;
                string query = String.Format("select * from SqlServiceAdvancedProperty where SQLServiceType = 1 and PropertyName = '{0}' and ServiceName = '{1}'", propertyName, serviceName);
     
                ManagementObjectSearcher propertySearcher = new ManagementObjectSearcher(wmiNamespace, query);
     
                foreach (ManagementObject sqlEdition in propertySearcher.Get())
                {
                    propertyValue = sqlEdition["PropertyStrValue"].ToString();
                }
     
                return propertyValue;
            }
        }
    }
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  3. #3
    Candidat au Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Septembre 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2
    Points : 4
    Points
    4
    Par défaut
    Merci pour ta réponse DotNetMatt,
    en fait j'avais vu la possibilité de passer par WMI et je vais sans doute utiliser cette procédure vu que je dois aussi récupérer des informations tels que le temps processeurs, l'espace disque, ...
    Par contre pour juste les instances SQL j'avais trouvé çà :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SqlDataSourceEnumerator.Instance.GetDataSources();
    je le pose donc là si cela peut servir à d'autre

Discussions similaires

  1. Changer le nom d'une instance SQL Server
    Par ymerej dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 23/05/2007, 16h05
  2. Recuperer le nom d'une instance
    Par Sly2k dans le forum Langage
    Réponses: 5
    Dernier message: 06/11/2006, 14h56
  3. Trouver une instance sql server
    Par fafa139 dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 11/05/2006, 18h13
  4. suppression d'une instance sql serveur
    Par new_wave dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 20/12/2005, 16h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo