![读取 WMI 类“MSSerial_PortName”的最低权限是什么?](https://linux22.com/image/587166/%E8%AF%BB%E5%8F%96%20WMI%20%E7%B1%BB%E2%80%9CMSSerial_PortName%E2%80%9D%E7%9A%84%E6%9C%80%E4%BD%8E%E6%9D%83%E9%99%90%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F.png)
我正在 Windows 7 自助服务终端上配置本地应用程序用户(BUILTIN\Users 的一部分)。自助服务终端有一个特殊的USB 设备在虚拟 COM 端口上运行。用户需要读取命名空间MSSerial_PortName
中的WMI 类的权限root\WMI
,才能找到 COM 端口。在 PowerShell 中(我使用它来验证配置)
PS> Get-WmiObject -namespace 'root\WMI' -class 'MSSerial_PortName'
以及常规的 .NET 代码(应用程序的编写方式)
ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\WMI", "SELECT * FROM MSSerial_PortName");
除非以管理员身份或提升的会话运行,否则我会收到“访问被拒绝”错误。我已阅读充足的问答类似使用权问题,但大多数似乎建议以管理员身份运行。这不是此用户/信息亭/配置的选项。目前,我无法使用托管包装器来自设备供应商。
我在 Microsoft 管理控制台中尝试了一下,加载了 WMI 控件,并修改了属性 | 安全 | 命名空间:Root\WMI。我将用户组设置为具有与管理员组相同的权限。但这不起作用(反正我只是在猜测)。
我找不到任何有关命名空间中的“基”类或其他相关类的 MSDN 文档(正如此建议的MSSerial_PortName
那样MSSerial
文章)并且我对 WMI 安全性一无所知。
答案1
我今天也遇到了同样的问题。这个暂时对我有用...
catch (ManagementException ex)
{
Debug.WriteLine( string.Format( "##DBG An error occurred while querying for WMI data to find available COM ports:\n Message: {0}\n Stacktrace: {1}", ex.Message, ex.StackTrace) );
bool bSucceed = true;
// TODO Q&D solutions. As it does not work as expected (on windows 7 ) we create our ow default list here and check if we can open the ports
for (int x = 1; x <= 9; x++)
{
bSucceed = true;
cComportName = string.Format("COM{0}", x);
/////////////////////
// Check if we can open it here
// Set the port's settings
m_comport.BaudRate = 9600;
m_comport.DataBits = 8; // int.Parse(cmbDataBits.Text);
m_comport.StopBits = (StopBits)Enum.Parse(typeof(StopBits), "1" );
m_comport.Parity = (Parity)Enum.Parse(typeof(Parity), "None" );
m_comport.PortName = cComportName;
try
{
// Open the port
m_comport.Open();
}
catch (UnauthorizedAccessException) { bSucceed = false; }
catch (IOException) { bSucceed = false; }
catch (ArgumentException) { bSucceed = false; }
if (bSucceed)
{
m_comport.Close();
m_listComPorts.Add(new string[ConstComPortAttr.COMPORT_MAX_COLUMNS] { cComportName, cInstanceName });
}
}
答案2
我在 PowerShell 中找到了另一种方法,它不需要管理员权限:
PS> Get-WmiObject -Namespace root/cimv2 -Class Win32_PnPEntity -Filter "ClassGuid='{4d36e978-e325-11ce-bfc1-08002be10318}'"
不幸的是,它没有以 COMx 形式提供端口名称,但使用简单的文本解析,您应该能够从设备名称中提取端口名称。