我正在尝试从远程win2008服务器返回所有启用的功能。这根本不是什么问题--只要我知道该问什么。
然而,我遇到的问题是,当我的查询找不到结果时,需要很长时间才能验证是否安装了该功能--有时长达2分钟。(查询超过600个节点时不够好)。
下面的代码是我找到的最快的方法,但是正如我所说的:返回false需要花费很长时间:
public bool serverFeatureEnabled(string machineName, Win32_ServerFeature_ID id)
{
ManagementClass serviceClass = new ManagementClass("Win32_ServerFeature");
string strScope = string.Format(@"\\{0}\root\cimv2", machineName);
ConnectionOptions conOpt = new ConnectionOptions();
serviceClass.Scope = new ManagementScope(strScope, conOpt);
foreach (ManagementObject obj in serviceClass.GetInstances())
{
if ((UInt32)obj["ID"] == (uint)id)
{
return true;
}
}
return false;
}
有没有人对此有更好的想法,我不介意它根本不使用WMI查询。
我想要做的就是加快速度。
我希望我说得有道理!
任何帮助都是非常感谢的。
编辑:
按照Sergrey的建议,我试图“从带有ManagementObjectSearcher类的服务器特性中直接选择所需的特性”。
它确实加快了第一个false的返回速度,但是它需要大约14秒才能完成,所有这些都会将upp添加到集群中查询的所有服务器的140分钟。
编辑2:
我试着使用WBEMTEST ()对Win32_ServerFeature进行测试,到远程计算机的连接似乎是个问题--在其中一台远程计算机上运行测试大约需要12秒才能连接,返回数据大约需要2秒。
因此,Sergrey提出的解决方案似乎是目前为止WMI查询最快的解决方案。
发布于 2012-08-02 11:10:52
别把动作串联起来。我不知道WMI内部是否存在瓶颈,但最明显的优化是并行运行整个过程。
发布于 2012-08-01 15:57:06
尝试从具有ManagementObjectSearcher类的服务器特性中直接选择必需的特性:
string serverName = "serverName";
string className = "Win32_ServerFeature";
string propertyName = "ID";
int propertyValue = 144;
string query = string.Format("SELECT * FROM {0} WHERE {1} = {2}", className, propertyName, propertyValue);
ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
string scopePath = string.Format(@"\\{0}\root\cimv2", serverName);
searcher.Scope = new ManagementScope(string.Format(scopePath));
ManagementObjectCollection mCollection = searcher.Get();
bool featureEnabled = mCollection.Count > 0;
发布于 2012-08-07 10:32:02
下面是我最后所做的工作:首先,正如M所提议的,我为列表中的每个节点启动了一个新任务。然后使用'Task.Factory.StartNew()'.并行执行WMI查询。(使用System.Threading.Tasks;)
列表中所有节点的完整执行现在大约需要12秒!
referenceList.connectionNodes().ForEach(x =>
{
var genericTask = Task.Factory.StartNew(() =>
{
regkeyFactory.testParallelExecution(x);
});
});
谢谢你们的帮助!
https://stackoverflow.com/questions/11761958
复制相似问题