【问题标题】:Java interoperation with WMIJava 与 WMI 的互操作
【发布时间】:2017-10-19 17:22:55
【问题描述】:

我有一个问题 wmi4java 库: 它可以连接到远程 Win 机器并在那里运行 WMI 查询吗?搜索了文档,甚至查看了主类的源代码,没有发现任何指向远程连接和身份验证的东西。

github 页面没有提供连接远程机器的示例: https://github.com/profesorfalken/WMI4Java

WMI4Java 类的 javadoc 仅提及 localhost:

https://jar-download.com/java-documentation-javadoc.php?a=WMI4Java&g=com.profesorfalken&v=1.6

例如: WMI4Java.get().computerName(".").namespace("root/cimv2").getWMIObject("Win32_BaseBoard");

如果我指定另一个主机(又名 computerName("10.10.172.214")...),它显然会抛出异常,因为它没有找到凭据。

我知道这个库在内部使用 jPowerShell,所以一定有办法。 谢谢。

【问题讨论】:

  • 我建议您使用 WinRM 而不是 WMI(它更容易且强大)。 stackoverflow.com/questions/4610063/… 也可能有帮助
  • 感谢 RC。我们将在未来的版本中使用 WinRM,但现在我们使用 j-interop,它在客户的防火墙中失败,因为此库使用已弃用且不安全的协议 SMBv1。因此,我希望将 j-interop 替换为 wmi4java 作为解决客户问题的临时解决方法。但为此我需要能够连接到远程 Win 机器,我的挑战来了。
  • 我明白了,恕我直言,您应该寻找另一个替代库。也许github.com/chenlichao-cn/wmi4j(通过谷歌找到,似乎可以满足您的需求)
  • RC 谢谢你,很好的建议。我一定会去探索的。乍一看,它似乎并不依赖于安装在同一台机器上的 PowerShell。
  • wmi4j 在内部使用 j-interop,这让我回到了第一方。无法使用 jinterop,因为它在后台使用 SMBv1,并且任何防火墙在检测到具有此不安全协议的数据包时都会重置连接。

标签: java powershell wmi


【解决方案1】:

通过 getRawWMIObjectOutput 调用找到了方法。这并不理想,因为它看起来并不优雅,并且您将输出作为字符串而不是整齐的属性映射。但无论如何,它是:

_log.info("\n-- Get raw output in String format on remote host (Win32_Process) --\n");
wmiObjectPropsRaw = WMI4Java.get()
    .computerName("10.10.172.214")
    .namespace("root/cimv2")
    .filters(Arrays.asList("$_.Name -eq \"lsass.exe\""))
    .getRawWMIObjectOutput(
       "Win32_Process" 
        + " -Impersonation 3" 
        +  " -Credential (new-object -typename System.Management.Automation.PSCredential"
            + " -argumentlist Administrator, " 
            + " (ConvertTo-SecureString Sysdreamworks123 -AsPlainText -Force))");
_log.info(wmiObjectPropsRaw + "\n");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-27
    • 1970-01-01
    • 2014-05-10
    • 1970-01-01
    • 2012-11-23
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多