C#, SQL Server : WMIを使用したSQL Serverへの生死確認

先ほどはSMOを使ったのですが、SMOは製品版のSQL Server 2008以上が入っていないとコンポーネントが無いだの、ライセンス的にどうよとか、そもそも SQL 2005 以下しかないのにとかどこかしらかご意見をいただいたようなので、それなら素のWMIだと言うことで、WMIのコードで書いてみました。 SQL Server の WMI Provider for Configuration Management を使います。

System.Managementへの参照を追加します。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Management;

namespace TestSqlDmo
{
    public class Sample
    {
        //WMIを使って、SQL Serverの生死確認をする
        public bool WmiTest(string serviceName) {
            string query = "SELECT * FROM SqlService WHERE ServiceName = '" + serviceName + "'";
            
            ManagementObjectSearcher searcher =
                    new ManagementObjectSearcher("root\\Microsoft\\SqlServer\\ComputerManagement10", query);

            bool retval = false;
            foreach (ManagementObject queryObj in searcher.Get())
            {
                Console.WriteLine("-----------------------------------");
                Console.WriteLine("SqlService instance");
                Console.WriteLine("-----------------------------------");
                Console.WriteLine("State: {0}", queryObj["State"]);
                Console.WriteLine("ServiceName: {0}", queryObj["ServiceName"]);

                int serviceState = Convert.ToInt32(queryObj["State"]);
                SqlServerServiceState state = IntToSqlServerServiceState(serviceState);
                if (SqlServerServiceState.Running == state) {
                    retval =  true;
                }
                else {
                    retval =  false;
                }
            }
            return retval;
        }

        private SqlServerServiceState IntToSqlServerServiceState(int state) {
            switch (state) { 
                case 1 :
                    return SqlServerServiceState.Stopped;
                case 2 :
                    return SqlServerServiceState.StartPending;
                case 3 :
                    return SqlServerServiceState.StopPending;
                case 4 :
                    return SqlServerServiceState.Running;
                case 5 :
                    return SqlServerServiceState.ContinuePending;
                case 6 :
                    return SqlServerServiceState.PausePending;
                case 7 :
                    return SqlServerServiceState.Paused;
                default :
                    return SqlServerServiceState.Unknown;
            }
        }
    }

    public enum SqlServerServiceState : int
    { 
        /// 
        /// 未確定。
        /// 
        Unknown = 0,
        /// 
        /// 停止中。サービスは停止しています。
        /// 
        Stopped,
        /// 
        /// 開始保留中。サービスは開始を待機しています。
        /// 
        StartPending,
        /// 
        /// 停止保留中。サービスは停止を待機しています。
        /// 
        StopPending,
        /// 
        /// 実行中。サービスは実行中です。
        /// 
        Running,
        /// 
        /// 継続保留中。サービスは継続を待機しています。
        /// 
        ContinuePending,
        /// 
        /// 一時停止保留中。サービスは一時停止を待機しています。
        /// 
        PausePending,
        /// 
        /// 一時停止中。サービスは一時停止しています。
        /// 
        Paused
    }
}

何か素直にSMO使った方が良いですね。という感じ。

と言うか、よく見るとWMIの名前空間にSQL Serverのバージョン番号が入ってないか? orz

うーん。。。マルチバージョンにどう対応させれば。。。

ちなみにWMIの検索やどんなコード書けばいいかについては古いツールですが WMI Code Creator が便利です。

WMIを使うスクリプトを簡単に作成する

http://www.atmarkit.co.jp/fwin2k/win2ktips/756wmicreator/wmicreator.html

コメントを残す