☰
CASS11提示请勿在虚拟机中运行:VBS、Hyper-V与内存完整性排查
2026/10/29 12:58:42 网站建设 项目流程

简介:这份PDF文档面向需要安装并运行CAD与南方CASS11的测绘、地理信息从业者及专业技术人员,聚焦安装或启动CASS11时弹出「请不要在虚拟机中运行此程序」警告的兼容性故障,给出可对照执行的排除思路。文档先交代先装CAD、再用CASS10中的获取机器码工具完成破解的前置条件,随后按由浅入深顺序整理五条路径:卸载虚拟机软件、关闭Windows安全中心的「内存完整性」、在「启用或关闭Windows功能」中取消相关选项、以管理员身份运行CMD关闭Hypervisor启动项,以及进入BIOS关闭虚拟化技术,并提示安全中心页面空白时的注册表修复命令,便于读者按自身系统版本逐条尝试。资源包仅含1个PDF文件,大小约1.87MB,单文件结构、查阅方便,适合装机时随手对照排错。目前已有4558人学习,可作为CAD2016搭配CASS11环境部署的参考手册。

1. 双击就弹窗:CASS11 报“请不要在虚拟机中运行此程序”到底在查什么

装 CAD、装 CASS11、插上加密设备,一路顺下来,最后双击图标,进度条转两圈,白底黑字弹出一句“请不要在虚拟机中运行此程序”。机器是自己装的台式机,系统是原版镜像,桌面虚拟机软件早就卸干净了,它偏偏不认。这个提示在 CAD 与 CASS 软件安装与故障排除里属于高频卡点,新装 Win10/Win11、开过内核隔离的笔记本、装过 WSL 或 Docker 的开发机、从别人那里拷来的整机环境,全都可能遇到。它不看你装了什么软件,只看系统底层有没有虚拟化在运行,所以很多人卸载一整晚虚拟机软件毫无作用,白白折腾。下面按现象、根因、解法、避坑的顺序走一遍,新手能照着执行,熟手能看清它真正检测的是什么。

2. 它查的不是虚拟机软件:VBS、内存完整性与 Hypervisor 的三层触发链

这类保护性检测并不神秘,它不扫描你的程序列表,而是在启动早期读取系统底层暴露出来的虚拟化痕迹。只要痕迹对得上,它就直接判定“你在虚拟机里”。理解这一点,后面五种解法的先后顺序才有依据,否则就是照着清单逐个试,试到能开为止,下次重装还得再翻一遍。

2.1 程序判断“我在虚拟机里”的几个常用依据

最底层的依据是 CPUID 指令返回的 hypervisor present 位。只要有任何 hypervisor 在这台机器上运行,这个标志位就会被置起,普通程序读一下就知道“我上面还有一层”。这一条跟“装没装桌面虚拟机软件”完全无关,是很多人在卸载软件之后依然看到弹窗的根本原因。

第二类依据是系统层的虚拟化安全状态。Windows 的“基于虚拟化的安全性”开启后,系统信息里会明确写着虚拟化已启用并在运行,一些程序直接读这个字段做判断。第三类是引导配置里的 hypervisor 启动项,第四类是硬件指纹,包括网卡 MAC 前缀、磁盘序列号、主板固件里的字符串,第五类是时间戳计数器的抖动特征。做检测的程序通常挑两三样组合判断,不会全用。

对 CASS11 这类桌面软件来说,命中率最高的是前两类:一是 Windows 自己启用了虚拟化安全,二是系统里还留着 Hyper-V 相关组件。很多人根本没装过任何桌面虚拟机软件,却因为笔记本出厂就开了“内核隔离”,一装就弹窗,这就是典型的“我没开虚拟机啊”的困惑来源。

提示:判断顺序上先看系统层,再看固件层。固件层的改动影响面最大,放到最后。

2.2 三条命令看清这台机器现在处于哪一档

不要凭感觉猜,先花一分钟把现状采集出来。以管理员身份打开命令提示符,逐条执行:

