Windows系统未激活或key不合适,导致内存只能用到2G

2023-01-03 11:44:25 浏览数 (1)

Windows有个坑是系统没激活导致的。高配机器内存只有2G可用,比如16G内存,resmon命令显示为硬件保留了14336M(整14G)内存,可用只有2G,也可以任务管理器 → 性能页签里的内存 → 右下侧看到为硬件保留的内存多少G(这里是四舍五入的,resmon命令显示的那个更为精确)

在微软windows internals这本书里有记录,跟激活或者说license相关的限制,在一些没激活的场景里,系统内存被限制只能用到2G,其余的会以“为硬件保留的内存”的形式被限制使用。

Windows support for physical memory is dictated by hardware limitations, licensing, operating system data structures, and driver compatiblity.

Windows对物理内存的支持取决于硬件限制、许可、操作系统数据结构和驱动程序兼容性。

执行4句命令可以激活,激活后重启机器即可恢复内存识别,不再浪费内存到"为硬件保留"

第2句里的key根据版本不同要换一下

slmgr /upk

slmgr /ipk WMDGN-G9PQG-XVVXX-R3X43-63DFG

slmgr /skms kms.tencentyun.com

slmgr /ato

一句一句执行,不要一溜复制4句粘贴,会报错,因为下一句依赖上一句的结果,如果一溜同时粘贴就会乱套报错

Windows Server 2008R2企业版

ProductKey: 489J6-VHDMP-X63PK-3K798-CPX3Y

Windows Server 2012R2数据中心版

ProductKey: W3GGN-FT8W3-Y4M27-J84CP-Q3VJ9

Windows Server 2016

ProductKey: CB7KF-BWN84-R7R2Y-793K2-8XDDG

Windows Server 2019

ProductKey: WMDGN-G9PQG-XVVXX-R3X43-63DFG

Windows Server 2022

ProductKey: WX4NM-KYWYW-QJJR4-XV3QB-6VM33

如果是写在.bat里执行,这样写,注意key因系统而不同,要针对性,前面已经强调过了

代码语言:javascript复制
@echo off
cmd /c "cscript /nologo %windir%/system32/slmgr.vbs -upk"
cmd /c "cscript /nologo %windir%/system32/slmgr.vbs -ipk WMDGN-G9PQG-XVVXX-R3X43-63DFG"
cmd /c "cscript /nologo %windir%/system32/slmgr.vbs -skms kms.tencentyun.com:1688"
cmd /c "cscript /nologo %windir%/system32/slmgr.vbs -ato"

cmd /c "cscript /nologo %windir%/system32/slmgr.vbs -ato"
cmd /c "cscript /nologo %windir%/system32/slmgr.vbs -ato"
cmd /c "cscript /nologo %windir%/system32/slmgr.vbs -ato"
@rem 后面加3句是为了健壮性

这个问题最本质的原因可能只有微软自己清楚,微软说下面这个路径的注册表在一些特殊场景比如内存不足的场景中损坏了

HKEY_LOCAL_MACHINESystemCurrentControlSetControlProductOptions

这个注册表里有很多信息,有个软件可以读这个注册表

http://windowsgg-1251783334.cos.na-siliconvalley.myzijiebao.com/ProductPolicyEditor.zip

powershell执行(Get-ItemProperty HKLM:SYSTEMCurrentControlSetControlProductOptions).ProductPolicy.count

结果在千级别的,最好重新激活下系统

结果在几万级别的,应该是正常的

我遇到的一个case

(Get-ItemProperty HKLM:SYSTEMCurrentControlSetControlProductOptions).ProductPolicy.count

未激活值:1960

方法一:

slmgr.vbs /ipk ProductKey #执行完,值立马由1960变成56184

重启系统内存恢复正常

最后再执行slmgr.vbs /ato激活下

方法二:

slmgr.vbs /rilc #值未变化还是1960

重启系统内存恢复正常

slmgr.vbs /ato #只有激活后值才会变成56184

方法三:

卸载任意msi程序 #值可能变,也可能不变

重启系统内存还是2G #值是1960的变成了56184,不管值变不变,重启后内存还是2G

只有执行完slmgr.vbs /ato,并再次重启系统,内存才会恢复正常

要确认是不是内存不足导致,交换分区监控还是比较容易判断内存不足问题的

一般来说,如果交换分区比物理内存大,系统日志里大概率是能过滤到2004 内存不足日志的

参考:https://cloud.tencent.com/developer/article/1927677 查看有没有事件ID2004的system日志,过滤日志可以用系统自带的事件查看器eventvwr,也可以用第三方工具fulleventlogview,参考https://cloud.tencent.com/developer/article/1866711

开关机相关的事件ID:12,13,6005,6006,6008,41,1074

内存不足的事件ID:2004

激活相关的事件ID:8197,8198,12288,12289

这样过滤(一般来说用事件ID过滤效率高,过滤得快,如果用description里的字符串过滤,效率会差一些,过滤得慢)

或者

一般来说,长期内存不足后,某次激活失败了,然后重启机器出现了2G内存的限制。解决办法前面已经说了:

如果配置计划任务的话,内存不足有2004事件ID,可以配置计划任务检测事件ID,当触发时执行含有那4句命令的.bat

为了提升健壮性,最后一句命令来3遍

我已经把计划任务导出为.xml文件了

你只需要准备好c:jihuo.bat后,导入这个.xml文件即可

如何操作我录了视频

jihuo.xml.zip

0 人点赞