首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C# -对多台服务器的WMI查询太慢

C# -对多台服务器的WMI查询太慢
EN

Stack Overflow用户
提问于 2012-08-01 14:56:45
回答 4查看 2.4K关注 0票数 1

我正在尝试从远程win2008服务器返回所有启用的功能。这根本不是什么问题--只要我知道该问什么。

然而,我遇到的问题是,当我的查询找不到结果时,需要很长时间才能验证是否安装了该功能--有时长达2分钟。(查询超过600个节点时不够好)。

下面的代码是我找到的最快的方法,但是正如我所说的:返回false需要花费很长时间:

代码语言:javascript
运行
复制
 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查询最快的解决方案。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-08-02 11:10:52

别把动作串联起来。我不知道WMI内部是否存在瓶颈,但最明显的优化是并行运行整个过程。

票数 2
EN

Stack Overflow用户

发布于 2012-08-01 15:57:06

尝试从具有ManagementObjectSearcher类的服务器特性中直接选择必需的特性:

代码语言:javascript
运行
复制
            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;
票数 2
EN

Stack Overflow用户

发布于 2012-08-07 10:32:02

下面是我最后所做的工作:首先,正如M所提议的,我为列表中的每个节点启动了一个新任务。然后使用'Task.Factory.StartNew()'.并行执行WMI查询。(使用System.Threading.Tasks;)

列表中所有节点的完整执行现在大约需要12秒!

代码语言:javascript
运行
复制
 referenceList.connectionNodes().ForEach(x =>
            {
                var genericTask = Task.Factory.StartNew(() =>
                    {
                        regkeyFactory.testParallelExecution(x);
                    });
            });

谢谢你们的帮助!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11761958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档