1

我正在尝试从远程 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 V.

它确实加快了第一个 false 的返回,但是大约需要 14 秒才能完成,所有在集群中查询的所有服务器总共需要 140 分钟。

编辑2:

我尝试使用 WBEMTEST(Windows Management Instrumentation Tester)对 Win32_ServerFeature 运行测试,与远程计算机的连接似乎是问题 - 对其中一台远程计算机运行测试大约需要 12 秒才能连接,大约需要 2 秒才能返回数据。

所以 Sergrey V 提出的解决方案似乎是迄今为止 WMI 查询最快的解决方案。

4

4 回答 4

2

尝试使用 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-01T15:57:06.607 回答
2

不要连续运行该操作。我不知道 WMI 内部是否存在瓶颈,但最明显的优化是并行运行整个事情。

于 2012-08-02T11:10:52.610 回答
1

所以这就是我最终要做的事情:首先,按照 M Afifi 的建议,我为列表中的每个节点启动了一个新任务。然后使用'Task.Factory.StartNew()'并行执行 WMI 查询。(使用 System.Threading.Tasks;)

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

 referenceList.connectionNodes().ForEach(x =>
            {
                var genericTask = Task.Factory.StartNew(() =>
                    {
                        regkeyFactory.testParallelExecution(x);
                    });
            });

谢谢你们的帮助!

于 2012-08-07T10:32:02.547 回答
-1

更快的方法是一体扫描,我使用 ManagementClass 创建了一个 HWID 类,只需 0.07 秒即可获得机器的唯一硬件 ID

于 2015-10-28T08:13:18.320 回答