使用JAVA和JNA在64位Win 7上读/写Windows注册表

时间:2015-12-22 03:17:32

标签: java

我正在尝试使用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)作为本地库的优秀项目,并通过Advapi32UtilAdvapi32支持平台库(platform.jar)中的Windows注册表。它非常好用且简单易用。编写注册表不需要管理员权限。

但是如何在Win7上的64位JVM中读/写32位注册表(在WOW6432Node节点下)?

默认情况下,64位节点在64位JVM中读取/写入,32位节点在32位JVM中读取/写入。

但在64位JVM中,我想读/写32位节点(例如,HKLM->SOFTWARE->Wow6432Node->ODBC)。我怎么能这样做?

2 个答案:

答案 0 :(得分:1)

我得到了答案: 使用64位Windows:

  1. 访问HKLM->SOFTWARE->ODBC的32位JVM将重定向到HKLM->SOFTWARE->Wow6432Node->ODBC
  2. 访问HKLM->SOFTWARE->ODBC的64位JVM将是HKLM->SOFTWARE->ODBC(64位注册表)。
  3. 允许访问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:不支持此标志。