有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我正在尝试使用java在远程机器上读取一些用户定义的windows注册表数据
我可以使用jna读取本地机器注册表数据,甚至可以将其更新回来
有人能帮助我们如何使用java向远程机器读/写数据吗


共 (1) 个答案

  1. # 1 楼答案

    WinAPI有一个名为^{}的函数,这可能是您正在寻找的:

    Establishes a connection to a predefined registry key on another computer

    LONG WINAPI RegConnectRegistry(
        _In_opt_ LPCTSTR lpMachineName,
        _In_     HKEY    hKey,
        _Out_    PHKEY   phkResult
    );
    

    Java中,如果您添加了^{}库作为提供现成API类型和函数的依赖项,则函数可能如下所示:

    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-platformdoes provide mappings用于Advapi32库,但是RegConnectRegistry似乎丢失了。理想情况下,您可能会创建一个pull请求并将其添加进来,但我们不知道添加后他们推出新版本的速度有多快

    编辑:我已经为JNA创建了一个pull request来添加这个函数