You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

访问注册表子项获取USB设备连接时间遇安全异常求解决

问题描述

在控制台应用中,我需要获取USB设备的最后连接时间与最后断开时间信息,需访问注册表路径Computer\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\USB\下每个项的properties\{83da6326-97a6-4088-9453-a1923f573b29}子项。尝试以下代码后抛出Security Exception:

RegistryKey reg = Registry.LocalMachine;
RegistryKey subKey=reg.OpenSubKey(@"SYSTEM\ControlSet001\Enum\USB\ROOT_HUB30\4&2ae8b031&0&0\Properties");

解决方法

  • 以管理员权限运行程序
    HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum属于系统敏感注册表路径,普通用户默认无读取权限。可右键控制台应用程序选择「以管理员身份运行」,或通过配置应用清单让程序默认请求管理员权限:
    在项目中添加app.manifest文件,修改<requestedExecutionLevel>节点为:

    <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
    
  • 手动配置注册表项权限
    若管理员权限仍无法访问,可手动修改目标注册表项的权限:

    1. 打开注册表编辑器(regedit.exe),定位到HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\USB;
    2. 右键该项选择「权限」,添加当前用户或Users组,赋予「读取」权限。
  • 指定注册表访问权限重载方法
    调用OpenSubKey时明确指定读取权限,示例代码:

    using Microsoft.Win32;
    
    RegistryKey reg = Registry.LocalMachine;
    try
    {
        RegistryKey subKey = reg.OpenSubKey(
            @"SYSTEM\ControlSet001\Enum\USB\ROOT_HUB30\4&2ae8b031&0&0\Properties",
            RegistryKeyPermissionCheck.ReadSubTree,
            RegistryRights.ReadKey
        );
        if (subKey != null)
        {
            // 执行读取时间属性的逻辑
            subKey.Close();
        }
    }
    catch (SecurityException ex)
    {
        Console.WriteLine($"权限错误:{ex.Message}");
    }
    
  • 优先访问当前生效控制集
    ControlSet001是系统备份控制集,当前生效的控制集通常为CurrentControlSet,建议将路径改为@"SYSTEM\CurrentControlSet\Enum\USB\...",避免访问非活跃配置项。


内容的提问来源于stack exchange,提问作者Antonio Argentieri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 11:45:29