gpt4 book ai didi

c# - 如何使用 LINQ 查询 ManagementObjectCollection,然后循环遍历返回的 ManagementObject 的 PropertyData?

转载 作者:太空宇宙 更新时间:2023-11-03 11:04:04 25 4
gpt4 key购买 nike

[C# .NET Windows 窗体 WMI]

我是 C# 的新手,但我有使用 VBScript 的经验,我正在尝试将我编写的脚本转换为 C#。我不只是使用转换器,而是重写代码并尝试优化它以帮助我学习。

一点背景

在我原来的 VBScript 中,我使用以下代码连接到远程服务器一次:

Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServices = objSWbemLocator.ConnectServer(strComputer, "root\cimv2", strUserName, strPassword)
objSWbemServices.Security_.ImpersonationLevel = wbemImpersonationLevelImpersonate

然后我遍历要查找的打印机列表并调用具有以下代码的函数:

Set colPorts = objConnection.ExecQuery("SELECT * FROM Win32_Printer WHERE Name = '" & strPrinter & "'")  

If colPorts.Count = 0 Then
Set objPort = objConnection.Get("Win32_TCPIPPrinterPort").SpawnInstance_

生成实例后,我将我想要的属性添加到具有任意字符串值的 Dictionary 对象中,我正在搜索的打印机作为键,属性作为值。因此,当我与服务器断开连接时,我有一个字典对象,其中包含我需要从该服务器使用的所有打印机(我也对端口执行相同的操作)。

使用 C#,看起来我不需要使用字典,因为我可以使用 ManagementObjectSearcher 返回 ManagementObjectCollection。然后,如果我理解正确,我应该能够从单个 ManagementObject 或深入到 PropertyData 获得我想要的特定打印机所需的属性。到目前为止和我在一起吗?

问题/机会

因为我要返回整个集合,所以我认为使用 LINQ 查找我需要使用的特定打印机而不是遍历整个集合会更有效。然后,一旦我从 LINQ 获得 ManagementObject,我就可以将 PropertyData 分配给一个变量供以后使用(假设这是可能的),或者循环遍历 PropertyData 以查看内容(主要用于调试)。

我已经用下面的代码尝试了后者,但没有成功:

var printer = from ManagementObject x in mocPrinters
where x.Properties["Name"].Value.ToString() == "MyHP"
select x;

foreach (PropertyData p in printer)
{
MessageBox.Show(string.format("{0}: {1}", p.Name, p.Value);
}

上面的代码没有工作,因为我假设我的打印机不是 PropertyData 类型。

其他有用信息

我认为在返回整个集合后使用 LINQ 查询会比使用 WMI/WQLs SELECT * FROM Win32_Printer WHERE Name = 'MyHP' 查询更快,但是如果有人已经测试过并且知道性能差异可以忽略不计,我对使用 WMI/WQL 很满意(作为程序员,我还不够精明,无法测试这些东西)。

如果有人有任何指点,我将不胜感激。谢谢...

最佳答案

目前您有一个 ManagementObject 的集合,您需要一个 PropertyData 的集合。

我想你的意思是这样的:

var printers = from ManagementObject x in mocPrinters
where x.Properties["Name"].Value.ToString() == "MyHP"
select x;

foreach (PropertyData p in printers.First().Properties)
{
MessageBox.Show(string.format("{0}: {1}", p.Name, p.Value);
}

我将 WMI 用于其他任务的经验是,当您在查询中包含筛选时,执行速度会更快。 LINQ 与其说是计算效率,不如说是表现力。

访问属性的最快方法是直接构建 WMI 路径。对于打印机,路径中使用的 DeviceID 似乎就是名称。所以你可以使用以下方法获取对象:

var printer = new ManagementObject("Win32Printer.DeviceID=\"MyHP\"");

当然,这是针对本地系统上的打印机,但为远程机器构建路径也相对容易。

关于c# - 如何使用 LINQ 查询 ManagementObjectCollection,然后循环遍历返回的 ManagementObject 的 PropertyData?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16619528/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com