WMI создает исключение «Неверный запрос» при второй попытке запроса того же сервера - PullRequest
1 голос
/ 13 марта 2012

У меня есть следующий код, почти все время этот код работает для большей части моего сервера, но для некоторых конкретных серверов он просто не выполняется во второй части запроса.этот код запрашивает службу SQL Server. Сначала и во второй части он запрашивает службу агента SQL Sevrer.

Я испробовал все возможные комбинации для создания другого объекта Scope и Query Object, но каким-то образом сервер, который я пытаюсь запросить, делаетне возвращает вторую часть, похоже, что после подключения области и выполнения первого запроса вторая часть заблокирована чем-то на сервере ..!Любая помощь по этому вопросу приветствуется ... почти 99% серверов работают нормально и возвращают желаемые результаты, но только 2 или 3 сервера терпят неудачу для второй части ..

Если это проблема 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());
}

1 Ответ

3 голосов
/ 14 марта 2012

Поскольку, как мы обсуждали в комментариях, мы думаем, что это может быть связано с наличием нескольких активных 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 для удаленного сервера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...