检查 C# 中的 WMI 命名空间是否存在

发布于 2024-11-05 09:52:43 字数 653 浏览 1 评论 0原文

我想检查某台机器上是否安装了某个功能。 我有一个 powershell 代码来检查这一点,现在我想从 .net 代码中检查这一点。 我可以看到,在 cmdlet 中,代码检查是否存在 无效命名空间 错误。

在网上搜索时,我发现了以下代码:

ManagementClass myClass = new ManagementClass(scope, path, getOptions);

try
{
    myClass.get();
}
catch (System.Management.Exception ex)
{
    if (ex.ErrorCode == ManagementStatus.InvalidNamespace)
    {
         return true;
    }
}
 ...   

我想稍微清理一下这段代码,所以基本上我有两个问题:

  1. 是否有另一种方法来检查 InvalidNamespace 错误? (我复制的代码后来用于调用 myClass 中的某些方法,所以我想知道我是否可以以更直接的方式实现我的目标)

  2. 我真的需要参数 <代码> getOptions ?

I want to check if a certain feature is installed on a certain machine.
I have a powershell code that checks this, and now I want to check this from .net code.
I can see that in the cmdlet, the code checks if there is an invalid namespace error.

When searching the web, I found the following code:

ManagementClass myClass = new ManagementClass(scope, path, getOptions);

try
{
    myClass.get();
}
catch (System.Management.Exception ex)
{
    if (ex.ErrorCode == ManagementStatus.InvalidNamespace)
    {
         return true;
    }
}
 ...   

I want to clean this code a bit, so basically I have 2 questions:

  1. Is there another way to check for an InvalidNamespace error? (The code I've copied was later used to invoke some method within myClass, so I wonder if I can somehow achieve my goal in a more direct way)

  2. Do I really need the parameter getOptions?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

苏佲洛 2024-11-12 09:52:43

要获取所有 wmi 命名空间,您必须首先连接到根命名空间,然后查询所有 __NAMESPACE 实例,并对每个实例递归地重复此过程。关于 getOptions 参数,该参数是 ObjectGetOptions class 在这种情况下不是必需的,因此可以为 null。

检查此代码以获取所有 wmi 命名空间(您可以使用该信息填充列表,然后检查计算机中是否存在命名空间)

using System;
using System.Collections.Generic;
using System.Text;
using System.Management;

namespace MyConsoleApplication
{
    class Program
    {
        static private void GetWmiNameSpaces(string root)
        {
            try
            {
                ManagementClass nsClass = new ManagementClass( new ManagementScope(root), new ManagementPath("__namespace"), null);
                foreach (ManagementObject ns in nsClass.GetInstances())
                {
                    string namespaceName = root + "\\" + ns["Name"].ToString();
                    Console.WriteLine(namespaceName);
                    //call the funcion recursively                               
                    GetWmiNameSpaces(namespaceName);
                }
            }
            catch (ManagementException e)
            {
                Console.WriteLine(e.Message);
            }
        }


        static void Main(string[] args)
        {
            //set the initial root to search
            GetWmiNameSpaces("root");
            Console.ReadKey();
        }
    }
}

To get all the wmi namespaces, you must first connect to the root namespace and then query for all the __NAMESPACE instances, and for each instance recursively repeat this process. about the getOptions parameter which is a ObjectGetOptions class is not necessary in this case, so can be null.

Check this code to get all the wmi namespaces (you can populate a list with that info and then check if the namespace exist in the machine)

using System;
using System.Collections.Generic;
using System.Text;
using System.Management;

namespace MyConsoleApplication
{
    class Program
    {
        static private void GetWmiNameSpaces(string root)
        {
            try
            {
                ManagementClass nsClass = new ManagementClass( new ManagementScope(root), new ManagementPath("__namespace"), null);
                foreach (ManagementObject ns in nsClass.GetInstances())
                {
                    string namespaceName = root + "\\" + ns["Name"].ToString();
                    Console.WriteLine(namespaceName);
                    //call the funcion recursively                               
                    GetWmiNameSpaces(namespaceName);
                }
            }
            catch (ManagementException e)
            {
                Console.WriteLine(e.Message);
            }
        }


        static void Main(string[] args)
        {
            //set the initial root to search
            GetWmiNameSpaces("root");
            Console.ReadKey();
        }
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文