如何使用java读取远程机器上的Windows注册表数据

时间:2018-03-02 17:04:03

标签: java registry jna

我正在尝试使用java在远程机器上读取一些用户定义的Windows注册表数据 我能够使用jna读取我的本地机器注册表数据,甚至更新它 任何人都可以帮助如何使用java读/写数据到远程机器。

1 个答案:

答案 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库的Advapi32does provide mappings,但RegConnectRegistry似乎丢失了。理想情况下,您可能会创建一个拉取请求并将其添加到其中,但YMMV会指出他们在添加时推出新版本的速度有多快。

编辑:我已经为JNA创建了pull request以添加此功能。