zbezj 发表于 2022-7-28 15:30:44

系统版本判断方法,求助?[已解决]

本帖最后由 zbezj 于 2022-7-29 16:59 编辑



各种判断系统版本的方法,基本都不是特别准确。(与系统属性里显示的不一致)

@OSversion判断不了具体的sku,注册表Edition虽然能显示sku,但是英文,且不全面,比如预览版,就显示不了。
wmic方法判断,有时会判断错误,比如win10中,切换密钥后,版本判断错误。
systeminfo判断准确,但是速度略慢。

研究了很久发现,只有通过C:\Windows\System32\winbrand.dll 的 BrandingFormatString 函数判断是最准确无误的。但是C++的代码,大佬们能不能转为AU3?谢谢!

C++的代码

BOOL GetWinBrandName()
{
      BOOL bRet = FALSE;
      HMODULE hModNtdll = NULL;
      if (hModNtdll = ::LoadLibraryW(L"winbrand.dll"))
      {
                typedef LPTSTR (WINAPI* BrandingFormatString)(const wchar_t*);
                BrandingFormatString getWinName;

                getWinName = (BrandingFormatString)::GetProcAddress(hModNtdll, "BrandingFormatString");
                if (getWinName)
                {
                        // 操作系统名称
                        const wchar_t lpct = L"%WINDOWS_LONG%";
                        LPTSTR reName = getWinName(lpct);
                        std::wcout << L"操作系统名称:" << reName << endl;

                        // 版权信息
                        //lpct = L"%WINDOWS_COPYRIGHT%";
                        //LPTSTR reCopyright = getWinName(lpct);
                        //std::wcout << L"版权信息:    " << reCopyright << endl;

                        bRet = TRUE;
                }
                else
                {
                        std::wcout << "异常:未找到函数BrandingFormatString!" << endl;
                }

                ::FreeLibrary(hModNtdll);
                hModNtdll = NULL;
      }
      else
      {
                std::wcout << "异常:winbrand.dll加载失败!" << endl;
      }

      return bRet;
}


redapple2008 发表于 2022-7-28 16:22:25

本帖最后由 redapple2008 于 2022-7-28 16:40 编辑

$aDllCallReturn = DllCall("winbrand.dll","wstr","BrandingFormatString","wstr","%WINDOWS_LONG%")
If @error Then
   Switch @error
      Case 1
         MsgBox(0,"DllCall Code Generator","DllCall错误(winbrand.dll/BrandingFormatString): 不能使用DLL文件,可能使用参数有问题。")
      Case 2
         MsgBox(0,"DllCall Code Generator","DllCall错误(winbrand.dll/BrandingFormatString): 未知的返回值类型.")
      Case 3
         MsgBox(0,"DllCall Code Generator","DllCall错误(winbrand.dll/BrandingFormatString): 函数未包含在DLL文件中。函数名称是区分大小写的哦!")
      Case 4
         MsgBox(0,"DllCall Code Generator","DllCall错误(winbrand.dll/BrandingFormatString): 参数数量错误!")
      Case 5
         MsgBox(0,"DllCall Code Generator","DllCall错误(winbrand.dll/BrandingFormatString): 错误的参数!")
      Case Else
         MsgBox(0,"DllCall Code Generator","DllCall错误(winbrand.dll/BrandingFormatString): 未知/不可预期的错误!")
   EndSwitch
   $vDllCallReturn = ""
Else
MsgBox(0,"测试","系统版本: " & $aDllCallReturn)
EndIf

邪恶海盗 发表于 2022-7-28 18:54:23

撸主要准确判断系统版本干啥???

zbezj 发表于 2022-7-29 16:55:21

redapple2008 发表于 2022-7-28 16:22


nb!多谢啦

redapple2008 发表于 2022-7-29 17:03:31

zbezj 发表于 2022-7-29 16:55
nb!多谢啦

这个是翻译出来的
        Local $hModNtdll = _WinAPI_LoadLibrary('winbrand.dll')
        Local $getWinName = _WinAPI_GetProcAddress($hModNtdll, "BrandingFormatString")
        Local $aResult = DllCallAddress('wstr', $getWinName, "wstr", "%WINDOWS_LONG%")
        Return $aResult

zbezj 发表于 2022-7-29 17:08:50

redapple2008 发表于 2022-7-29 17:03
这个是翻译出来的

嗯嗯,多谢大佬,今天在群里也有大佬这么写的,也能判断出来,都是正确的。困惑了很久的问题,终于解决了

:face (24):

haijie1223 发表于 2022-7-29 18:23:54

原来有这么一个未公开的函数,学习了
ConsoleWrite(BrandingFormatString() & @CRLF)
Func BrandingFormatString()
        Local $aResult = DllCall('winbrand.dll', 'wstr', 'BrandingFormatString', 'wstr', '%WINDOWS_LONG%')
        Return $aResult
EndFunc   ;==>BrandingFormatString

邪恶海盗 发表于 2022-8-2 11:21:46

haijie1223 发表于 2022-7-29 18:23
原来有这么一个未公开的函数,学习了

XP系统上用上面的几个都没用...

afan 发表于 2022-8-2 11:54:59

邪恶海盗 发表于 2022-8-2 11:21
XP系统上用上面的几个都没用...

XP的dll没有那个函数~ 直接读注册表吧
MsgBox(0, '', RegRead('HKLM64\SOFTWARE\Microsoft\Windows NT\CurrentVersion', 'ProductName'))

邪恶海盗 发表于 2022-8-2 15:57:20

afan 发表于 2022-8-2 11:54
XP的dll没有那个函数~ 直接读注册表吧

神一般的AFAN...

邪恶海盗 发表于 2022-8-5 21:04:43

afan 发表于 2022-8-2 11:54
XP的dll没有那个函数~ 直接读注册表吧
我突然间想到一个问题,都说WIN7不同版本文件都一样,是靠哪个文件或者注册表键值区分的,改一下是不是就能从专业版变成旗舰版?

afan 发表于 2022-8-6 10:36:29

邪恶海盗 发表于 2022-8-5 21:04
我突然间想到一个问题,都说WIN7不同版本文件都一样,是靠哪个文件或者注册表键值区分的,改一下是不是就能 ...

有些程序依靠序列号来调整功能版本,但系统肯定复杂得多。没研究 _ _||

itsky2 发表于 2022-8-6 11:47:51

afan 发表于 2022-8-2 11:54
XP的dll没有那个函数~ 直接读注册表吧

这个读win11不准确

afan 发表于 2022-8-6 22:32:28

itsky2 发表于 2022-8-6 11:47
这个读win11不准确

那就换别的方式好了,按需使用最适合的检测

itsky2 发表于 2022-8-11 16:47:54

afan 发表于 2022-8-6 22:32
那就换别的方式好了,按需使用最适合的检测

现在方案是,先用api,读取失败就再读注册表,然后再读版本号,版本号如果是win11,就把win10替换成win11
页: [1]
查看完整版本: 系统版本判断方法,求助?[已解决]