Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WMI引发异常“;无效查询";在第二次尝试查询同一服务器时_C#_Wmi - Fatal编程技术网

C# WMI引发异常“;无效查询";在第二次尝试查询同一服务器时

C# WMI引发异常“;无效查询";在第二次尝试查询同一服务器时,c#,wmi,C#,Wmi,我有一个下面的代码,几乎在我的大多数服务器上都是这样,但对于某些特定的服务器,它只是在查询的第二部分失败了。这段代码首先查询SQL Server服务,然后在第二部分中查询SQL Sevrer代理服务 我尝试了创建另一个作用域和查询对象的所有可能组合,但不知何故,我尝试查询的服务器没有返回第二部分,看起来在连接作用域并执行第一个查询后,第二部分被服务器上的某个东西阻止了。。!在此问题上的任何帮助都将不胜感激。。几乎99%的服务器工作正常并返回所需的结果,但第二部分只有2或3台服务器出现故障 如果这

我有一个下面的代码,几乎在我的大多数服务器上都是这样,但对于某些特定的服务器,它只是在查询的第二部分失败了。这段代码首先查询SQL Server服务,然后在第二部分中查询SQL Sevrer代理服务

我尝试了创建另一个作用域和查询对象的所有可能组合,但不知何故,我尝试查询的服务器没有返回第二部分,看起来在连接作用域并执行第一个查询后,第二部分被服务器上的某个东西阻止了。。!在此问题上的任何帮助都将不胜感激。。几乎99%的服务器工作正常并返回所需的结果,但第二部分只有2或3台服务器出现故障

如果这是服务器上的WMI问题,它自己。。?有没有其他方法可以达到这些地位。。?像IPC还是插座。。?请帮帮我

散列

试试看
{
agentserviceName=“SQLSERVERAGENT”;
serviceName=“MSSQLSERVER”;
query=new System.Management.SelectQuery(string.Format(“从Win32_服务中选择名称、startname、状态、StartMode,其中名称='{0}',serviceName));
ManagementScope=new ManagementScope(“\\\\”+srvName+“\\root\\cimv2”);
//ManagementScope=new ManagementScope(“\\\\ST0176V\\root\\cimv2”);
scope.Connect();
System.Management.ManagementObjectSearcher searcher=新的System.Management.ManagementObjectSearcher(范围,查询);
//Show((字符串)dgv_changesvccount.Rows[i].Cells[1].Value.ToString());
foreach(searcher.Get()中的ManagementObject服务)
{
dgv_ChangeSvcAccount.Rows[i]。单元格[4]。值=服务[“startname”];
dgv_ChangeSvcAccount.Rows[i]。单元格[4]。标记=serviceName;
dgv_changesvccount.Rows[i].Cells[5].Value=“当前:”+service[“State”]+“-设置为:“+service[“StartMode””;
}
if(searcher.Get().Count==0)
{
dgv_changesvccount.Rows[i].Cells[4].Value=“未找到SQL服务”;
}
searcher.Dispose();
ManagementScope scope2=新的ManagementScope(“\\\\”+srvName+“\\root\\cimv2”);
//ObjectQuery query2=新的ObjectQuery(“从Win32_服务中选择*,其中名称类似“'+serviceName.ToString().ToUpper()+”);
System.Management.SelectQuery query2=new System.Management.SelectQuery(string.Format(“从Win32_服务中选择名称、开始名称、状态、开始模式,其中名称类似于“{0}”,代理服务名称));
System.Management.ManagementObjectSearcher Searcher 1=新的System.Management.ManagementObjectSearcher(范围2,查询2);

foreach(searcher1.Get()中的ManagementObject服务)/因为,正如我们在评论中所讨论的,我们认为这可能与拥有多个活动的
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
的唯一引用。

您需要具体告诉我们哪一行抛出了
异常以及使用了哪些数据。是cal吗l到
foreach
块中的
searcher1.Get()
?总是相同的服务器失败吗?谢谢你,培根,很抱歉错过了详细信息..我已经在代码中添加了注释,它在哪一行抛出错误,这些抛出错误的服务器是带有SP4的windows 2000 server,抛出excpetion的那一行是foreach(searcher1.Get()中的ManagementObject服务),其中的数据应该是此服务的StartName、State和StartMode。看起来您只是在运行完全相同的查询两次,只是对不同的服务名称进行了筛选,所以我无法想象为什么一个有效,而另一个无效。我注意到您正在调用
scope.Connect()
但不是
scope2.Connect()
,尽管它在
Connect
方法的文档中确实说“当在需要连接作用域的操作中使用该作用域时,会隐式调用该方法。”可能Windows 2000不喜欢这两个同时进行的作用域连接?请尝试插入
scope2.Connect()
在第二个
foreach
阻塞并查看它是否在该行失败之前:-,我这样做了,认为服务器可能在一个作用域中限制了两个连接,这就是为什么我使用了scope2.connect(),但运气不好,windows server 2000似乎只允许一个查询,我想我需要终止作用域。connect(),所以我可以在第二次搜索中重新打开一个新查询,但由于作用域没有任何Dispose()方法,我不知道如何杀死它。有什么想法吗?因为您的两个
Scope
对象是使用相同的路径构造的,请尝试完全去掉
scope2
,并将
Scope
传递给
searcher1
System.Management.ManagementObjectSearcher searcher1=new System.Management.Managemen>的构造函数tObjectSearcher(范围,查询2)
Bravo!!!!Bravo!!!这很好!这是一个完美的解决方案。!想得很好。!我不可能想出这种方法。!再一次提醒你。!这个解决方案完成了。!只是一个快速的问题,而不是WMI,我有没有其他方法可以使用IPC或套接字查询服务状态。!有任何示例网站吗?我问的原因是,在许多ot上她的服务器,我们有,确实有WMI坏了,或者RPC服务坏了,不知道如何在不使用WMI的情况下访问它们..!无论如何..!感谢您对此事的答复..!您可以通过调用P/来完成。只需快速浏览文档,它看起来像,函数可能会让您达到目的。但我以前从未这样做过(通过P/Invoke或C)你应该为此提出一个新问题。谢谢你,培根!我会尝试先把手弄脏你的建议。非常感谢你!玩得开心..!没问题。这是一个有趣的问题要解决。我很高兴
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...