WMI抛出异常“;无效查询“;在第二次尝试查询同一服务器时

本文关键字:查询 服务器 抛出异常 无效 WMI 第二次 | 更新日期: 2023-09-27 18:27:29

我有以下代码,几乎所有时候,这些代码都适用于我的大多数服务器,但对于一些特定的服务器,它只是在查询的第二部分失败。这段代码首先查询SQL Server服务,在第二部分中查询SQL Sevrer代理服务。

我已经尝试了创建另一个作用域和查询对象的所有可能组合,但不知何故,我试图查询的服务器没有返回第二部分,看起来在连接作用域并执行第一个查询后,第二部分被服务器上的某些东西阻止了。。!如有任何帮助,不胜感激。。几乎99%的服务器运行良好,并返回期望的结果,但只有两三台服务器在第二部分出现故障。。

如果这是服务器自身的WMI问题。。?有其他方法可以达到这些地位吗。。?比如IPC或Sockets。。?请帮忙。。!

哈希。

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

WMI抛出异常“;无效查询“;在第二次尝试查询同一服务器时

正如我们在评论中所讨论的,我们认为这可能与拥有多个活动的ManagementScope对象有关,请尝试将代码的前半部分更改为:

string agentserviceName = "SQLSERVERAGENT";
string serviceName = "MSSQLSERVER";
// Let the SelectQuery class build our WQL query text...
string className = "Win32_Service";
string condition = string.Format("Name = '{0}'", serviceName);
string[] selectedProperties = new string[] { "Name", "StartName", "State", "StartMode" };
SelectQuery query = new SelectQuery(className, condition, selectedProperties);
using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(query))
{
    searcher.Scope = new ManagementScope("''''" + srvName + "''root''cimv2");
    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";
    }
}
// Second query goes here...

这将在使用完第一个查询后为其处理ManagementObjectSearcher,并确保它保留对远程服务器的ManagementScope的唯一引用。