【问题标题】:Access WMI instances via MI without WS-Management service通过 MI 访问 WMI 实例,无需 WS-Management 服务
【发布时间】:2018-06-08 13:19:14
【问题描述】:

我正在尝试通过 C# 中的 Microsoft.Management.Infrastructure API 访问 Windows 7 和 Windows 10 Embedded 上的 WMI 类。 它使用以下 sn-p 中的代码工作,但前提是我启动 Windows 远程管理 (WS-Management) 服务。

我注意到,即使未启动 WS-Management 服务,我也可以通过 Get-WmiObject 等 Powershell cmdlet 访问这些类。没有通过 Microsoft 管理基础结构 API 启动的服务,有什么方法可以访问 WMI?

CimSession cimSession = CimSession.Create("localhost");
IEnumerable<CimInstance> enumeratedInstances = cimSession.EnumerateInstances(@"root\cimv2", "Win32_Process");
foreach (CimInstance cimInstance in enumeratedInstances)
{
    Console.WriteLine("{0}", cimInstance.CimInstanceProperties[ "Name" ].Value.ToString());
}

【问题讨论】:

  • 我认为这里的错误是您将"localhost" 作为主机名传递。要连接到同一台机器,您应该改为传递null

标签: c# .net windows wmi


【解决方案1】:

所以,我遇到了同样的问题。此外,Windows.Management.Instrumentation 在 .NET Core 中不可用,但 Microsoft.Management.Infrastructure 可用。

在大量谷歌搜索的帮助下,我终于找到了可行的选项。似乎要设置本地会话,您必须使用 DCOM 会话选项。

这是对我有用的代码:

var sessionOptions = new DComSessionOptions
{
    Timeout = TimeSpan.FromSeconds(30)
};
var cimSession = CimSession.Create("localhost", sessionOptions);

var volumes = cimSession.QueryInstances(@"root\cimv2", "WQL", "SELECT * FROM Win32_Volume");

foreach (var volume in volumes)
{
    Console.WriteLine(volume.CimInstanceProperties["Name"].Value);
}

【讨论】:

    【解决方案2】:

    如果您在本地工作,那么您应该始终能够访问 WMI。来自 MSDN 文档:

    WMI 作为显示名称为“Windows 管理”的服务运行 Instrumentation”和服务名称“winmgmt”。WMI 运行 在 LocalSystem 帐户下系统启动时自动启动。如果 WMI 没有运行,第一次管理时自动启动 应用程序或脚本请求连接到 WMI 命名空间。

    您还可以使用 WMI 的 ORMi(非常简单易用)库在 WMI 类和 C# 模型之间进行自动映射。

    [WMIClass("Win32_Process")]
    public class Process
    {
        public string Name { get; set; }
        public string Description { get; set; }
    }
    

    然后查询:

    WMIHelper helper = new WMIHelper("root\\CimV2");
    
    List<Process> process = helper.Query<Process>().ToList();
    

    【讨论】:

    • 因此,由于“Windows Management Instrumentation”服务正在运行,并且上面提到的 Get-WmiObject 等 PS cmdlet 正在运行,看来这些 cmdlet 正在使用此服务。那么问题更多的是我是否可以通过使用命名空间 Microsoft.Management.Infrastructure 中的类来使用本地 WMI 服务而不是远程管理服务。
    • 是的,你可以。试试 Windows.Management.Instrumentation 命名空间
    • 那么应该使用 System.Management.Instrumentation 吗?根据github.com/dotnet/corefx/issues/26601,MS.Management.Infrastructure 是首选方式:“在 Windows 上,我们建议使用 Microsoft.Management.Infrastructure 命名空间(又名 WMIv2)。不推荐使用 System.Managmeent(又名 WMIv1)”,但我会尝试这个。
    猜你喜欢
    • 2018-05-08
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    • 2018-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多