2009-06-30 50 views
3

我正在寫一個Java Applet。在Windows上運行時,我需要能夠獲取客戶端的操作系統版本,例如Windows XP SP3或Windows 2000 SP4。從Java Applet獲取Windows Service Pack版本?

我目前可以使用以下方法:

String os_name = System.getProperty("os.name"); 
String os_version = System.getProperty("os.version"); 

System.out.println("Running on " + os_name + "(" + os_version + ")"); 

,它會輸出像「運行在Windows 2000(5.0)」,這是偉大的,但我需要能夠得到的服務包版本太多。

任何人都知道如何從Java applet中獲取Windows機器的底層Service Pack版本? (不拋出AccessControlException,或者理想情況下不必自簽署小程序)。

非常感謝提前。

+1

PiPeep:剛剛標記爲正確的答案,享受你的新200分! :) – QAZ 2009-07-08 21:41:23

+0

W O O T! – bgw 2009-07-08 22:09:20

回答

4

您可以自簽署您的Java小程序:

(被盜:http://www.captain.at/programming/java/

使證書:

keytool -export -alias yourkey -file yourcert.crt 

現在我們必須簽署的小程序:

只是做一個* .bat文件,包括此:

javac yourapplet.java 
jar cvf yourapplet.jar yourapplet.class 
jarsigner yourapplet.jar yourkey 

批處理文件編譯的小程序, 使得一個罐子,歸檔和簽署 JAR文件。

的HTML代碼顯示applet:

<applet code="yourapplet.class" archive="yourapplet.jar" width="600" 

HEIGHT = 「500」>

現在我們完成了!該小程序的簽名爲 ,如果用戶接受 證書,則允許小程序以 訪問本地文件。如果用戶 不同意,您將得到一個 java.security.AccessControlException

所以,只要你不介意這個小對話框...

3

我想你可以使用「sun.os.patch.level」屬性得到它:

String os_sp = System.getProperty("sun.os.patch.level"); 
+1

謝謝,剛試過。它在應用程序中使用時起作用,但在從小應用程序使用時會引發AccessControlException。不過謝謝。 – QAZ 2009-06-30 00:36:23

0

簡單地說你不能沒有拋出一個AccessControlException得到sun.os.patch.level屬性的值。

小蘋果受到安全限制。

你能做的唯一的事情就是閱讀簽名Applet和政策文件的小程序

+0

這是真的,但也許他們是另一種方式來確定服務包級別,而不是嘗試閱讀'sun.os.patch.level'屬性? – QAZ 2009-07-02 11:21:57

1

要獲取操作系統版本(主要,次要,構建服務包),您可以使用JNA Documentation Here任何Windows庫的數量(version.dll,kernel32.dll,user32.dll等)。我以Daniel Doubrovkine的項目Operating System and Hardware Information爲基礎撰寫了我的項目。他的項目也將查詢我不需要的硬件。好的一點是它也會允許你讀/寫註冊表。

import com.sun.jna.Native; 
import com.sun.jna.platform.win32.Advapi32Util; 
import com.sun.jna.platform.win32.Kernel32; 
import com.sun.jna.platform.win32.User32; 
import com.sun.jna.platform.win32.Win32Exception; 
import com.sun.jna.platform.win32.WinNT; 
import com.sun.jna.platform.win32.WinNT.OSVERSIONINFOEX; 
import com.sun.jna.platform.win32.WinReg; 
import com.sun.jna.platform.win32.WinUser; 

/** 
* 
* @author geverding 
*/ 
public class OSVersionInfo { 

    private OSVERSIONINFOEX versionInfo; 
    private static OSVersionInfo instance = new OSVersionInfo(); 

    public static OSVersionInfo Istance() { 
     return instance; 
    } 

    public OSVersionInfo() { 
     versionInfo = new OSVERSIONINFOEX(); 
     if (!Kernel32.INSTANCE.GetVersionEx(versionInfo)) 
     { 
      throw new Win32Exception(Kernel32.INSTANCE.GetLastError()); 
     } 
    } 

    public int getMajor() { 
     return versionInfo.dwMajorVersion.intValue(); 
    } 

    public int getMinor() { 
     return versionInfo.dwMinorVersion.intValue(); 
    } 

    public int getBuild() { 
     return versionInfo.dwBuildNumber.intValue(); 

    } 

    public String getServicePack() { 
     return Native.toString(versionInfo.szCSDVersion); 
    } 

    @Override 
    public String toString() { 
     String version = null; 

     if (versionInfo.dwPlatformId.intValue() == WinNT.VER_PLATFORM_WIN32_NT) 
     { 
      // 7 
      if (versionInfo.dwMajorVersion.intValue() == 6 
        && versionInfo.dwMinorVersion.intValue() == 1 
        && versionInfo.wProductType == WinNT.VER_NT_WORKSTATION) 
      { 
       version = "7"; 
      } // Server 2008 R2 
      else if (versionInfo.dwMajorVersion.intValue() == 6 
        && versionInfo.dwMinorVersion.intValue() == 1 
        && versionInfo.wProductType != WinNT.VER_NT_WORKSTATION) 
      { 
       version = "Server 2008 R2"; 
      } // Server 2008 
      else if (versionInfo.dwMajorVersion.intValue() == 6 
        && versionInfo.dwMinorVersion.intValue() == 0 
        && versionInfo.wProductType != WinNT.VER_NT_WORKSTATION) 
      { 
       version = "Server 2008"; 
      } // Vista 
      else if (versionInfo.dwMajorVersion.intValue() == 6 
        && versionInfo.dwMinorVersion.intValue() == 0 
        && versionInfo.wProductType == WinNT.VER_NT_WORKSTATION) 
      { 
       version = "Vista"; 
      } // Server 2003 
      else if (versionInfo.dwMajorVersion.intValue() == 5 
        && versionInfo.dwMinorVersion.intValue() == 2 
        && versionInfo.wProductType != WinNT.VER_NT_WORKSTATION 
        && User32.INSTANCE.GetSystemMetrics(WinUser.SM_SERVERR2) != 0) 
      { 
       version = "Server 2003"; 
      } // Server 2003 R2 
      else if (versionInfo.dwMajorVersion.intValue() == 5 
        && versionInfo.dwMinorVersion.intValue() == 2 
        && versionInfo.wProductType != WinNT.VER_NT_WORKSTATION 
        && User32.INSTANCE.GetSystemMetrics(WinUser.SM_SERVERR2) == 0) 
      { 
       version = "Server 2003 R2"; 
      } // XP 64 bit 
      else if (versionInfo.dwMajorVersion.intValue() == 5 
        && versionInfo.dwMinorVersion.intValue() == 2 
        && versionInfo.wProductType == WinNT.VER_NT_WORKSTATION) 
      { 
       version = "XP"; 
      } // XP 32 bit 
      else if (versionInfo.dwMajorVersion.intValue() == 5 
        && versionInfo.dwMinorVersion.intValue() == 1) 
      { 
       version = "XP"; 
      } // 2000 
      else if (versionInfo.dwMajorVersion.intValue() == 5 
        && versionInfo.dwMinorVersion.intValue() == 0) 
      { 
       version = "2000"; 
      } // Windows NT 
      else if (versionInfo.dwMajorVersion.intValue() == 4) 
      { 
       version = "NT 4"; 

       if ("Service Pack 6".equals(Native.toString(versionInfo.szCSDVersion))) 
       { 
        if (Advapi32Util.registryKeyExists(WinReg.HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\WindowsNT\\CurrentVersion\\Hotfix\\Q246009")) 
        { 

         return "NT4 SP6a"; 
        } 
       } 

      } else 
      { 
       throw new RuntimeException("Unsupported Windows NT version: " 
         + versionInfo.toString()); 
      } 

      if (versionInfo.wServicePackMajor.intValue() > 0) 
      { 
       version = version + " SP" + versionInfo.wServicePackMajor.intValue(); 
      } 

     } else if (versionInfo.dwPlatformId.intValue() == WinNT.VER_PLATFORM_WIN32_WINDOWS) 
     { 
      if (versionInfo.dwMajorVersion.intValue() == 4 
        && versionInfo.dwMinorVersion.intValue() == 90) 
      { 
       version = "ME"; 
      } else if (versionInfo.dwMajorVersion.intValue() == 4 
        && versionInfo.dwMinorVersion.intValue() == 10) 
      { 
       if (versionInfo.szCSDVersion[1] == 'A') 
       { 
        version = "98 SE"; 
       } else 
       { 
        version = "98"; 
       } 
      } else if (versionInfo.dwMajorVersion.intValue() == 4 
        && versionInfo.dwMinorVersion.intValue() == 0) 
      { 
       if (versionInfo.szCSDVersion[1] == 'C' || versionInfo.szCSDVersion[1] == 'B') 
       { 
        version = "95 OSR2"; 
       } else 
       { 
        version = "95"; 
       } 
      } else 
      { 
       throw new RuntimeException("Unsupported Windows 9x version: " 
         + versionInfo.toString()); 
      } 
     } else 
     { 
      throw new RuntimeException("Unsupported Windows platform: " 
        + versionInfo.toString()); 
     } 

     return version; 
    } 
} 
相關問題