简体   繁体   English

从Java Applet获取Windows Service Pack版本?

[英]Get Windows Service Pack Version from Java Applet?

I am writing a Java Applet. 我正在编写Java Applet。 When run on Windows, I need to be able to get the clients OS version, eg Windows XP SP3 or Windows 2000 SP4. 在Windows上运行时,我需要能够获得客户端OS版本,例如Windows XP SP3或Windows 2000 SP4。

I can currently use the following: 我目前可以使用以下内容:

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

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

And it will output something like "Running on Windows 2000 (5.0)" which is great but I need to be able to get the service pack version too. 而且它会输出类似“在Windows 2000(5.0)上运行”的内容,虽然很棒,但我也必须能够获得Service Pack版本。

Anybody know how I can get the underlying service pack version of a Windows machine from within a Java applet? 有人知道如何从Java小程序中获取Windows计算机的基础Service Pack版本吗? (Without throwing an AccessControlException, or ideally without having to self sign the applet). (无需抛出AccessControlException,或者理想情况下不必对小程序进行自签名)。

Many thanks in advance. 提前谢谢了。

You can self-sign your java applet: 您可以自签名Java小程序:

(stolen from: http://www.captain.at/programming/java/ ) (从以下网址窃取: http : //www.captain.at/programming/java/

Make the certificate: 制作证书:

 keytool -export -alias yourkey -file yourcert.crt 

Now we have to sign the applet: 现在我们必须签署小程序:

Just make a *.bat file including this: 只需创建一个* .bat文件,包括以下内容:

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

The batch-file compiles the applet, makes a jar-archive and signs the jar-file. 批处理文件将编译小应用程序,进行jar归档并对该jar文件进行签名。

The HTML-code to display the applet: 显示小程序的HTML代码:

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

height="500"> height =“ 500”>

Now we are done! 现在我们完成了! The applet is signed and if the user accepts the certificate, the applet is allowed to access local files. 小程序已签名,如果用户接受证书,则允许小程序访问本地文件。 If the user doesn't agree, you get a java.security.AccessControlException . 如果用户不同意,则会收到java.security.AccessControlException

So, as long as you don't mind about this little dialog box... 所以,只要您不介意这个小对话框...

我认为您可以使用'sun.os.patch.level'属性获取它:

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

To get the OS version (major, minor, build, service pack) you can use JNA Documentation Here and any number of the windows libraries (version.dll, kernel32.dll, user32.dll, etc). 要获取OS版本(主要版本,次要版本,内部版本,Service Pack),可以使用“ JNA 文档”和任意数量的Windows库(version.dll,kernel32.dll,user32.dll等)。 I based my project on Daniel Doubrovkine's project Operating System and Hardware Information . 我的项目基于Daniel Doubrovkine的项目Operating System and Hardware Information His project will also query the hardware, which I didn't need. 他的项目还将查询我不需要的硬件。 The nice thing is it will also allow you to read/write to the registry. 令人高兴的是,它还允许您读取/写入注册表。

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

Put simply you can't get the value of the sun.os.patch.level property without throwing an AccessControlException. 简而言之,如果不抛出AccessControlException,就无法获取sun.os.patch.level属性的值。

Applets have security restrictions imposed on. 小程序具有安全限制。

The only thing you can do is to read on signed applets and policy files for applets 您唯一可以做的就是读取签名的小程序和小程序的策略文件

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM