Как получить версию ОС в Win8.1, так как GetVersion/GetVersionEx устарели?
У меня есть сценарии, в которых я хочу конкретно знать основную / вспомогательную версию ОС, номер сборки и т. Д.
Начиная с Windows 8.1 GetVersion
а также GetVersionEx
были объявлены устаревшими, заявив:
[ GetVersion/ GetVersionEx может быть изменен или недоступен для выпусков после Windows 8.1. Вместо этого используйте функции помощника по версии]
Ни один из API помощников версий не помогает мне получить номер версии ОС, скорее, помогает мне проверить или узнать, является ли моя версия такой же или выше некоторой упомянутой версии. Что можно сделать?
3 ответа
API GetVersionEx () продолжает работать в Windows 8.1+, но Microsoft изменила его функциональность. Из MSDN (акцент мой):
С выпуском Windows 8.1 поведение API GetVersionEx изменилось в значении, которое будет возвращено для версии операционной системы. Значение, возвращаемое функцией GetVersionEx, теперь зависит от того, как приложение проявляется.
Приложения, не представленные для Windows 8.1, вернут значение версии ОС Windows 8 (6.2). Как только приложение будет показано для данной версии операционной системы, GetVersionEx всегда будет возвращать версию, для которой приложение будет отображаться в будущих выпусках. Чтобы манифестировать ваши приложения для Windows 8.1, пожалуйста, обратитесь к разделу Ориентация вашего приложения для Windows 8.1.
Что вам нужно сделать, это добавить правильные GUID(ы) в двоичные файлы вашего приложения (.exe/.dll) (через XML-информацию манифеста). Другими словами, если вы специально заявите, что ваше приложение поддерживает 8.1, GetVersionEx() вернет правильную информацию при работе в Windows 8.1. Если вы этого не сделаете, GetVersionEx () будет лгать вам.
См. Ориентация вашего приложения для Windows 8.1 для получения списка GUID. Также освещено здесь и здесь.
Список GUID для ленивых
- Vista / Server 2008:
{e2011457-1546-43c5-a5fe-008deee3d3f0}
- Windows 7 / Server 2008 R2:
{35138b9a-5d96-4fbd-8e2d-a2440225f93a}
- Windows 8 / Server 2012:
{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}
- Windows 8.1 / Server 2012 R2:
{1f676c76-80e1-4239-95bb-83d0f6d0da78}
- Windows 10 / Server 2016:
{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}
Существует новая функция с именем GetProductInfo, которая возвращает информацию о версии.
Если вы хотите протестировать определенную версию, вы должны использовать даже VerifyVersionInfo
Легко создать структуру, чтобы проверить, работает ли конкретная версия ОС. VerifyVersionInfo использует структуры версий, и вы можете легко проверить VER_GREATER_EQUAL и VER_LESS_EQUAL
Также обратите внимание, что GetVersionEx не работает в системе Windows 8.1, если вы задали правильную запись поддерживаемой ОС в разделе совместимости для своего манифеста. Но это может быть в будущей версии ОС!
См. Ориентация вашего приложения для Windows 8.1 для получения списка GUID. Также освещено здесь.
Список GUID для манифеста приложения
- Vista:
{e2011457-1546-43c5-a5fe-008deee3d3f0}
- Windows 7:
{35138b9a-5d96-4fbd-8e2d-a2440225f93a}
- Windows 8:
{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}
- Windows 8.1:
{1f676c76-80e1-4239-95bb-83d0f6d0da78}
- Windows 10:
{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}
Проверьте эту статью на codeproject.com, она отлично работает для Windows 8:
1) Загрузите .DLL и добавьте его в свой проект.
2) Используйте этот код для получения информации о операционной системе:
StringBuilder sb = new StringBuilder(String.Empty);
sb.AppendLine("Operation System Information");
sb.AppendLine("----------------------------");
sb.AppendLine(String.Format("Name = {0}", OSVersionInfo.Name));
sb.AppendLine(String.Format("Edition = {0}", OSVersionInfo.Edition));
if (OSVersionInfo.ServicePack!=string.Empty)
sb.AppendLine(String.Format("Service Pack = {0}", OSVersionInfo.ServicePack));
else
sb.AppendLine("Service Pack = None");
sb.AppendLine(String.Format("Version = {0}", OSVersionInfo.VersionString));
sb.AppendLine(String.Format("ProcessorBits = {0}", OSVersionInfo.ProcessorBits));
sb.AppendLine(String.Format("OSBits = {0}", OSVersionInfo.OSBits));
sb.AppendLine(String.Format("ProgramBits = {0}", OSVersionInfo.ProgramBits));
textBox1.Text = sb.ToString();