You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WiX安装器MSI修复失败:报错0x80070534无法获取账户SID

问题分析与解决方案

核心问题

修复时MSI未正确保留带域名的账户属性值,导致PermissionEx仅获取到纯用户名,无法解析对应的SID(错误码0x80070534即账户名无效)。本质是非持久化属性在维护模式(修复/修改)下会丢失原有值,即便其他属性默认值能被覆盖,自定义传入的账户属性若未标记持久化,修复时会被重置或截断。

具体解决步骤

  1. 标记账户属性为持久化+安全属性
    WiX中,只有标记PERSIST="yes"的属性会在维护模式中保留值,同时Secure="yes"确保属性能跨UI进程和MSI服务端进程传递。示例:

    <Property Id="TARGET_ACCOUNT" PERSIST="yes" Secure="yes" />
    

    修复时可检查MSI日志中的PROPERTY CHANGE条目,确认该属性是否完整保留Domain\Username格式的值。

  2. 拆分Domain与Username属性传递
    放弃直接传入Domain\Username组合字符串,改为拆分存储两个持久化属性,分别绑定到PermissionEx的Domain和User属性:

    <Property Id="ACCOUNT_DOMAIN" PERSIST="yes" Secure="yes" />
    <Property Id="ACCOUNT_USER" PERSIST="yes" Secure="yes" />
    
    <util:PermissionEx Domain="[ACCOUNT_DOMAIN]" User="[ACCOUNT_USER]" GenericRead="yes" GenericWrite="yes" />
    

    在WPF UI中,将用户输入的账户字符串按\拆分,分别赋值给ACCOUNT_DOMAIN和ACCOUNT_USER。本地账户可将Domain设为.或机器名,避免修复时域名丢失。

  3. 确保维护模式下UI正确传递属性
    修复时WPF UI需读取MSI中已持久化的账户属性值,而非重新要求用户输入(或默认空值)。可通过MSI的MsiGetProperty接口获取原有属性值,在UI加载时填充,保证修复时传递的账户信息与安装时一致。

  4. 排查本地账户解析问题
    若为本地账户,安装时使用MachineName\Username格式,修复时若仅传递纯用户名,MSI可能无法正确解析为本地账户(默认优先查找域账户)。拆分Domain和Username后,明确指定Domain为本地机器名或.,可避免此问题。

内容的提问来源于stack exchange,提问作者Shaggie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 02:06:16