2

質問のタイトルが示すように、Java を使用してリモート システムのシステム情報 (OS 名、バージョンなど) を取得したいと考えています。しかし、誰かがこの質問に答える前に、これが可能かどうかを尋ねたいだけです。

もう 1 つの問題は、これが Unix ベースのシステムと Windows ベースのシステムの両方で機能することです。インターネットで検索してみましたが、(ほとんど)空白を描きました。

編集: Java アプリはデスクトップ アプリになり、リモート システムにログオンするには資格情報が必要になりますが、使用される HTTP/RMI はありません。

4

7 に答える 7

5

Windowsの場合はリモートマシンのWMIにアクセスできるはずです(醜いJNI接着剤を使用)。UNIXシステムの場合は方法がわかりません(シェルアクセスがない限り、SSH経由でログインしてみてください。または同様のことを行いますuname -a)。どちらの場合も大変な作業になるでしょうし、Javaはそのための適切なツールとは言えません。

于 2009-07-16T05:31:23.943 に答える
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);
      }
   }
于 2012-09-23T19:58:24.277 に答える
2

この場合、「リモート システム」が何を意味するのかを明確にする必要があります。たとえば、どのように通信しているのかということです。RMI? ブラウザで実行されているアプレット?

しかし、一般的には、「いいえ、できません」という答えが返ってきます。

于 2009-07-16T05:21:16.990 に答える
1

これは、数十台または数百台のマシンで構成される大規模なサイトを監視する際の一般的な問題です。ZenossNagiosのようなオープンソースソリューションがあります。SNMPは、この分野でも広くサポートされている標準です(そして、SNMPをJavaベースの「ダッシュボード」に接続する方法があります)。

于 2009-07-16T05:28:48.957 に答える
0

リモートシステム(つまり、データをアナウンスするアプリケーション)からの支援が必要か、 OSフィンガープリントと呼ばれる手法を可能にする低レベルのネットワークAPIへのアクセスが必要です。ただし、JavaのネットワークAPIは、そのための十分な低レベルではありません。

于 2009-07-16T05:29:37.503 に答える
0

リモート システムからの支援 (つまり、データをアナウンスするそこで実行されているアプリケーション - Web ブラウザーはこれを行いますが、アクセスするサーバーに対してのみ) からの支援、または OS フィンガープリンティングと呼ばれる手法を可能にする低レベルのネットワーク API へのアクセスが必要です。ただし、Java のネットワーク API は、そのために十分な低レベルではありません。

于 2010-02-05T11:50:07.820 に答える
0

SNMP や UPnP などの低レベルのネットワーク API を使用してみてください。SNMP には、リモート システムでアクティブ化/インストールされたエージェントが必要であり、この情報は MIB にあります。そして、UPnP はそれを行うことができます (正確な方法はわかりませんが、それが可能であると確信しています)。

于 2012-03-30T11:06:43.643 に答える