2

これに似た問題がかなりあることは知っていますが、どれも私が探している正しい答えを提供していません。

ネットワーク上の SQL-Server のすべてのインスタンスを収集するのに苦労しています。実行中の SQl-Server のバージョンを検出できるはずです。実行中のさまざまなバージョンは、' SQL Server 2000' と ' SQL Server 2008 R2'の間で異なります

少し背景情報を提供するために、現在私はローカルネットワークで開発していますが、後で情報を収集するためにサーバーで実行されます。

収集される情報の一部は次のとおりです。

  • アプリケーション プール
  • iis インストール
  • サーバー上のすべてのデータベース
  • そして、このようなもの

上記のすべてが、WMI クエリを通じて問題なく機能しています。しかし、Visual Studio 2010 内の WMI または名前空間によって SQl-Server の正しいインスタンスを取得できません。

stackoverflow や他のサイトで見つかった他のソリューションに従って試したことのいくつか:

  1. クラスなど、さまざまな名前空間を使用する WMI root\\Microsoft\\SqlServer\\ComputerManagement10ServerSettingsただし、これはバージョン番号なしで SQLSERVER と SQLEXPRESS のみを提供します。それを役に立たないものにします。
  2. またroot\\CIMV2 Win32_Product、where like sql 句を含めてみました。しかし、これは私が探しているものよりもはるかに多くのデータを返します。さらに、クエリ自体が非常に遅いです。
  3. SqlDataSourceEnumerator後で、たとえばVisual Studio 内でいくつかのクラスを見つけました。これは、特定のサービスが実行されていて、いくつかのポートが開いている場合にのみ機能します。セキュリティ上の問題や誤ったデータの可能性があるため、これは好ましくありません。
  4. 他の名前空間を参照している人も何人か見ました (また見つけたらここに書きます)。

要約するSQL-Serverと、バージョンが 2000 ~ 2008 R2 のドメインにインストールされている のすべてのインスタンスを取得する必要があります。

4

2 に答える 2

9

わかりましたので、問題を解決しました。私がやったことはいくつかあります:

  • まず、ドメインをスキャンしてマシンを探します。
  • 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);
        }
    }
}

そして、これは私がインスタンスを取得するために使用するものです。

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();
    }
}

これは最善の解決策ではないかもしれません。多少汚れているかもしれません。しかし、今のところ、それが私が得ることができる最善の回避策です。
これが、将来同じ問題を抱えている人に役立つことを願っています。

于 2012-11-15T09:34:11.170 に答える
3

ここのコードを使用しました: http://msdn.microsoft.com/en-us/library/dd981032.aspx

よく働く。言及する唯一のことは、これが SQL 2005 - SQL 2008 の場合です。SQL 2012 の場合は ComputerManagement11 を確認する必要があります。

于 2014-03-25T00:31:02.180 に答える