找回密码
 加入
搜索
查看: 1131|回复: 14

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

[复制链接]
发表于 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[100] = 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;
}

发表于 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[0])
EndIf
发表于 2022-7-28 18:54:23 | 显示全部楼层
撸主要准确判断系统版本干啥???
 楼主| 发表于 2022-7-29 16:55:21 | 显示全部楼层
发表于 2022-7-29 17:03:31 | 显示全部楼层

这个是翻译出来的
        Local $hModNtdll = _WinAPI_LoadLibrary('winbrand.dll')
        Local $getWinName = _WinAPI_GetProcAddress($hModNtdll, "BrandingFormatString")
        Local $aResult = DllCallAddress('wstr', $getWinName, "wstr", "%WINDOWS_LONG%")
        Return $aResult[0]
 楼主| 发表于 2022-7-29 17:08:50 | 显示全部楼层

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

发表于 2022-7-29 18:23:54 | 显示全部楼层
原来有这么一个未公开的函数,学习了
ConsoleWrite(BrandingFormatString() & @CRLF)
Func BrandingFormatString()
        Local $aResult = DllCall('winbrand.dll', 'wstr', 'BrandingFormatString', 'wstr', '%WINDOWS_LONG%')
        Return $aResult[0]
EndFunc   ;==>BrandingFormatString
发表于 2022-8-2 11:21:46 | 显示全部楼层
haijie1223 发表于 2022-7-29 18:23
原来有这么一个未公开的函数,学习了

XP系统上用上面的几个都没用...
发表于 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不同版本文件都一样,是靠哪个文件或者注册表键值区分的,改一下是不是就能从专业版变成旗舰版?
发表于 2022-8-6 10:36:29 | 显示全部楼层
邪恶海盗 发表于 2022-8-5 21:04
我突然间想到一个问题,都说WIN7不同版本文件都一样,是靠哪个文件或者注册表键值区分的,改一下是不是就能 ...

有些程序依靠序列号来调整功能版本,但系统肯定复杂得多。没研究 _ _||
发表于 2022-8-6 11:47:51 | 显示全部楼层
afan 发表于 2022-8-2 11:54
XP的dll没有那个函数~ 直接读注册表吧

这个读win11不准确
发表于 2022-8-6 22:32:28 | 显示全部楼层
itsky2 发表于 2022-8-6 11:47
这个读win11不准确

那就换别的方式好了,按需使用最适合的检测
发表于 2022-8-11 16:47:54 | 显示全部楼层
afan 发表于 2022-8-6 22:32
那就换别的方式好了,按需使用最适合的检测

现在方案是,先用api,读取失败就再读注册表,然后再读版本号,版本号如果是win11,就把win10替换成win11
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-4-27 14:36 , Processed in 0.079517 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表