Skip to content

fix(install): 提前诊断 PowerShell 受限语言模式 - #1536

Open
haofeng0705 wants to merge 3 commits into
mainfrom
fix/650-powershell-language-mode-preflight
Open

haofeng0705 wants to merge 3 commits into
mainfrom
fix/650-powershell-language-mode-preflight

Conversation

@haofeng0705

@haofeng0705 haofeng0705 commented Oct 20, 2026 •

Copy link
Copy Markdown
Collaborator

Refs #650

Summary

  • install.ps1 和 install-devapp.ps1 要求 FullLanguage,在初始化、构造注册表、下载或修改安装内容之前检查报告的语言模式。其他模式通过 throw 给出明确诊断,保留已有的 irm | iex 调用方终端;未捕获异常时返回非零退出码。
  • 移除 GetTempPath() 方法探针。单次 .NET 方法调用成功不能证明后续 [pscustomobject] 等安装操作可用;预检也不使用可能污染转换缓存的 [pscustomobject] 探针。
  • 明确选择:WDAC 审计策略下只要报告 ConstrainedLanguage,同样提前停止。 这收紧了原方案的支持范围,不再承诺通过探针保留审计模式的安装行为,也不将审计策略误称为强制限制。
  • 同步中英文 Windows 安装说明、devapp 指南和发布 fragment;在现有回归中增加“报告受限模式,但方法调用仍可用”的两个模拟场景,分别覆盖保留调用方和未捕获时非零退出。两份脚本共 10 个场景。

原问题的安装脚本在下载阶段调用 System.IO.Path.GetTempPath() 时失败;后续版本的脚本更早在 [pscustomobject] 注册表初始化阶段失败。预检必须放在文件顶部。

本 PR 改善诊断与停止行为,不提供完整的 ConstrainedLanguage 安装支持,不改变 ExecutionPolicy 或应用控制策略。

Risk tier

  • Documentation-only
  • Standard
  • High-risk: Windows installer preflight behavior.

部分 WDAC 审计环境原本可能继续安装,现在只要报告非 FullLanguage 就会停止。脚本明确要求受支持的语言模式;受管设备使用 IT 批准的分发流程,npm/手动安装仍以组织策略允许为条件。

仅涉及 7 个文件;不改变下载校验、技能事务、缓存 ACL、命令接口或工作流。

Verification

  • Release fragment:.changes/650-powershell-language-mode.md。
  • 本次补丁与审阅过的候选补丁逐字节一致;Go 文件已格式化,补丁可应用检查通过。
  • 本次评审修订未运行测试、policy、构建或安装。 新增模拟场景尚未执行。
  • Windows PowerShell 5.1、Windows pwsh、真实 WDAC 强制及审计策略:未验证。
  • 全套本地测试、打包及 package-manager 验证:未执行。
  • Release-seal、generated drift、command-surface:N/A,未修改对应输入或 CHANGELOG.md。

旧提交 6bb71a54627f798db1c3ffb041003c366aedbfe2 的 6 个预检场景及 10 项定向 PowerShell 回归曾在 macOS pwsh 7.6.7 上通过;这些历史结果不能作为本次修订通过的证据。

新增用例在 FullLanguage 引擎里替换预检读取的模式值,先确认 GetTempPath() 可成功,再检查安装器仍提前拒绝。它用于覆盖原探针会错误放行的分支,不代表真实 WDAC 策略验证。

Notes

替代安装方式也可能被组织应用控制阻止。文档不建议关闭安全策略;若需要支持报告 ConstrainedLanguage 的审计环境,应另行取得原生 Windows 策略证据并设计可靠方案。

相关上游问题:PowerShell #20768、PowerShell #28128。

@haofeng0705 haofeng0705 added the ai-generated Pull request contains AI-generated code and must pass AI behavior policy label Oct 20, 2026
@haofeng0705 haofeng0705 removed the ai-generated Pull request contains AI-generated code and must pass AI behavior policy label Oct 20, 2026

@typefield typefield left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review

结论:Request changes。CLM 的下载/写入前中止和 throw 保留调用方行为做得正确;PowerShell 5.1 使用的语法本身也没有明显兼容性问题。但 WDAC 审计模式的关键语义目前没有被可靠验证。

[高风险] GetTempPath() 不能可靠区分审计模式和真正受限模式

涉及 scripts/install.ps1:32-36 和 scripts/install-devapp.ps1:17-21。

这里用 [System.IO.Path]::GetTempPath() 的成功/失败来决定是否放行非 FullLanguage。但 PowerShell 的 WDAC audit-only 行为存在已知例外:会报告 ConstrainedLanguage,同时某些操作看起来像 FullLanguage,而 [pscustomobject] 仍可能失败(PowerShell/PowerShell#20768)。主安装脚本在 scripts/install.ps1:73 就会执行第一个 [pscustomobject]。

因此当前逻辑存在两种未覆盖结果:

  • 审计模式允许 GetTempPath():预检放行,随后仍可能在 [pscustomobject] 处失败,达不到“下载/写入前中止”;
  • 审计模式也拒绝该方法调用:预检会把本应可继续的审计模式误判为强制 CLM。

新增测试只是在 pwsh 中手动设置 LanguageMode = ConstrainedLanguage,不能区分这两种真实 WDAC audit 行为。请在 Windows PowerShell 5.1 和实际 WDAC audit policy 上验证,并明确选择/实现预期行为;不要直接用 [pscustomobject] 作为探针,因为已知 CLM 失败可能污染进程级转换缓存。

其它方面:预检位置正确,throw 在 irm | iex 中不会关闭调用方,未捕获执行也返回非零,新增测试覆盖了这些路径。

Refs #650

Reject other reported modes before installer initialization, including WDAC
audit reports. Update documentation and add simulated audit-report cases.
@github-actions
github-actions Bot requested a review from typefield October 21, 2026 07:37

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants