Найти все экземпляры сервера SQL программно

Я знаю что тамДовольно много тем, похожих на этот, но ни один из них не дал правильного ответа, который я ищу.

Я изо всех сил пытаюсь собрать все экземпляры SQL-Server в нашей сети. Он должен быть в состоянии определить, какая версия SQl-Server запущена. Разные версии, которые мы используем, различаются между ''SQL Server 2000 а также ''SQL Server 2008 R2

Чтобы дать вам небольшую справочную информацию, в настоящее время я занимаюсь разработкой в нашей локальной сети, но позже она будет работать на наших серверах для сбора информации.

Часть собранной информации:

пулы приложенийинсталляции iisвсе базы данных на сервереи еще кое-что как это

Все это работает без проблем через запросы WMI. Но я не могу получить правильные экземпляры SQl-Server с помощью WMI или пространств имен в Visual Studio 2010.

Некоторые из вещей, которые ямы пробовали в соответствии с другими решениями, найденными вокруг stackoverflow и других сайтов:

WMI, используя различные пространства имен, такие какroot\\Microsoft\\SqlServer\\ComputerManagement10 сServerSettings учебный класс. Но это дает только SQLSERVER и SQLEXPRESS без номера версии. Делать это вроде бесполезным.Я тоже пробовалroot\\CIMV2 Win32_Product в том числе, где, как SQL предложение Но это возвращает гораздо больше данных, чем просто то, что я ищу. Кроме того, сам запрос очень медленный.Позже я нашел некоторые классы в Visual Studio, такие какSqlDataSourceEnumerator например. Хотя это работает, только если определенная служба работает и некоторые порты открыты. Что мы предпочтительно не делаем из-за возможных проблем безопасности и возможных неправильных данныхЯ также видел, как некоторые люди ссылались на некоторые другие пространства имен (напишу их здесь, как только я снова их найду), но msdn заявил, что эти пространства имен мысобирается быть удаленным в ближайшем будущем.

Подводя итог: мне нужно получить все установленные экземплярыSQL-Server в домене с версиями от 2000 до 2008 R2.

 CuccoChaser13 нояб. 2012 г., 16:52
Пока нет, этоэто новый для меня. Я'Я посмотрю на это и сообщу о моих результатах позже.
 Pondlife13 нояб. 2012 г., 18:05
Как вы сказали, многие люди задавали этот вопрос раньше, и это не так.не очень понятно, почему ваш вопрос отличается. Какую точную информацию вам нужно, которую вы не можете найти, используя методы, которые выописал? И если вариант 2 возвращаетсябольше данных " чем вам нужно, почему бы просто не отфильтровать или проанализировать его, чтобы получить только ту информацию, которая вам нужна?
 RRUZ13 нояб. 2012 г., 16:42
Вы пробовалиNetServerEnum функционировать?
 CuccoChaser14 нояб. 2012 г., 09:08
Эй, Пондлайф, спасибо за ответ. Проблема с вариантом 2 в том, что запрос очень-очень медленный. Это займет около 3-4 минут. Не очень полезно, если вам нужно запросить это около 80 машин. Факт возврата большего количества данных заключается в том, что он возвращает все в установленном списке продуктов с помощью 'SQL» внутри него. И я не уверен, смогу ли я сделать запрос wmi для этого более конкретным, и в то же время позволить ему получить все экземпляры. Причина того, почему другие темы нене дать мне правильное решение, что они мыустаревшие, ненадежные результаты или только для одной или двух конкретных версий
 CuccoChaser13 нояб. 2012 г., 17:20
Итак, я немного поиграл с функцией NetServerEnum. Он возвращает некоторые необходимые данные, но выглядит так, как будто он все еще зависит от тех же вещей, что и SqlDataSourceEnumerator. Просто запустил его в локальной сети, и неt предоставить все экземпляры sql-сервера в сети. Точно такой же результат, как с NetServerEnum.

Ответы на вопрос(2)

http://msdn.microsoft.com/en-us/library/dd981032.aspx

Работает отлично. Единственное, что нужно упомянуть - это для SQL 2005 - SQL 2008.Я должен проверить для ComputerManagement11 для SQL 2012.

 Kay Lee16 окт. 2016 г., 08:10
Я искал решение, которое неНе нужен браузер SQL .. И это прекрасно работает. Спасибо ! :)
Решение Вопроса

Сначала я сканирую домен на наличие машин.Проверьте, запущена ли служба SQLBrowser, если нет, запустите ее! что сделаноServiceController class находится вsystem.ServiceProcessПосле запуска всего SQLBrowser я используюSqlDataSourceEnumerator перечислять через все экземпляры.

Для тех, кто интересуется кодом:

Примечание: вам нужны права сетевого администратора, чтобы запустить его на удаленных машинах.

public void StartSqlBrowserService(List<string> activeMachines)
{
    ServiceController myService = new ServiceController();
    myService.ServiceName = "SQLBrowser";

    foreach (var machine in activeMachines)
    {
        try
        {
            myService.MachineName = machine;
            string svcStatus = myService.Status.ToString();
            switch (svcStatus)
            {
                case "ContinuePending":
                    Console.WriteLine("Service is attempting to continue.");
                    break;

                case "Paused":
                    Console.WriteLine("Service is paused.");
                    Console.WriteLine("Attempting to continue the service.");
                    myService.Continue();
                    break;

                case "PausePending":
                    Console.WriteLine("Service is pausing.");
                    Thread.Sleep(5000);
                    try
                    {
                        Console.WriteLine("Attempting to continue the service.");
                        myService.Start();
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e.Message);
                    }
                    break;

                case "Running":
                    Console.WriteLine("Service is already running.");
                    break;

                case "StartPending":
                    Console.WriteLine("Service is starting.");
                    break;

                case "Stopped":
                    Console.WriteLine("Service is stopped.");
                    Console.WriteLine("Attempting to start service.");
                    myService.Start();
                    break;

                case "StopPending":
                    Console.WriteLine("Service is stopping.");
                    Thread.Sleep(5000);
                    try
                    {
                        Console.WriteLine("Attempting to restart service.");
                        myService.Start();
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e.Message);
                    }
                    break;
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
    }
}
</string>

И тогда это то, что я использую для извлечения экземпляров.

public static void SqlTestInfo()
{
    SqlDataSourceEnumerator instance = SqlDataSourceEnumerator.Instance;
    DataTable table = instance.GetDataSources();
    DisplayData(table);
}

private static void DisplayData(DataTable table)
{
    foreach (DataRow row in table.Rows)
    {
        foreach (DataColumn dataColumn in table.Columns)
        {
            Console.WriteLine("{0} = {1}", dataColumn.ColumnName, row[dataColumn]);
        }
        Console.WriteLine();
    }
}

Это может быть не лучшим решением, некоторые могут найти его несколько грязным. Но сейчас этоЭто лучший способ обойти меня.

Надеюсь, что это поможет любым людям в будущем с той же проблемой.

Ваш ответ на вопрос