:: 1) 查看当前启动项的 hypervisor 启动类型,Auto 表示系统自带虚拟化层在跑 bcdedit /enum {current} | findstr /i hypervisor :: 2) 查看 VBS 与内存完整性(HVCI)的真实运行状态,需要 PowerShell powershell -Command "Get-CimInstance -Namespace root\Microsoft\Windows\DeviceGuard -ClassName Win32_DeviceGuard | Select-Object VirtualizationBasedSecurityStatus, SecurityServicesRunning, SecurityServicesConfigured" :: 3) 查看是否还有虚拟化相关的系统功能处于开启状态 powershell -Command "Get-WindowsOptionalFeature -Online | Where-Object { $_.FeatureName -match 'Hyper|VirtualMachine|Sandbox|Linux' } | Select-Object FeatureName, State"

第一条命令里{current}指当前启动项,findstr /i表示忽略大小写过滤,正常关闭后你看到的应该是hypervisorlaunchtype Off,如果是Auto,说明系统虚拟化层在开机时就会拉起。第二条命令返回三个关键字段:VirtualizationBasedSecurityStatus取值 0 表示未启用、1 表示已启用但未运行、2 表示已启用且正在运行;SecurityServicesRunning的数组里如果出现 2,代表内存完整性(HVCI)正在跑,这是最常见的触发源;SecurityServicesConfigured是配置意图,跟实际运行状态可能不一致,要以 Running 为准。第三条命令列出所有名字里带 Hyper、VirtualMachine、Sandbox、Linux 的功能项及其 State,Enabled的就是需要重点怀疑的对象。

这三条命令的价值在于,它们能直接把“到底是哪一层在起作用”区分开。如果第一条是 Off、第二条 Running 里有 2,那问题就锁在内存完整性上,直接跳到 3.1;如果第一条是 Auto、第二条全是 0,那说明是引导层的 hypervisor 在跑,重点在 3.2 和 3.3。省下来的时间够你把软件重装两遍了。

2.3 固件、引导、系统、安全功能:四层结构决定了动手顺序

把虚拟化拆成四层看会清楚很多。最下面是固件层,也就是 BIOS/UEFI 里的 Intel VT-x 或 AMD SVM 开关,它决定 CPU 是否具备虚拟化能力;往上是引导层,bcdedit里的hypervisorlaunchtype决定开机时要不要加载 Windows 自带的 hypervisor;再往上是系统功能层,Hyper-V、虚拟机平台、Windows 虚拟机监控程序平台、Windows 沙盒、适用于 Linux 的子系统都挂在这一层;最上面是安全功能层,内核隔离下的内存完整性、凭据保护都属于这一类,它们本身依赖下面几层才能跑起来。

这四层是依赖关系,不是并列关系。内存完整性要想运行,必须有 hypervisor;hypervisor 要想加载,固件层的虚拟化开关必须是开的。所以关闭的时候要自上而下:先关最上面的安全功能,再关系统功能,再关引导项,最后才动固件。反过来从 BIOS 开始关,不但绕了远路,还会把一堆正常功能一起废掉,后面想恢复得重新摸一遍 BIOS 菜单。

我一般还会在这一步顺手确认一件事:安装顺序对不对。CASS 系列依赖 CAD 环境,必须先把 CAD 装好、能正常启动,再装 CASS;顺序反了会出现各种莫名其妙的加载失败,被人误当成虚拟化问题去折腾。另外机器码相关的工具要用对应版本的,拿高版本目录里自带的那份工具去取机器码,读出来的值经常对不上,导致后面授权环节反复失败,也被误认为是环境问题。

3. 五种解法不是并列关系:从内存完整性到 BIOS 的实操顺序与命令

网上流传的解法通常一口气列五条,看完还是不知道该先试哪个。实际排下来应该按副作用从小到大:先动那个“关掉不心疼、随时能开回来”的开关,再动影响其他软件的功能项,最后才碰固件。下面这个顺序是我自己反复装机器总结出来的,每一步都给了可以复制执行的命令和回滚方式。

3.1 第一步关内存完整性,顺手处理安全中心打不开的情况

路径是:Windows 安全中心 → 设备安全性 → 内核隔离详细信息 → 把“内存完整性”的开关关掉,按提示重启。这一步副作用最小,只影响内核完整性校验这一项防护,其他功能照常。

