获取远程计算机的系统信息(使用Java)

正如问题的标题所说,我想获得使用Java的远程系统的系统信息(如操作系统名称,版本等)。 但在任何人回答这个问题之前,我只想问这是否可行,如果有,那怎么样?

还有一个问题是,这应该适用于基于Unix和基于Windows的系统。 我试着在网上搜索,但画了一个空白(差不多)。

编辑:Java应用程序将是一个桌面应用程序,它将具有能够登录到远程系统的凭据,但将不会使用任何HTTP / RMI。

在这种情况下,您需要澄清“远程系统”的含义 – 就像您如何与之通信一样>我们是在谈论某种forms的HTTP吗? RMI? Applet在浏览器中运行?

但一般来说,答案是“不,这是不可能的”。

对于Windows,您应该能够访问远程计算机上的WMI(使用一些丑陋的JNI粘合剂),对于UNIX系统我不知道某种方式(除非您以某种方式具有shell访问权限,然后您可以尝试通过SSH登录和做一个uname -a或类似的)。 在任何一种情况下都会有很多工作,而Java几乎不是正确的工具。

如上所述,你可以尝试一下。 顺便说一下,你可以使用以下代码:(如果你愿意)

  import java.util.Properties; public class GetCompleteSystemInfo { public static void main(String args[]) { //1.Get Java Runtime Runtime runtime = Runtime.getRuntime(); System.out.println("Runtime=" + Runtime.getRuntime()); //2. Get Number of Processor availaible to JVM int numberOfProcessors = runtime.availableProcessors(); System.out.println(numberOfProcessors + " Processors "); //2. Get FreeMemory, Max Memory and Total Memory long freeMemory = runtime.freeMemory(); System.out.println("Bytes=" + freeMemory + " |KB=" + freeMemory / 1024 + " |MB=" + (freeMemory / 1024) / 1024+" Free Memory in JVM"); long maxMemory = runtime.maxMemory(); System.out.println(maxMemory + "-Bytes " + maxMemory / 1024 + "-KB " + (maxMemory / 1024) / 1024 + "-MB " + " Max Memory Availaible in JVM"); long totalMemory = runtime.totalMemory(); System.out.println(totalMemory + "-Bytes " + totalMemory / 1024 + "-KB " + (totalMemory / 1024) / 1024 + "-MB " + " Total Memory Availaible in JVM"); //3. Suggest JVM to Run Garbage Collector runtime.gc(); //4. Suggest JVM to Run Discarded Object Finalization runtime.runFinalization(); //5. Terminate JVM //System.out.println("About to halt the current jvm");//not to be run always //runtime.halt(1); // System.out.println("JVM Terminated"); //6. Get OS Name String strOSName = System.getProperty("os.name"); if (strOSName != null) { if (strOSName.toLowerCase().indexOf("windows") != -1) { System.out.println("This is "+strOSName); } else { System.out.print("Can't Determine"); } } //7. Get JVM Spec String strJavaVersion = System.getProperty("java.specification.version"); System.out.println("JVM Spec : " + strJavaVersion); //8. Get Class Path String strClassPath = System.getProperty("java.class.path"); System.out.println("Classpath: " + strClassPath); //9. Get File Separator String strFileSeparator = System.getProperty("file.separator"); System.out.println("File separator: " + strFileSeparator); //10. Get System Properties Properties prop = System.getProperties(); System.out.println("System Properties(detail): " + prop); //11. Get System Time long lnSystemTime = System.currentTimeMillis(); System.out.println("Milliseconds since midnight, January 1, 1970 UTC : " + lnSystemTime + "\nSecond=" + lnSystemTime / 1000 + "\nMinutes=" + (lnSystemTime / 1000) / 60 + "" + "\nHours=" + ((lnSystemTime / 1000) / 60) / 60 + "\nDays=" + (((lnSystemTime / 1000) / 60) / 60) / 24 + "\nYears=" + ((((lnSystemTime / 1000) / 60) / 60) / 24) / 365); } } 

这是监控由数十台或数百台机器组成的大型站点的常见问题。 有Zenoss和Nagios等开源解决方案。 SNMP也是这个领域广泛支持的标准(并且有将它们连接到基于Java的“仪表板”的方法)。

您需要远程系统的帮助(即在那里运行的应用程序宣布数据 – Web浏览器执行的操作,但仅限于他们访问的服务器)或访问允许使用称为操作系统指纹识别技术的低级网络API。 但是,Java的网络API并不是那么低级。

您需要远程系统的帮助(即在那里运行的应用程序宣布数据 – Web浏览器执行的操作,但仅限于他们访问的服务器)或访问允许使用称为操作系统指纹识别技术的低级网络API。 但是,Java的网络API并不是那么低级。

尝试使用低级网络API,如SNMP和UPnP。 SNMP需要在远程系统中激活/安装代理,您将在MIB上获得此信息。 UPnP可以做到这一点,(我不知道具体如何,但我确信可以做到)。