我正在尝试使用java在远程机器上读取一些用户定义的Windows注册表数据 我能够使用jna读取我的本地机器注册表数据,甚至更新它 任何人都可以帮助如何使用java读/写数据到远程机器。
答案 0 :(得分:1)
WinAPI有一个名为RegConnectRegistry
的功能,可能是您正在寻找的功能:
建立与另一台计算机上预定义注册表项的连接
LONG WINAPI RegConnectRegistry(
_In_opt_ LPCTSTR lpMachineName,
_In_ HKEY hKey,
_Out_ PHKEY phkResult
);
在 Java 中,该函数可能如下所示,因为您已将jna-platform
库添加为提供现成API类型和函数的依赖项: / p>
import com.sun.jna.Native;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.platform.win32.WinReg.HKEY;
import com.sun.jna.platform.win32.WinReg.HKEYByReference;
import com.sun.jna.platform.win32.WinReg.HKEY_LOCAL_MACHINE;
import com.sun.jna.win32.W32APIOptions;
interface MyAdvapi32 extends StdCallLibrary {
MyAdvapi32 INSTANCE = (MyAdvapi32) Native.loadLibrary(
"advapi32",
MyAdvapi32.class,
W32APIOptions.DEFAULT_OPTIONS
);
int RegConnectRegistry(String machineName, HKEY hKey, HKEYByReference result);
int RegCloseKey(HKEY key);
}
您可能会注意到库加载中使用的W32APIOptions.DEFAULT_OPTIONS
。 Windows API为使用字符串的函数提供了两种不同的实现:一种用于Unicode字符串,另一种用于ANSI字符串。虽然该函数名为RegConnectRegistry
,但JNA在DLL中找到的实现名为RegConnectRegistryW
(Unicode)和RegConnectRegistryA
(ANSI)。但是,由于您没有编写本机代码,因此这些可能不是您的担忧。
传递默认选项让JNA使用正确的函数名称,避免混淆为最佳UnsatisfiedLinkError
。
用法可能如下所示:
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);
顺便说一下,jna-platform
库的Advapi32
库does provide mappings,但RegConnectRegistry
似乎丢失了。理想情况下,您可能会创建一个拉取请求并将其添加到其中,但YMMV会指出他们在添加时推出新版本的速度有多快。