麻烦在于不少机器打开安全中心是一片空白,或者点进“设备安全性”没有任何内容,开关根本找不到。这通常不是系统坏了,而是安全中心服务被优化工具、精简版镜像或者某些“一键加速”脚本改成了禁用状态。解决办法是把服务启动类型改回来:

:: 以管理员身份运行命令提示符,把安全中心服务的启动类型改回“手动” :: Start 值含义:2 = 自动,3 = 手动(按需启动),4 = 禁用 :: /v 指定值名称,/t 指定类型为 REG_DWORD,/d 指定数据,/f 表示存在则强制覆盖 REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SecurityHealthService" /v "Start" /t REG_DWORD /d 3 /f

执行完必须重启,服务配置才会重新加载。重启后安全中心界面正常显示,再按上面的路径关掉内存完整性,然后再重启一次。这里有个容易翻车的细节:这条命令在中文输入法下粘贴,双引号很容易变成全角,命令提示符会直接报“参数无效”或者把整串当成一个未知命令。手动敲一遍,或者粘贴后确认引号是半角的,能省掉半小时的自我怀疑。

关完之后回到 2.2 的第二条命令复查,SecurityServicesRunning里不再出现 2,说明 HVCI 确实停了。如果状态没变,先确认是不是真的重启过——Windows 的快速启动会让“关机再开机”变成一次休眠恢复,配置根本没生效,用shutdown /r /f /t 0强制完整重启才作数。

提示:有些主板在 BIOS 里关掉虚拟化后,内存完整性开关会变成灰色不可点,这属于正常现象,说明上面这一层已经断了。

3.2 第二步用 bcdedit 关掉 hypervisor 自启

内存完整性关了还弹窗,说明引导层的 hypervisor 还在跑。这时候用一条命令把它关掉:

:: 关闭 hypervisor 自动启动,改动写入当前启动项,重启后生效 bcdedit /set hypervisorlaunchtype off :: 需要恢复时执行这条,WSL2、Docker、Windows 沙盒都依赖它 bcdedit /set hypervisorlaunchtype auto :: 想确认当前值,只看这一行输出即可 bcdedit /enum {current} | findstr /i hypervisor

/set后面跟的是要修改的配置项名称,hypervisorlaunchtype就是控制 hypervisor 是否随系统启动的开关,取值off关闭、auto自动。不带{current}时默认作用于当前启动项,多系统环境下建议显式写成bcdedit /set {current} hypervisorlaunchtype off,避免改错。

这一步的风险点不在命令本身,而在磁盘加密。开启了设备加密或 BitLocker 的机器,修改引导配置后重启,可能直接停在恢复界面要求输入恢复密钥。如果你不确定密钥在哪,先别执行,去账户里把恢复密钥找出来或者先暂停保护,改完再恢复。这个坑我踩过一次,坐在别人机器前对着恢复界面翻了半小时手机。

命令执行后如果提示“拒绝访问”,说明不是管理员窗口;如果提示找不到元素,多半是启动项标识写错,用bcdedit /enum all看一下实际标识再改。

3.3 第三步关掉 Windows 功能里的虚拟化组件

引导项关了,但系统功能还开着的时候,某些组件会自己把 hypervisor 拉起来。控制面板 → 程序和功能 → 启用或关闭 Windows 功能,需要取消的通常是三项:Hyper-V、虚拟机平台、Windows 虚拟机监控程序平台。名字很像,作用不同,虚拟机平台是给 WSL2 和部分容器用的,虚拟机监控程序平台是给第三方虚拟化产品提供接口的,两个都留着就可能继续触发检测。

图形界面点起来慢,用命令更干脆:

:: 逐个关闭三个虚拟化相关功能,/norestart 表示先不重启,全部关完再统一重启 dism /online /disable-feature /featurename:Microsoft-Hyper-V-All /norestart dism /online /disable-feature /featurename:VirtualMachinePlatform /norestart dism /online /disable-feature /featurename:HypervisorPlatform /norestart

/online表示操作当前运行的系统,/featurename后面是功能的内部名称,/norestart抑制自动重启,最后手动执行一次shutdown /r /f /t 0更可控。三条命令里任意一条报“功能名称未知”,说明这台机器上该功能本来就没装,跳过即可,不影响结果。

