このコードはほとんどの場合、私のサーバーのほとんどで動作しますが、特定のサーバーでは次のコードクエリ。このコードはSQL Server Service Firstを照会し、2番目の部分ではSQL Sevrer Agent Serviceを照会します。WMIスロー例外2回目の同じサーバーへの照会時に「無効なクエリ」が発生しました
私は別のスコープとクエリオブジェクトを作成する可能性のあるすべての組み合わせを試しましたが、何とかクエリしようとしているサーバーは、スコープが接続された後最初のクエリが実行され、サーバー上の何かによって!このサーバーのほとんどのサーバーは正常に動作し、結果は返ってきますが、2台または3台のサーバーが2台目で失敗します。
これはサーバー上のWMIの問題です。これらのステータスを達成するための他の方法はありますか? IPCやソケットのような..?助けてください..!
ハッシュ。
try
{
agentserviceName = "SQLSERVERAGENT";
serviceName = "MSSQLSERVER";
query = new System.Management.SelectQuery(string.Format("select name, startname, State, StartMode from Win32_Service where name = '{0}'", serviceName));
ManagementScope scope = new ManagementScope("\\\\" + srvName + "\\root\\cimv2");
//ManagementScope scope = new ManagementScope("\\\\ST0176V\\root\\cimv2");
scope.Connect();
System.Management.ManagementObjectSearcher searcher = new System.Management.ManagementObjectSearcher(scope, query);
// MessageBox.Show((String)dgv_ChangeSvcAccount.Rows[i].Cells[1].Value.ToString());
foreach (ManagementObject service in searcher.Get())
{
dgv_ChangeSvcAccount.Rows[i].Cells[4].Value = service["startname"];
dgv_ChangeSvcAccount.Rows[i].Cells[4].Tag = serviceName;
dgv_ChangeSvcAccount.Rows[i].Cells[5].Value = "Currently : " + service["State"] + " - Set As : " + service["StartMode"];
}
if (searcher.Get().Count == 0)
{
dgv_ChangeSvcAccount.Rows[i].Cells[4].Value = "NO SQL Service Found";
}
searcher.Dispose();
ManagementScope scope2 = new ManagementScope("\\\\" + srvName + "\\root\\cimv2");
// ObjectQuery query2 = new ObjectQuery("SELECT * FROM Win32_Service WHERE NAME LIKE '" + serviceName.ToString().ToUpper() + "'");
System.Management.SelectQuery query2 = new System.Management.SelectQuery(string.Format("select name, startname, State, StartMode from Win32_Service where name like '{0}'", agentserviceName));
System.Management.ManagementObjectSearcher searcher1 = new System.Management.ManagementObjectSearcher(scope2, query2);
foreach (ManagementObject service in searcher1.Get()) // <---- this line throws exception for invalid query, and it is always 2 servers which does that, rest of servers returns proper results. the servers which throws this Invlid Query exceptions are Windows 2000 Server with SP4.
{
dgv_ChangeSvcAccount.Rows[i].Cells[6].Value = service["startname"];
dgv_ChangeSvcAccount.Rows[i].Cells[6].Tag = agentserviceName;
dgv_ChangeSvcAccount.Rows[i].Cells[7].Value = "Currently : " + service["State"] + " - Set As : " + service["StartMode"];
}
searcher1.Dispose();
}
catch (System.Exception ex)
{
MessageBox.Show(ex.Message.ToString());
}
「例外」をどの行が投げているのか、またどのデータであるのか具体的に教えてください。それは 'foreach'ブロックの' searcher1.Get() 'への呼び出しですか?常に同じサーバが故障していますか? – BACON
ありがとうございましたBACONさん、詳細を紛失して申し訳ありません。私は、エラーをスローするコードにコメントを追加しました。これらのサーバーはSP4のWindows 2000サーバーであり、excpetionをスローする行はforeach(ManagementObjectサービスsearcher1.Get())、この中のデータは、このサービスのStartName、State、およびStartModeでなければなりません。 – user1265448
別のサービス名でフィルタリングするだけで、まったく同じクエリを2回実行しているように見えます。私はあなたが 'scope.Connect()'を呼んでいるが、 'scope2.Connect()'を呼んでいないことに気づいていますが、 'Connect'メソッドのドキュメントではこのスコープが暗黙的に呼び出されていますそれが接続されることを必要とする操作」。たぶん、Windows 2000は2つの同時スコープ接続が気に入らないでしょうか? 2番目の 'foreach'ブロックの前に' scope2.Connect() 'を挿入して、その行に失敗するかどうか確認してください。 – BACON