我正在尝试使用JAVA在64位Win7上读/写Windows注册表。
首先,我尝试了JDK java.util.prefs.Preferences
and its reflection usage。这是一个很好的解决方案,但它只支持读/写REG_SZ类型(字符串)值。
不幸的是,我需要读/写REG_BINARY,所以放弃它。
其次,我尝试了JNI Registry。阅读没问题,但写作通常会失败,因为编写HKLM需要管理员权限。我不知道如何获得JAVA的管理员权限。
最后,我尝试使用JNA(Java Native Access)作为本地库的优秀项目,并通过Advapi32Util
和Advapi32
支持平台库(platform.jar)中的Windows注册表。它非常好用且简单易用。编写注册表不需要管理员权限。
但是如何在Win7上的64位JVM中读/写32位注册表(在WOW6432Node节点下)?
默认情况下,64位节点在64位JVM中读取/写入,32位节点在32位JVM中读取/写入。
但在64位JVM中,我想读/写32位节点(例如,HKLM->SOFTWARE->Wow6432Node->ODBC
)。我怎么能这样做?
答案 0 :(得分:1)
我得到了答案: 使用64位Windows:
HKLM->SOFTWARE->ODBC
的32位JVM将重定向到HKLM->SOFTWARE->Wow6432Node->ODBC
HKLM->SOFTWARE->ODBC
的64位JVM将是HKLM->SOFTWARE->ODBC
(64位注册表)。HKLM->SOFTWARE->Wow6432Node->ODBC
的32位或64位JVM。 (但在C ++中,win32 exe无法直接访问HKLM->SOFTWARE->Wow6432Node->ODBC
,请使用wow64标志访问HKLM->SOFTWARE->ODBC
。答案 1 :(得分:0)
JNA 5向Advapi32Util添加了新方法,使您可以指定samDesiredFlags,包括KEY_WOW64_32KEY或KEY_WOW64_64KEY。
此处的PR: https://github.com/java-native-access/jna/pull/1001
注册表安全性并在此处访问文档: https://docs.microsoft.com/en-us/windows/win32/sysinfo/registry-key-security-and-access-rights
KEY_WOW64_32KEY(0x0200) 表示64位Windows上的应用程序应在32位注册表视图上运行。 32位Windows将忽略此标志。有关更多信息,请参见访问备用注册表视图。 必须使用OR运算符将此标志与该表中查询或访问注册表值的其他标志组合。 Windows 2000:不支持此标志。
KEY_WOW64_64KEY(0x0100) 表示64位Windows上的应用程序应在64位注册表视图上运行。 32位Windows将忽略此标志。有关更多信息,请参见访问备用注册表视图。 必须使用OR运算符将此标志与该表中查询或访问注册表值的其他标志组合。 Windows 2000:不支持此标志。