关完之后再回头跑一次 2.2 的第三条命令,确认这几项 State 都变成了 Disabled。有时候图形界面里看着已经取消勾选,实际组件还在卸载队列里没完成,必须等重启跑完才算数。这一步做完,绝大多数机器的弹窗就消失了。

3.4 最后才动 BIOS 和卸载虚拟机软件

BIOS 层关闭 Intel VT-x 或 AMD SVM 是“核弹级”操作,副作用最大:所有依赖硬件虚拟化的软件全部失效,包括部分安全软件的虚拟化防护、部分模拟器、以及一些开发工具。不同厂商主板的进法不一样,常见的是开机连点 Del 或 F2,找到 Advanced 或 CPU Configuration 里的 Virtualization Technology 选项改成 Disabled,保存退出。做之前记下原始值,方便回滚。

至于卸载桌面虚拟机软件,只有在确实装了的情况下才有意义,而且是这五步里最不该排在前面的。卸载不干净还会留残留:虚拟网卡、虚拟交换机、后台服务都可能继续存在,反而让判断更混乱。真要卸载,卸完顺手检查一遍:

# 列出名字或描述里带 Virtual 的网卡,确认没有虚拟网卡残留 Get-NetAdapter | Where-Object { $_.InterfaceDescription -match "Virtual" } | Select-Object Name, InterfaceDescription # 列出描述里带 Virtual 的服务,确认没有虚拟化后台服务残留 Get-Service | Where-Object { $_.DisplayName -match "Virtual" } | Select-Object Name, DisplayName, Status

两条命令返回为空或者只剩系统自带项,才算清理干净。清理完仍然弹窗的,说明问题本来就不在这一层,回头从 3.1 重新走一遍判断流程,别再往下卸东西了。

4. 排查与避坑:改完设置还弹窗、WSL 报废、安全中心空白的 5 个真实卡点

按照上面的顺序走,大部分机器一次就能通。剩下那些“明明按步骤做了却没用”的情况,基本都落在下面这几类里。每一条我都写清了现象、原因和解法,对照着看就行。

4.1 现象:开关显示已关闭,重启后 CASS11 照样弹窗

原因有两个。一是重启没有真正生效,Windows 默认开启快速启动,点“关机”再开机其实是一次休眠恢复,引导配置和功能变更都没重新加载;二是只关了内存完整性,引导层的 hypervisor 依然是Auto,或者虚拟机平台之类的功能还开着,组件自己又把虚拟化层拉了起来。

解决方式是强制完整重启,然后立刻复查状态:shutdown /r /f /t 0执行完等机器起来,先跑bcdedit /enum {current} | findstr /i hypervisor确认是Off,再跑 DeviceGuard 那条命令确认SecurityServicesRunning里没有 2。两个条件都满足还弹窗,才需要考虑 3.4 的固件层。养成“改完必须复查”的习惯,能避免大量“我明明改了”的无效沟通。

4.2 现象:安全中心打开一片空白,找不到内核隔离入口

原因通常是安全中心服务被禁用,或者系统镜像被精简过。一些“优化脚本”会顺手把SecurityHealthService的启动类型改成 4(禁用),界面自然是一片空白,连“设备安全性”这个入口都不渲染。

解决就是 3.1 里那条注册表命令,把 Start 改成 3 后重启。如果改完仍然空白,用sfc /scannow扫一遍系统文件,修复缺失的安全中心组件。这一步不要跳过,因为内存完整性是整套排查里副作用最小的解法,入口找不到就只能被迫去动 BIOS,得不偿失。

4.3 现象:命令提示符报“参数无效”或“不是内部或外部命令”

原因几乎都是复制粘贴带来的字符问题:中文输入法下引号变成全角、连字符变成全角横线、换行被聊天软件吃掉导致两条命令粘成一行。看起来一模一样,执行就是不认。

解决办法是右键以管理员身份打开命令提示符后,手动敲关键符号,或者粘贴完先把引号删掉重新打一遍。另外一个常见原因是没在管理员窗口里执行,bcdedit和REG ADD都会返回“拒绝访问”,这个提示和权限有关,跟命令写法无关,别在写法上反复折腾。

4.4 现象:关完之后 WSL2、容器工具、模拟器全起不来了

