如何使用java在远程计算机上读取windows注册表数据

如何使用java在远程计算机上读取windows注册表数据,java,registry,jna,Java,Registry,Jna,我正在尝试使用java在远程计算机上读取一些用户定义的windows注册表数据。 我可以使用jna读取本地计算机注册表数据,甚至可以将其更新回来。 有人能帮助我们如何使用java向远程机器读/写数据吗 WinAPI有一个名为的函数,它可能就是您要查找的函数: 建立与另一台计算机上预定义注册表项的连接 LONG WINAPI RegConnectRegistry( _在_opt_LPCTSTR lpMachineName中, _在香港, _Out_uuphkeyphkresult ); 在Jav

我正在尝试使用java在远程计算机上读取一些用户定义的windows注册表数据。
我可以使用jna读取本地计算机注册表数据,甚至可以将其更新回来。

有人能帮助我们如何使用java向远程机器读/写数据吗

WinAPI有一个名为的函数,它可能就是您要查找的函数:

建立与另一台计算机上预定义注册表项的连接

LONG WINAPI RegConnectRegistry(
_在_opt_LPCTSTR lpMachineName中,
_在香港,
_Out_uuphkeyphkresult
);
Java中,函数可能如下所示,假设您已将库添加为提供现成API类型和函数的依赖项:

import com.sun.jna.Native;
导入com.sun.jna.win32.StdCallLibrary;
导入com.sun.jna.platform.win32.WinReg.HKEY;
导入com.sun.jna.platform.win32.WinReg.HKEYByReference;
导入com.sun.jna.platform.win32.WinReg.HKEY\u本地\u机器;
导入com.sun.jna.win32.w32api选项;
接口MyAdvapi32扩展StdCallLibrary{
MyAdvapi32实例=(MyAdvapi32)Native.loadLibrary(
“advapi32”,
MyAdvapi32.class,
W32APIOptions.DEFAULT\u选项
);
int RegConnectRegistry(字符串machineName、HKEY HKEY、HKEYByReference结果);
国际注册密钥(HKEY密钥);
}
您可能会注意到库加载中使用的
w32apoptions.DEFAULT\u选项。Windows API为使用字符串的函数提供了两种不同的实现:一种用于Unicode字符串,另一种用于ANSI字符串。函数名为
RegConnectRegistry
,JNA在DLL中找到的实现名为
RegConnectRegistryW
(Unicode)和
RegConnectRegistryA
(ANSI)。但是,这些可能不是您所关心的,因为您不是在编写本机代码

在中传递默认选项可以让JNA使用正确的函数名,最多可以避免混乱的
未满足的linkerror

用法可能如下所示:

HKEYByReference result = new HKEYByReference();
int returnCode = MyAdvapi32.INSTANCE.RegConnectRegistry(
    "\\\\server-name",
    HKEY_LOCAL_MACHINE,
    result
);

if (returnCode != 0) {
    throw new Win32Exception(returnCode);
}

HKEY key = result.getValue();

// ... use the key, then once done with it ...

MyAdvapi32.INSTANCE.RegCloseKey(key);
顺便说一下,
Advapi32
库的
jna平台
库,但似乎缺少
RegConnectRegistry
。理想情况下,您可能会创建一个pull请求并将其添加进来,但我们不知道添加后他们推出新版本的速度有多快


编辑:我已经创建了一个到JNA的链接,以便添加此函数。

hi-cubrr,感谢您的更新。正如您所建议的,我很累,正在获取java.lang.UnsatifiedLinkError:查找函数“RegConnectRegistry”时出错:找不到指定的过程。@Rao我已编辑了答案的java示例,并在下面添加了错误解释。让我知道它是否有效!谢谢你,成功了。需要更多关于用户访问的信息。如何在访问注册表之前检查用户是否具有访问权限,以及仅在用户具有访问权限时检查。仅供参考,所有密钥仅由用户定义,与系统创建/应用程序无关。@Rakesh可能吗?