资讯详情

资讯详情

VMware虚机VBS与Credential Guard配置避坑指南

简介面向在 VMware 等虚拟化平台上排查系统运行状态的运维人员与实验者dgreadiness_v3.6 提供了一套以 PowerShell 脚本为核心的配置检测与修复工具重点围绕硬件辅助虚拟化是否启用、系统配置是否符合最佳实践等常见问题展开检查与调整。压缩包共 6 个文件、约 31KB体量轻便。其中 ps1 脚本是执行主体负责自动化检测与策略应用xml 与 p7b 文件承载审计与强制执行的策略定义另有 txt 说明文档提示使用前的注意事项形成“脚本策略说明书”的完整闭环便于在小规模环境中快速离线运行。目前已有 4212 人学习下载具备一定的实践参考价值。读者可据此理解虚拟化就绪性检查的判定逻辑与策略执行方式掌握从策略文件到脚本执行的完整流程也可将其中思路迁移到自查虚拟化兼容性、定位配置偏差与验证修复效果等场景。1. 从一台“虚拟化就绪失败”的虚机说起上周给一个模拟项目搭测试环境在 VMware 里开了一台 Windows 虚机准备跑依赖 Hyper-V 的安全组件顺手拿起 dgreadiness_v3.6 跑了一遍结果脚本直接给我当头一棒虚拟化运行状态不满足msinfo32 里“基于虚拟化的安全性”写着“未启用”。折腾了大半天才定位到问题不在脚本在这台虚机的固件还是 BIOS、虚拟机监控程序根本没起来Secure Boot 压根无从谈起。这套脚本干的就是这件事先把虚拟化运行状态挨个查一遍再把缺的开关补上。它不适合往生产机上硬塞但凡是需要在虚机里做安全基线验证、跑 Credential Guard 或内存完整性测试的场景基本绕不开它。2. 环境准备客户机四项硬指标和 VMware 侧四个开关虚拟化运行状态这个问题出问题的地方往往不在脚本本身而是在脚本跑起来之前环境就没达标。我见过太多次脚本提示-Prepare成功重启后一查还是“未启用”回头一看固件类型还是 BIOS或者虚拟 TPM 就没加。所以装 dgreadiness_v3.6 之前先把客户机侧和虚拟机侧这两边对齐能省掉后面一半的排查时间。2.1 客户机侧的四项硬指标第一项是系统 SKU。VBS基于虚拟化的安全性在 Windows 10 1607 之后就有但 Credential Guard 只在企业版、教育版里提供专业版能做的是内存完整性HVCI家庭版建议直接换系统别在这上面耗。我一般先敲一条命令把版本、SKU、架构打出来确认这台上限在哪。# 以管理员身份开 PowerShell 5.1先把系统和 SKU 摸清 $os Get-CimInstance Win32_OperatingSystem [pscustomobject]{ Caption $os.Caption # 例Microsoft Windows 10 企业版 Version $os.Version # 10.0.19045 这类主版本号 Build $os.BuildNumber # 19045 / 22631 Arch $os.OSArchitecture # 只要 64 位 } | Format-ListFormat-List让结果逐行展开比默认的表格更好读。Caption里带“企业版”“专业版”字样直接决定后面 Credential Guard 能不能开Build低于 1607 的版本Win32_DeviceGuard这个 CIM 类可能都不存在脚本查出来全是空值看着像脚本坏了其实是系统太老。第二项是固件类型和安全启动。虚机里没有独立的 DMA 保护硬件VBS 的平台安全要求基本只能靠 Secure Boot 顶着固件是 BIOS 的时候RequirePlatformSecurityFeatures只能填 0一路报错。# 只有 UEFI 固件下才有 SecureBoot 这个 CIM 类BIOS 固件会直接抛异常 try { $sb Confirm-SecureBootUEFI SecureBoot: $sb } catch { 当前不是 UEFI 固件或该命令不可用$($_.Exception.Message) }这条命令在 BIOS 固件上抛的是“Cmdlet not supported on this platform”别把它当成系统坏了。返回True才算过关返回False说明固件是 UEFI 但安全启动被关了去固件设置里打开。第三项是 TPM。Credential Guard 想要拿到 UEFI 锁没有 TPM 2.0 就只能降级运行表现出来就是“已配置但没运行”。查起来很快# TpmVersion 期望 2.0ManufacturerIdTxt 显示 VMW 说明是 VMware 虚拟 TPM Get-Tpm | Select-Object TpmPresent, TpmReady, TpmVersion, ManufacturerIdTxtTpmPresent为 False 就是压根没加设备TpmReady为 False 多半是加了但没初始化。虚拟 TPM 加完之后第一次开机要等它完成初始化别急着马上跑脚本。第四项是 SLAT第二级地址转换HVCI 硬性依赖它# 这三个字段反映的是“暴露给这台虚机”的能力不是宿主的 Get-CimInstance Win32_Processor | Select-Object Name, VirtualizationFirmwareEnabled, SecondLevelAddressTranslationExtensions, VMMonitorModeExtensions注意这些字段在客户机里读出来的是透传结果。VirtualizationFirmwareEnabled为 False说明宿主侧根本没把 VT-x/EPT 放进来改客户机里任何设置都没用得回到虚拟机配置。SecondLevelAddressTranslationExtensions为 False 的话HVCI 开了也起不来。检查项期望值不满足时先改哪边系统版本Win10 1607 / Win1164 位换系统镜像别硬凑固件类型UEFI虚拟机设置里的固件类型安全启动True虚拟机设置或 .vmxTPM2.0 且 Ready虚拟机添加可信平台模块SLATTrue宿主 BIOS 的 VT-x/AMD-V2.2 VMware 侧改 .vmx 比翻菜单更清楚图形界面里这些开关分散在“处理器”“选项 - 高级”“硬件”三处而且改完必须完全关机才生效挂起恢复一律不算。我习惯直接改.vmx一是一屏能看全二是方便留副本做回滚改坏了把备份盖回去就行。# 关闭虚机后编辑 .vmx动手前先复制一份 .vmx.bak vhv.enable TRUE # 把 VT-x/EPT 暴露给客户机嵌套虚拟化的前提 firmware efi # 固件改 UEFIBIOS 下 Secure Boot 无从谈起 uefi.secureBoot.enabled TRUE # 打开安全启动 managedvm.autoAddVTPM software # 添加软件实现的虚拟 TPM 2.0 numvcpus 4 # 至少 2 个 vCPUVBS 起来后单核很难受 memsize 8192 # 内存给到 8G低于 4G 基本跑不动vhv.enable是最关键的一条它决定了客户机能不能看到 VT-x/EPT。这一条不开Get-CimInstance Win32_Processor里那几个虚拟化字段全是 False脚本怎么跑都不达标。注意宿主机的 BIOS 里 VT-x/AMD-V 本身也得开着否则vhv.enable TRUE之后虚机可能直接开不了机报的是处理器虚拟化不可用的错误跟脚本一点关系没有。硬件兼容性版本也值得看一眼。较老的 Workstation 版本对 VBS 和虚拟 TPM 的支持有限常见做法是升到 15.x 之后的版本再折腾手上机器不能动的话换一台做实验比死磕快。2.3 文件保存路径、解压与解除锁定从浏览器下载下来的压缩包会被打上“来自其他计算机”的标记PowerShell 默认会拦未签名脚本加上路径里带中文或者深层空格Set-Location一步就能翻车。我一般固定放在C:\Tools\DGReadiness全英文、无空格、层级浅。# 解压到固定目录并清掉“来自网络”的标记 $dst C:\Tools\DGReadiness New-Item -ItemType Directory -Path $dst -Force | Out-Null Expand-Archive -Path $env:USERPROFILE\Downloads\dgreadiness_v3.6.zip -DestinationPath $dst -Force Get-ChildItem -Path $dst -Recurse -File | Unblock-File Get-ChildItem -Path $dst -Recurse -File | Select-Object FullName, LengthExpand-Archive需要 PowerShell 5.0 以上-Force表示目标已存在时覆盖。Unblock-File干的是删掉Zone.Identifier备用数据流这件事不做这一步后面执行策略怎么配都会报“未对文件进行数字签名”。最后那条Get-ChildItem是给自己看的确认脚本真解到了第一层而不是多套了一个同名目录——多套一层的话后面所有cd和相对路径都得改。3. 首次执行执行策略、-Prepare 与它对系统的实际改动脚本落地之后不要急着敲-Enable。dgreadiness_v3.6 是分阶段来的先把前置条件补齐重启再开功能。跳过中间的重启直接开最容易出现“配置写进去了、运行状态还是 0”的尴尬局面。3.1 执行策略三种处理方式我选影响面最窄的那种先看清现状别上来就全局改# 列出所有作用域的策略LocalMachine 是全局Process 只影响当前窗口 Get-ExecutionPolicy -List常见返回里LocalMachine是RemoteSigned或AllSigned这两种都会拦未签名脚本报错原文是“无法加载文件 … 因为在此系统上禁止运行脚本”。处理方式有三种风险从低到高第一种只改当前进程窗口一关就恢复原样代价最小# 仅在当前 PowerShell 窗口内生效退出即失效 Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass -Force Set-Location C:\Tools\DGReadiness Get-ChildItem -Filter *.ps1 | Unblock-File第二种不改策略直接用一次性参数拉起脚本适合只用跑一次的场景# 用子进程启动本机的 ExecutionPolicy 一个字节都不动 powershell.exe -ExecutionPolicy Bypass -NoProfile -File C:\Tools\DGReadiness\DGReadiness_Tools.ps1 -Prepare-NoProfile跳过用户配置文件避免别人机器上装的模块干扰-ExecutionPolicy Bypass只对这一次子进程有效。第三种是改LocalMachine全局我不推荐除非这台虚机就是一次性实验环境用完直接删。全局改完忘了改回来后面跑别人的脚本会一直踩同一个坑。3.2 先读参数再动手不同小版本的脚本开关名会有出入直接照着网上抄命令是最容易踩的坑之一。先让它自己把参数吐出来# 先把脚本自己支持的参数看清楚再决定敲哪个 Get-Help .\DGReadiness_Tools.ps1 -Detailedv3.6 这个包里常见的几个开关作用大致如下具体以脚本自身输出为准参数作用是否需要重启风险-Audit只检测并输出当前状态不改系统否无第一次必跑-Prepare补齐前置条件注册表、可选组件、引导项是中改引导项-Enable在-Prepare生效后打开具体功能是中高可能影响启动-Disable关闭已启用的功能是低回滚用-Audit这一步别嫌麻烦它输出的就是后面-Enable会去改的那几项先看清楚哪一项是红的能提前判断是环境问题还是功能问题。3.3 -Prepare 动了什么动手前先备份-Prepare会写注册表、开启 Hyper-V 相关可选组件、改bcdedit的引导项。这几处都是重启后才会暴露问题的地方备份成本很低# 动手前把两处关键位置导出出问题能原样导回去 $bak C:\Tools\DGReadiness\backup New-Item -ItemType Directory -Path $bak -Force | Out-Null reg export HKLM\SYSTEM\CurrentControlSet\Control\DeviceGuard $bak\DeviceGuard.reg /y bcdedit /enum {current} $bak\bcd-current.txtreg export的/y表示同名文件直接覆盖不弹确认bcdedit /enum {current}输出当前引导项重定向到文本文件存档回头对比hypervisorlaunchtype有没有被改掉一目了然。然后执行# 只做前置配置这一步不打开任何安全功能 .\DGReadiness_Tools.ps1 -Prepare跑完它会提示需要重启。中间如果打印了某些项“不满足”先别继续回到第 2 章对照表把环境补齐。它改的东西我心里大概有一张对照表脚本报错的时候照着去查比盲猜快得多位置典型值含义DeviceGuard\EnableVirtualizationBasedSecurity1打开 VBS 总开关DeviceGuard\RequirePlatformSecurityFeatures1 或 31 只要 Secure Boot3 加 DMA 保护Scenarios\HypervisorEnforcedCodeIntegrity\Enabled1内存完整性Scenarios\CredentialGuard\LsaCfgFlags1 或 21 是 UEFI 锁2 是不带锁bcdedit hypervisorlaunchtypeauto让虚拟机监控程序随系统启动提示这张表是用来看的不是用来手改的。手工改注册表容易漏掉组件安装和引导项脚本跑出来的状态和注册表对不上比不改还难排查。3.4 第一次重启后先看三处重启完别急着开功能先确认虚拟机监控程序真的起来了# 1) 引导项里 hypervisorlaunchtype 是不是 auto bcdedit /enum {current} | Select-String hypervisorlaunchtype # 2) 虚拟机监控程序有没有真的加载 Get-CimInstance Win32_ComputerSystem | Select-Object HypervisorPresent # 3) 最近的 hypervisor 相关系统日志 Get-WinEvent -FilterHashtable {LogNameSystem; ProviderNameMicrosoft-Windows-Hyper-V-Hypervisor} -MaxEvents 10 -ErrorAction SilentlyContinueHypervisorPresent为True才算真的跑起来了。这一项是False但bcdedit显示auto多半是被别的引导项盖掉或者宿主机那边条件不满足。日志那条命令加了-ErrorAction SilentlyContinue是因为有些精简系统里这个提供程序不存在报错会盖住前面的输出。还有一点容易忽略WSL2、Windows 沙盒这类功能也会占用 hypervisor。虚机里同时开着它们VBS 的状态表现会变得很怪排查前先确认有没有别的功能在抢。4. 打开与回滚-Enable、策略优先级和两条回滚命令环境齐了、-Prepare也重启过了这时候才轮到打开功能。这一步最忌讳的是“先开再说”开完发现驱动不兼容想退回去还得再来一轮重启。4.1 审计和启用的先后顺序# 第一次先审计任何东西都不改 .\DGReadiness_Tools.ps1 -Audit # 输出里没有硬性阻塞项再启用 .\DGReadiness_Tools.ps1 -Enable-Audit的输出重点是“哪些属性不可用”比如 Secure Boot 为 0、SLAT 不支持、TPM 缺失这些是硬性阻塞改脚本参数解决不了。-Enable是在这些属性都满足的前提下把功能打开它不会替你补环境。4.2 两种组合只开 HVCI 和连 Credential Guard 一起开功能不是非得全开组合不同对环境和副作用的要求也不一样组合适用场景需要 TPM主要副作用仅 HVCI专业版验证驱动兼容性否部分老驱动被拦HVCI Credential Guard企业版/教育版验证凭据保护是内存占用明显上升仅 Credential Guard少见一般不单独开是依赖 HVCI 的部分能力缺失Credential Guard 的LsaCfgFlags有两种取值1 是带 UEFI 锁需要 TPM2 是不带锁。带锁更安全但要求 TPM 2.0 且安全启动正常不带锁在虚机里更容易跑通代价是保护强度打折。测试环境里我一般先用 2 把流程跑通再切 1 验证完整链路两步分开做出问题能立刻判断是哪一环。4.3 策略和脚本谁说了算如果这台虚机加过域或者本地配过组策略脚本改的注册表可能刚写完就被刷回去。判断方法很直接# Policies 分支存在且值不为空说明有策略在管脚本改了也会被覆盖 reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\DeviceGuard /s有输出就别跟脚本较劲了策略优先级高于本地注册表改策略或者把机器移出策略作用范围才是正解。这条坑我踩过一次来回跑了三遍-Enable状态一直是“已配置未运行”最后发现是策略每 90 分钟刷一次。4.4 回滚两条命令都得做这是我最想强调的一段也是很多人以为“关掉就行”的地方# 第一步关掉 VBS/HVCI/Credential Guard 这些功能本身 .\DGReadiness_Tools.ps1 -Disable # 第二步把虚拟机监控程序从引导项里摘掉性能才会真正回来 bcdedit /set hypervisorlaunchtype off只做第一步功能是关了但 hypervisor 还在跑虚机性能依然是掉的状态表现为“明明关了还是卡”。两条都做完再重启才回到干净状态。如果虚机已经卡到进不去系统就在恢复环境里挂载系统盘执行bcdedit /set hypervisorlaunchtype off或者用备份的.vmx和注册表文件还原。5. 避坑与排查五条踩过的坑按现象对号入座这一章是我自己踩过、也帮别人排查过的记录按“现象 → 原因 → 解决”写遇到问题时可以直接对号入座。5.1 脚本跑不起来的三类报错现象一双击或者执行脚本红字“无法加载文件 … 因为在此系统上禁止运行脚本”脚本一行都没跑。原因执行策略是RemoteSigned或AllSigned脚本没有有效签名被 PowerShell 在执行前就拦掉了。解决按 3.1 里的第一种方式处理Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass加Unblock-File。注意Unblock-File只对“从网络下载”标记有效如果文件是别人用 U 盘拷过来的这一步没用还是得靠进程级策略。现象二执行后报“无法识别参数”或者参数补全里压根没有-Enable。原因网上抄的命令来自别的版本v3.6 里的开关名和旧版本有出入直接照抄必然失败。解决先Get-Help .\DGReadiness_Tools.ps1 -Detailed看脚本自己列的参数。这一步花 10 秒能省半小时。现象三脚本跑到一半退出窗口一闪而过什么都没留下。原因多是从资源管理器里右键“使用 PowerShell 运行”触发的窗口执行完自动关闭错误信息跟着一起消失。解决手动开一个管理员 PowerShellcd到脚本目录再执行或者加-NoExit参数保持窗口。想留痕就接一个Start-Transcript# 把整段执行过程完整记录到文件方便事后翻 Start-Transcript -Path C:\Tools\DGReadiness\run-$(Get-Date -f yyyyMMdd-HHmm).log .\DGReadiness_Tools.ps1 -Prepare Stop-TranscriptStart-Transcript记录的是当前会话所有输出文件名带时间戳避免覆盖。排查时这份日志比记忆靠谱得多。5.2 重启之后系统不对劲的四类现象现象四-Prepare重启后虚机卡在徽标转圈或者干脆蓝屏进不去系统安全模式能进。原因hypervisorlaunchtype被设成auto但宿主侧没把 VT-x/EPT 透传进来或者宿主机 BIOS 里虚拟化没开hypervisor 起不来又占着引导位置。解决进恢复环境或者安全模式执行bcdedit /set hypervisorlaunchtype off先让系统能起来再回到 2.2 检查vhv.enable和宿主机 BIOS 设置。顺序千万别反先救系统再查配置。现象五-Prepare输出里 Secure Boot 相关项一直是 0RequirePlatformSecurityFeatures写不进去。原因虚机固件还是 BIOS或者.vmx里firmware efi写了但没关机重启生效。另外从 BIOS 改成 UEFI 之后原来按 Legacy 方式装的系统可能引导不起来这是另一码事。解决改固件类型前先确认系统是按 UEFI 方式装的不确定就先在干净虚机上试。改完进固件设置界面确认 Secure Boot 是 Enabled 状态再跑Confirm-SecureBootUEFI验证。现象六状态显示“已配置”但运行状态一直是 0SecurityServicesConfigured是 1、SecurityServicesRunning是 0。原因Credential Guard 缺少 TPM 或者 UEFI 锁功能配置写进去了但起不来。HVCI 则是缺 SLAT 或者 Secure Boot。解决先Get-Tpm确认 TPM 在位且 Ready没有就加虚拟 TPM 再重启加了 TPM 还是 0就检查是不是LsaCfgFlags设成了 1 但安全启动没开。这种情况脚本不会主动告诉你缺哪一项只能一项项对。现象七功能全开之后虚机里某个设备管理器里的设备带感叹号或者某个老软件直接打不开。原因HVCI 打开了代码完整性策略不兼容的内核驱动会被拦下来系统不会弹窗告诉你只会静默拒绝加载。解决查事件查看器里Microsoft-Windows-CodeIntegrity的事件常见的是驱动签名不符合要求。要么升级驱动要么在测试环境里先只开 Credential Guard 不开 HVCI把兼容性问题单独隔离出来看。6. 装完怎么验收三条命令确认它真的在跑装完最怕的是“脚本说成功了实际没生效”。我验收只认三样东西CIM 类里的字段、msinfo32 里的那一行、以及重启后状态能不能保持住。第一条最可靠能拿到具体数值# 一次把关键字段全取出来重启前后各跑一次对比 $dg Get-CimInstance -ClassName Win32_DeviceGuard -Namespace root\Microsoft\Windows\DeviceGuard $dg | Select-Object VirtualizationBasedSecurityStatus, SecurityServicesConfigured, SecurityServicesRunning, CodeIntegrityPolicyEnforcementStatus, AvailableSecurityProperties | Format-ListVirtualizationBasedSecurityStatus是 0/1/2分别对应未启用、已启用未运行、正在运行只有 2 才算真跑起来。SecurityServicesRunning是位掩码1 代表 Credential Guard2 代表 HVCI3 代表两个都在跑这个字段最诚实配置写得再漂亮它不认就是不认。AvailableSecurityProperties也是位掩码1 表示支持 HVCI、2 表示 Secure Boot 已开两者都对上才说明平台能力齐了。光看数字还不够再开一次msinfo32找“基于虚拟化的安全性”那一行正常应该显示“正在运行”下面还会列出已运行的服务。这一行和上面命令的结果对不上时以命令为准图形界面偶尔会有刷新延迟。字段期望值不达标先查什么VirtualizationBasedSecurityStatus2引导项、宿主 VT-xSecurityServicesRunning3两个都开或 2TPM、Secure BootSecurityServicesConfigured与 Running 一致组策略覆盖CodeIntegrityPolicyEnforcementStatus1驱动兼容性AvailableSecurityProperties含 1 和 2固件、SLAT最后一步是“保持住”。重启两次再跑一遍上面的命令如果第二次掉回 1 或者 0说明有东西在开机时把它改回去了多半是组策略或者某个安全软件在干预。提示验收不要只看一次结果。VBS 这类功能在开机早期才完成初始化跑完命令马上就查有时候会看到还没起来的状态等一两分钟再查更稳。从那以后我每次装完这套脚本验收不看自己的记忆也不信“最后一次操作成功”的提示只跑一遍这个 CIM 查询把五个字段抄进变更记录里重启两次再对一遍。血泪经验是虚拟化运行状态这东西看起来是个开关实际是固件、宿主、客户机、策略四层咬合的结果任何一层松动都会让前面的功夫白费。希望帮到你。本文还有配套的精品资源点击获取
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →