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

时间:2009-07-16 05:13:23

标签: java system-information

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

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

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

7 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

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

 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);
      }
   }

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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