系统版本判断方法,求助?[已解决]
本帖最后由 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: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
撸主要准确判断系统版本干啥??? redapple2008 发表于 2022-7-28 16:22
nb!多谢啦 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 redapple2008 发表于 2022-7-29 17:03
这个是翻译出来的
嗯嗯,多谢大佬,今天在群里也有大佬这么写的,也能判断出来,都是正确的。困惑了很久的问题,终于解决了
:face (24): 原来有这么一个未公开的函数,学习了
ConsoleWrite(BrandingFormatString() & @CRLF)
Func BrandingFormatString()
Local $aResult = DllCall('winbrand.dll', 'wstr', 'BrandingFormatString', 'wstr', '%WINDOWS_LONG%')
Return $aResult
EndFunc ;==>BrandingFormatString haijie1223 发表于 2022-7-29 18:23
原来有这么一个未公开的函数,学习了
XP系统上用上面的几个都没用... 邪恶海盗 发表于 2022-8-2 11:21
XP系统上用上面的几个都没用...
XP的dll没有那个函数~ 直接读注册表吧
MsgBox(0, '', RegRead('HKLM64\SOFTWARE\Microsoft\Windows NT\CurrentVersion', 'ProductName')) afan 发表于 2022-8-2 11:54
XP的dll没有那个函数~ 直接读注册表吧
神一般的AFAN... afan 发表于 2022-8-2 11:54
XP的dll没有那个函数~ 直接读注册表吧
我突然间想到一个问题,都说WIN7不同版本文件都一样,是靠哪个文件或者注册表键值区分的,改一下是不是就能从专业版变成旗舰版? 邪恶海盗 发表于 2022-8-5 21:04
我突然间想到一个问题,都说WIN7不同版本文件都一样,是靠哪个文件或者注册表键值区分的,改一下是不是就能 ...
有些程序依靠序列号来调整功能版本,但系统肯定复杂得多。没研究 _ _|| afan 发表于 2022-8-2 11:54
XP的dll没有那个函数~ 直接读注册表吧
这个读win11不准确 itsky2 发表于 2022-8-6 11:47
这个读win11不准确
那就换别的方式好了,按需使用最适合的检测 afan 发表于 2022-8-6 22:32
那就换别的方式好了,按需使用最适合的检测
现在方案是,先用api,读取失败就再读注册表,然后再读版本号,版本号如果是win11,就把win10替换成win11
页:
[1]