【发布时间】:2023-08-17 08:55:01
【问题描述】:
我一直在使用下面的代码在 Windows 8 上的 Visual Studio 中的控制台应用程序中返回连接的串行设备的描述和设备 ID。我在我正在创建的应用程序中使用它的修改版本来自动检测 Arduino 的 COM 端口。自从我使用 Windows 10 进行全新安装后,它不再返回任何内容。我有一个 USB 转串行 AVR 编程器,但是仍然使用此代码显示。我检查了注册表,Arduino 列在 SERIALCOMM 中,Arduino 在设备管理器的“端口(COM 和 LPT)”下显示为“USB 串行端口(COM6)”,我可以使用 Arduino 软件对 Arduino 进行编程。我不知道为什么它不再工作了。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Management;
using System.IO.Ports;
using System.Diagnostics;
namespace ConsoleApplication1
{
class Program
{
static void Main()
{
ManagementScope connectionScope = new ManagementScope();
SelectQuery serialQuery = new SelectQuery("SELECT * FROM Win32_SerialPort");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(connectionScope, serialQuery);
try
{
foreach (ManagementObject item in searcher.Get())
{
string desc = item["Description"].ToString();
string deviceId = item["DeviceID"].ToString();
Console.WriteLine(desc);
Console.WriteLine(deviceId);
}
}
catch (ManagementException e)
{
Console.WriteLine(e.Message);
}
Console.ReadKey();
}
}
}
这也可能是相关的,在尝试找到解决方案时,我发现了以下实现来使用 MSSerial_PortName 查找端口名称,但出现访问被拒绝错误。
using System;
using System.Management;
namespace ConsoleApplication1
{
class Program
{
static void Main()
{
try
{
ManagementObjectSearcher MOSearcher = new ManagementObjectSearcher("root\\WMI", "SELECT * FROM MSSerial_PortName");
foreach (ManagementObject MOject in MOSearcher.Get())
{
Console.WriteLine(MOject["PortName"]);
}
}
catch (ManagementException me)
{
Console.WriteLine("An error occurred while querying for WMI data: " + me.Message);
}
Console.ReadKey();
}
}
}
【问题讨论】:
-
听起来像是身份验证问题。将 ConnectionOptions 实例传递给您的 ManagementScope 构造函数,定义您的 Authentication 和 Impersonation 属性。
-
谢谢@Juderb 我只是在我自己的机器上本地使用它,我尝试了你的建议,我将 ImpersonationLevel 设置为 Impersonate (这是它运行的唯一级别),我尝试了所有AuthenticationLevel 的不同选项和代码仍然只能找到我的 USB 到串行 AVR 程序员,而不是我的 Arduinos。将 AuthenticationLevel 和 ImpersonationLevel 添加到我发布的使用 MSSerial_PortName 的第二个代码块没有任何区别,我仍然得到拒绝访问(模拟和身份验证级别的所有不同组合)。
-
默认用户无法访问系统设备!需要以管理员身份运行共享库或设备...
-
@dsgdfg 我正在使用管理员帐户(或者我是否特别必须以管理员身份运行控制台应用程序?)并且当此代码适用于我的 Arduino 时,我还在 Windows 8 上使用管理员帐户。由于它适用于一个串行设备但不适用于另一个串行设备,这让我认为它可能与权限或身份验证无关。
标签: c# wmi windows-10