Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Определение версии ОС (http://forum.oszone.net/showthread.php?t=245378)

BigBoo 24-10-2012 14:07 2011307

Определение версии ОС
 
Нужен скрипт VBS: если ОС - Windows 7 или Vista - выполняется одно действие, в противном случае - другое действие.

yurfed 24-10-2012 14:21 2011318

BigBoo, есть такой вариант CMD/BAT - [решено] Определение версии (сборки) и сервис пака ОС
Принцип думаю будет понятен что и где смотреть.

DmitriiV 24-10-2012 16:33 2011393

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

Set objCollection = GetObject("winmgmts:\\.\root\cimv2").ExecQuery("SELECT Name FROM Win32_OperatingSystem")
For Each objItem In objCollection
    strOS = objItem.Name
Next
If InStr(1, strOS, " Vista ", vbTextCompare) > 0 Or InStr(strOS, " 7 ") > 0 Then
    WScript.Echo "Выполняем действие для Vista/7."
Else
    WScript.Echo "Выполняем действие для прочих версий."
End If

Возможны и другие варианты, но здесь надо знать больше подробностей об условиях, в которых решается задача (и, может быть, о цели её решения).

xeon13 29-09-2016 11:10 2673284

'Вариации версий Windows которые я точно проверил:
'Microsoft Windows Server 2008 R2 Standard

'Виндовс 7 x86/x64
'Microsoft Windows 7 Пpoфeccиoнaльнaя

'Виндовс 8.1
'Майкрософт Windows 8.1 для одного языка с Bing
'Майкрософт Windows 8.1 для одного языка

'Виндовс XP
'Microsoft Windows XP Professional
'Microsoft Windows XP Home Edition

'Виндовс 10
'Майкрософт Windows 10 Pro

greg zakharov 29-09-2016 17:03 2673409

Цитата:

Цитата DmitriiV
Возможны и другие варианты, но здесь надо знать больше подробностей об условиях

Вариантов, как и условий - много. Особенно доставляет WMI: были прецеденты, когда Win32_OperatingSystem содержал не совсем верную информацию о системе, например, в одной из контор, где была развернута Win7, система определялась как 2008 R2. А ведь такого же эффекта можно добиться незамысловатым С-кодом:
Код:

#include <windows.h>
#include <stdio.h>
#include <locale.h>

#define CreateString(String) #String,
#define FifthBranch(Type) Type(2000) Type(XP) Type(Server 2003)
#define SixthBranch(Type) Type(Vista\\Server 2008) \
  Type(7\\Server 2008 R2) \
  Type(8\\Server 2012) \
  Type(8.1\\Server 2012 R2)

VOID (__stdcall *RtlGetNtVersionNumbers)(
    LPDWORD Major,
    LPDWORD Minor,
    LPDWORD Build
);

BOOL Is64BitSystem() {
  #if defined(_WIN64)
    return TRUE;
  #elif defined(_WIN32)
    BOOL x64 = FALSE;
    return IsWow64Process(GetCurrentProcess(), &x64) && x64;
  #else
    return FALSE;
  #endif
}

int main(void) {
  DWORD _maj = 0, _min = 0;
  const char *Fifth[] = {FifthBranch(CreateString)};
  const char *Sixth[] = {SixthBranch(CreateString)};
 
  setlocale(LC_CTYPE, "");
 
  if (!(RtlGetNtVersionNumbers = (PVOID)GetProcAddress(
    GetModuleHandle("ntdll.dll"), "RtlGetNtVersionNumbers"
  ))) {
    LPVOID msg;
    FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
        NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
        (LPTSTR) &msg, 0, NULL
    );
    printf("%s\n", msg);
    LocalFree(msg);
    return -1;
  }
 
  printf("%s, Windows ", Is64BitSystem() ? "64-bit" : "32-bit");
  RtlGetNtVersionNumbers(&_maj, &_min, NULL);
  switch (_maj) {
    case  5: printf(Fifth[_min]); break;
    case  6: printf(Sixth[_min]); break;
    case 10: printf("10\n");      break;
    default: printf("Unknown");  break;
  }
 
  return 0;
}

Такие коврижки.


Время: 05:44.

Время: 05:44.
© OSzone.net 2001-