如何用Java读取Windows注册表整数值 读取EnableSecuritySignature返回null怎么办
返回null的常见原因
- 数据类型不匹配:你调用的
readString方法仅支持读取REG_SZ类型的字符串注册表值,而EnableSecuritySignature是REG_DWORD类型的数值,类型不匹配导致读取失败返回null。 - 32/64位注册表重定向:如果你运行的是32位版本的Java虚拟机,在64位Windows系统下访问
HKEY_LOCAL_MACHINE下的系统路径时,会被系统自动重定向到Wow6432Node对应的32位注册表分支,而你的目标键存在于64位分支,因此读取不到。 - 权限不足:该注册表项属于系统服务配置项,部分情况下普通用户权限的进程无法读取,会被系统拦截返回空值。
解决方法
- 替换读取方法:调用WinRegistry类中读取数值类型的
readDword方法,替代原来的readString方法,匹配目标值的REG_DWORD类型。 - 适配64位注册表视图:修改WinRegistry类的底层实现,在调用Windows原生API访问注册表时,给访问权限参数增加
KEY_WOW64_64KEY(值为0x0100)标记,强制访问64位注册表分支,避开系统重定向。示例权限修改:将原来的KEY_READ权限修改为KEY_READ | 0x0100。 - 提升运行权限:运行Java程序时,右键选择「以管理员身份运行」启动对应的CMD、IDE或者程序启动器,确保进程有足够的系统权限读取该配置项。
修改后的参考代码如下(假设已调整WinRegistry类适配64位视图):
int value = WinRegistry.readDword( WinRegistry.HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\LanmanWorkstation\\Parameters", "EnableSecuritySignature"); System.out.println("EnableSecuritySignature = " + value);
内容的提问来源于stack exchange,提问作者Radu Aramă
相关产品推荐
相关产品推荐