原因很直接,这些工具都依赖 Hyper-V 平台。bcdedit /set hypervisorlaunchtype off加上关闭虚拟机平台,等于把它们的运行基础拆了,报错通常是“未安装虚拟机平台”或者“请启用 Hyper-V”。

解法是做一个双启动项,需要跑测绘软件时切到兼容模式,需要跑开发环境时切回正常模式:

:: 复制当前启动项,生成一个专用条目,标识符会在输出里给出 bcdedit /copy {current} /d "CASS 兼容模式" :: 假设输出给了 {新标识符},把它单独设为关闭 hypervisor bcdedit /set {新标识符} hypervisorlaunchtype off

第一条命令会打印一个新的 GUID,把它填进第二条。这样开机时会出现选择菜单,日常用默认项,装软件或跑 CASS 时选兼容模式,两边互不干扰。比反复改配置、反复重启省事得多。

4.5 现象:改完启动项,重启卡在恢复密钥界面

原因是磁盘加密在监视引导配置,bcdedit一旦修改启动参数,会被判定为潜在的篡改行为,直接要求输入恢复密钥才能继续启动。笔记本出厂默认开设备加密的机型尤其容易遇到。

解法是在动手之前先把恢复密钥找出来:账户的设备页面里能看到,或者用管理员命令manage-bde -protectors -get C:在系统还能正常启动时先导出备份,再改配置。已经卡住的,输入密钥进入系统后,先manage-bde -protectors -disable C:暂停保护,改完配置再重新启用。这一个坑值得单独记一笔,它不影响功能,但能让人当场慌神。

5. 三分钟定位:用一张对照表和一条命令判断卡在哪一层

排查这类问题最耗时的部分不是操作,而是判断该做哪一步。把症状和层位对应起来,能省掉大量试错。下面这张表是我放在便签上的版本,遇到机器先对一遍:

症状表现最可能的层位一条命令验证
从没装过虚拟机软件,一装就弹窗安全功能层(内存完整性)DeviceGuard 命令看SecurityServicesRunning是否含 2
安全中心空白,找不到内核隔离入口系统服务被禁用sc query SecurityHealthService看状态
关了内存完整性仍弹窗引导层或系统功能层bcdedit /enum {current}看 hypervisorlaunchtype
装过 WSL2 / 容器工具后开始弹窗系统功能层列可选功能看 State 是否为 Enabled
上述都处理完仍弹窗固件层BIOS 里看 VT-x / SVM 是否开启

配套用一段采集脚本,把散落在各处的状态一次性抓下来,避免来回敲命令:

@echo off :: 一次性采集虚拟化相关状态,输出到当前目录的 cass_check.txt ( echo ===== hypervisor launch type ===== bcdedit /enum {current} | findstr /i hypervisor echo ===== device guard status ===== powershell -Command "Get-CimInstance -Namespace root\Microsoft\Windows\DeviceGuard -ClassName Win32_DeviceGuard | Select-Object VirtualizationBasedSecurityStatus,SecurityServicesRunning" echo ===== optional features ===== powershell -Command "Get-WindowsOptionalFeature -Online | Where-Object { $_.FeatureName -match 'Hyper|VirtualMachine|Sandbox|Linux' } | Select-Object FeatureName,State" ) > cass_check.txt 2>&1 echo 采集完成,查看当前目录下的 cass_check.txt pause

2>&1把错误输出也重定向进文件,避免某条命令失败导致整段输出断掉;pause让窗口停住,方便确认执行完毕。把这个文件和实际表现一并发给能帮忙的人,对方不用远程摸黑猜,沟通成本直接砍半。

验证是否真的解决,别只盯着弹窗消失这一个信号。完整走一遍:双击打开 CASS11,新建一个空图形,随手画两条线并保存,再关闭重开确认能正常读取。有些机器只是启动检测放过了,加载到某一步仍然会出问题,做一次完整的读写闭环才算真的通过。

从那以后我每次处理这类提示,都强制先跑一遍状态采集,再决定动哪一层,绝不凭印象直接去关 BIOS。有几次就是靠这一步发现机器上还留着没卸干净的虚拟化组件,差点白拆一台机器。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询