Что нового

проблема с определением версии windows на Win10

Jeikob

Новичок
Сообщения
3
Репутация
0
Доброго времени суток. Столкнулся с проблемой. Нужно вычленять win10 x64. С проверкой разрядности ни каких проблем не возникает. А вот с определением версии винды столкнулся с забавной проблемой. На компе который (судя по остаточным файлам и папкам) был обновлен с win7 до win10, ни какими средствами не получается получить правильные данные.
Пробовал макрос @OSVersion, вместо ожидаемого вывода WIN_10 получаю WIN_7. Пробовал функцией _WinAPI_GetVersion(), вместо ожидаемого результата 10.0 получаю 6.1. Пошел вообще длинным путем беря данные из реестра RegRead("HKLM64\SOFTWARE\Microsoft\Windows NT\CurrentVersion", "ProductName") и опять вместо ожидаемого Windows 10 Pro, получаю Windows 7 Ultimate (если ручками туда сходить, то win7 и не пахнет). :blink: :stars: :stars: :laugh:

На на компе на котором пишу сам скрип такая же десятка, только поставленная с нуля и на ней все ожидания оправдались.
В общем, уже мозги кипят.
Вопросов полно и скорее всего это вопросы больше наверно по винде. Но один могу сформулировать точно, от куда макрос @OSVersion берет информацию, может если капнуть в этом направлении чего на копаю?
Если есть еще какие мысли поделитесь. Буду весьма признателен.

версия AutoIt'a 3.3.14.2
SciTE Version 3.5.5.101 от сюда http://autoit-script.ru/index.php?topic=18986.0
 

Tyr

Новичок
Сообщения
43
Репутация
4
А что даёт выполнение команд командной строки винды winver msinfo32 и systeminfo (которая к томуже делает вывод в командную строку, который можно перехватить и использовать)
Скорее всего в Винде всё же в HKEY_LOCAL_MACHINE\ SOFTWARE\ Microsoft\ Windows NT\ CurrentVersion Что то не то указано иначе всё бы нормально показывало... у меня всё ок в этой ветке и продукт нэйм верный
 
Автор
J

Jeikob

Новичок
Сообщения
3
Репутация
0
да в том то и дело, что все кругом win10 пишет, лишь скрипт иного мнения. вот он упорно твердит - win7. по поводу перехвата из командной строки мысли были... но не охота усложнять лишними окнами и пр.
скрин http://autoit-script.ru/index.php?action=downloads;sa=downfile&id=593
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
Попробуйте так. В качестве параметра _VerifyVersionInfo укажите нужную версию и функция вернет True/False в зависимости от того является ли версия ОС таковой
Код:
#include <StringConstants.au3>
#include <WinAPISys.au3>
Global Const $VER_MAJORVERSION = 0x0000002
Global Const $VER_MINORVERSION = 0x0000001
Global Const $VER_EQUAL = 1

Global $fVerCher = _VerifyVersionInfo("6.1")
MsgBox(64, "Info", "Version: " & $fVerCher & @CRLF & "Error: " & @error & @CRLF & "Extended: " & @extended)

Func _VerifyVersionInfo($sVersion, $vKernel32 = "Kernel32.dll")
    If $vKernel32 = Default Then $vKernel32 = "Kernel32.dll"
    Local Const $iMask = BitOR($VER_MAJORVERSION, $VER_MINORVERSION)
    Local $tOSVERSIONINFOEX, $pOSVERSIONINFOEX, $aMajorMinor, $vRet, $iConditionMask = 0
    $aMajorMinor = StringSplit($sVersion, ".", $STR_NOCOUNT)
    If @error Then Return SetError(1, 0, -3)
    $tOSVERSIONINFOEX = DllStructCreate($tagOSVERSIONINFOEX)
    DllStructSetData($tOSVERSIONINFOEX, 1, DllStructGetSize($tOSVERSIONINFOEX))
    DllStructSetData($tOSVERSIONINFOEX, 2, Number($aMajorMinor[0]))
    DllStructSetData($tOSVERSIONINFOEX, 3, Number($aMajorMinor[1]))
    $vRet = DllCall($vKernel32, "UINT64", "VerSetConditionMask", _
            "UINT64", $iConditionMask, _
            "DWORD", $iMask, _
            "BYTE", $VER_EQUAL)
    If @error Then Return SetError(@error, @extended, -2)
    $vRet = DllCall($vKernel32, "BOOL", "VerifyVersionInfoW", _
            "PTR", DllStructGetPtr($tOSVERSIONINFOEX), _
            "DWORD", $iMask, _
            "UINT64", $vRet[0])
    If @error Then Return SetError(@error, @extended, -1)
    Return SetError(0, 0, $vRet[0] = 1)
EndFunc   ;==>_VerifyVersionInfo
 
Автор
J

Jeikob

Новичок
Сообщения
3
Репутация
0
Tempo сказал(а):
Попробуйте так. В качестве параметра _VerifyVersionInfo укажите нужную версию и функция вернет True/False в зависимости от того является ли версия ОС таковой
Код:
#include <StringConstants.au3>
#include <WinAPISys.au3>
Global Const $VER_MAJORVERSION = 0x0000002
Global Const $VER_MINORVERSION = 0x0000001
Global Const $VER_EQUAL = 1

Global $fVerCher = _VerifyVersionInfo("6.1")
MsgBox(64, "Info", "Version: " & $fVerCher & @CRLF & "Error: " & @error & @CRLF & "Extended: " & @extended)

Func _VerifyVersionInfo($sVersion, $vKernel32 = "Kernel32.dll")
    If $vKernel32 = Default Then $vKernel32 = "Kernel32.dll"
    Local Const $iMask = BitOR($VER_MAJORVERSION, $VER_MINORVERSION)
    Local $tOSVERSIONINFOEX, $pOSVERSIONINFOEX, $aMajorMinor, $vRet, $iConditionMask = 0
    $aMajorMinor = StringSplit($sVersion, ".", $STR_NOCOUNT)
    If @error Then Return SetError(1, 0, -3)
    $tOSVERSIONINFOEX = DllStructCreate($tagOSVERSIONINFOEX)
    DllStructSetData($tOSVERSIONINFOEX, 1, DllStructGetSize($tOSVERSIONINFOEX))
    DllStructSetData($tOSVERSIONINFOEX, 2, Number($aMajorMinor[0]))
    DllStructSetData($tOSVERSIONINFOEX, 3, Number($aMajorMinor[1]))
    $vRet = DllCall($vKernel32, "UINT64", "VerSetConditionMask", _
            "UINT64", $iConditionMask, _
            "DWORD", $iMask, _
            "BYTE", $VER_EQUAL)
    If @error Then Return SetError(@error, @extended, -2)
    $vRet = DllCall($vKernel32, "BOOL", "VerifyVersionInfoW", _
            "PTR", DllStructGetPtr($tOSVERSIONINFOEX), _
            "DWORD", $iMask, _
            "UINT64", $vRet[0])
    If @error Then Return SetError(@error, @extended, -1)
    Return SetError(0, 0, $vRet[0] = 1)
EndFunc   ;==>_VerifyVersionInfo

Спасибо огромное эта функция работает на ура. определяет все верно. ;D :beer:
 
Верх