Получить версию пакета обновления Windows от Java-апплета? - PullRequest
3 голосов
/ 30 июня 2009

Я пишу апплет Java. При запуске в Windows мне нужно иметь возможность получить версию ОС клиента, например, Windows XP SP3 или Windows 2000 SP4.

В настоящее время я могу использовать следующее:

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)», что замечательно, но мне нужно иметь возможность получить версию пакета обновления.

Кто-нибудь знает, как я могу получить базовую версию пакета обновления для машины Windows из Java-апплета? (Без выброса AccessControlException или в идеале без необходимости самостоятельно подписывать апплет).

Большое спасибо заранее.

Ответы [ 4 ]

4 голосов
/ 02 июля 2009

Вы можете самостоятельно подписать свой 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 code="yourapplet.class" archive="yourapplet.jar" width="600"

высота = "500">

Теперь мы закончили! Апплет подписан и если пользователь принимает сертификат, апплет разрешен доступ к локальным файлам. Если пользователь не согласен, вы получаете java.security.AccessControlException.

Итак, если вы не возражаете против этого маленького диалогового окна ...

3 голосов
/ 30 июня 2009

Я думаю, вы можете получить его, используя свойство sun.os.patch.level:

String os_sp = System.getProperty( "sun.os.patch.level" );
1 голос
/ 21 июля 2011

Для получения версии ОС (основная, дополнительная, сборка, пакет обновления) вы можете использовать JNA Здесь документация и любое количество библиотек Windows (version.dll, kernel32.dll, user32.dll, так далее). Я основал свой проект на проекте Даниэля Дубровкина Информация об операционной системе и аппаратном обеспечении . Его проект также запросит оборудование, которое мне не нужно. Хорошая вещь, это также позволит вам читать / писать в реестр.

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;
    }
}
0 голосов
/ 02 июля 2009

Проще говоря, вы не можете получить значение свойства sun.os.patch.level, не выбрасывая AccessControlException.

На апплеты наложены ограничения безопасности.

Единственное, что вы можете сделать, это прочитать подписанные апплеты и файлы политик для апплетов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...