如何在 WiX 中启动 PowerShell 并正确访问 Windows 注册表?

2024-06-19

Update

有趣的是,如果我运行 32 位 powershell 来运行脚本,它会给我同样的错误。看起来32位powershell无法访问64位注册表树?我尝试使用WixQuietExec64但它给出了同样的错误。我还尝试提供 powershell 的完整路径(C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe)以确保安装程序启动 64 位版本,但这仍然给出相同的错误...看起来这可能是由于 MSI 安装程序本身是 32 位造成的?

MSI (s) (4C:C0) [14:25:49:955]: Hello, I'm your 32bit Elevated Non-remapped custom action server.

原帖

我有以下内容test.ps1 script:

$exchangeroot = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ExchangeServer\"
$allexchanges = Get-ChildItem -Path Registry::$exchangeroot -Name | Where-Object { $_ -match "^V.." }
$sorted = $allexchanges | Sort-Object -descending
If ($sorted.Count -gt 1) { $latest = $sorted[0] } Else { $latest = $sorted }
$setup = $exchangeroot + $latest + "\Setup"
$properties = Get-ItemProperty -Path Registry::$setup
$properties

在普通 PowerShell 窗口中运行脚本会产生以下输出:

PS C:\Program Files (x86)\TrustValidator Exchange Server Plugin> .\test.ps1

Required machine-level settings.          : 1
Services                                  : C:\Program Files\Microsoft\Exchange Server\V15
NewestBuild                               : 10845
CurrentBuild                              : 710737954
Information Store Service                 : 1
Messaging and Collaboration Event Logging : 1
MsiInstallPath                            : C:\Program Files\Microsoft\Exchange Server\V15\
...

所以它有效。现在从 WiX 安装程序启动 PowerShell 并执行脚本,它不会生成相同的结果:

WixQuietExec:  Get-ItemProperty : Cannot find path 
WixQuietExec:  'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ExchangeServer\v15\Setup' because it 
WixQuietExec:  does not exist.
WixQuietExec:  At C:\Program Files (x86)\TrustValidator Exchange Server Plugin\test.ps1:10 
WixQuietExec:  char:16
WixQuietExec:  +     $properties = Get-ItemProperty -Path Registry::$setup
WixQuietExec:  +                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
WixQuietExec:      + CategoryInfo          : ObjectNotFound: (HKEY_LOCAL_MACH...erver\v15\Set 
WixQuietExec:     up:String) , ItemNotFoundException
WixQuietExec:      + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetIt 
WixQuietExec:     emPropertyCommand

现在,如果我们观察错误消息,就好像它可以访问树,直到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ExchangeServer\,因为我的脚本会搜索并列出所有版本,所以v15到那时为止必须是可访问的,但是当它试图更深入地获取ItemProperty,不能。

这让我相信,也许我在从 WiX 安装程序启动 PowerShell 时遗漏了一些东西......?

这是我的 wxs 文件中的内容:

<SetProperty Id="InstallPlugin"
     Before ="InstallPlugin"
     Sequence="execute"
     Value ="&quot;powershell.exe&quot; -Command &quot;cd '[INSTALLFOLDER]'; &amp; '[#TestPS1]' ; exit $$($Error.Count)&quot;" />
<CustomAction Id="InstallPlugin" BinaryKey="WixCA" DllEntry="WixQuietExec" Execute="deferred" Return="ignore" Impersonate="no" />

以下是我已经尝试过或仔细检查过的项目列表:

  • 我尝试过不同的组合-NoProfile, -ExecutionPolicy ByPass, -Version 2.0还是不行。
  • 我已经运行安装程序InstallPrivileges="elevated"
  • 我已经在运行了CustomAction as Execute="deferred" and Impersonate="no"
  • 我尝试过AdminImage="yes"
  • 我尝试过设置<Property Id="MSIUSEREALADMINDETECTION" Value="1" />

任何其他线索将不胜感激。 :(


我的天啊...

好吧,我终于成功了。实际上存在几个问题,这些问题的解决方案实际上是我从多个 SO 问题中收集的零碎信息。

回顾一下,这就是我试图做的:

  1. 从 WiX 启动 powershell 来运行我的安装脚本。
  2. 我的脚本搜索 Windows 注册表(需要 64 位)以获取已安装的 Exchange Server 的位置
  3. 我的脚本从安装位置加载 Exchange Management Shell (EMS) 脚本(需要 64 位和正确的用户)
  4. 在 EMS 会话下,我的脚本运行其他脚本的早午餐来注册 Exchange 插件

问题1)

无论我做什么,WiX 安装程序总是以 32 位启动我的 powershell,这与设置无关Platform="x64", Win64="yes", 乃至WixQuietExec64。我什至在 Visual Studio 中构建了安装程序x64 and 其他一切 as x64.

解决办法就是直接引用sysnativepowershell,它必须是sysnative in the SetProperty.

C:\Windows\sysnative\WindowsPowerShell\v1.0\powershell.exe

实际上我之前确实尝试过这个,并认为它不起作用,但根本原因被下面的问题 2 掩盖了。

问题2)

在我读过的所有地方,他们都说你需要与Execute="deferred" Impersonate="No"。我相信,如果你不做任何时髦的事情,这确实适用于大多数情况。但是,我had to Impersonate。我发现 WiX 安装程序会以用户权限提升的方式运行您的 CANT Authority/System。这把我搞砸了,因为Exchange Management Shell我试图获取的脚本基本上会使用您的凭据并尝试与 Exchange Server 建立会话...当然您无法连接为NT Authority/System!

解决方案是使用Impersonate="yes"这样 WiX 安装程序就会以您当前登录的用户身份运行您的 CA。我一直有这样的印象:您必须使用Impersonate="no"使用时Execute="deferred"... 但你不.

我放弃了几天的故障排除,然后又回到它并开始工作。帮助我解决这个问题的两个最有用的命令实际上是:

  • whoami
  • Get-ChildItem env:(检查 PROCESSOR_ARCHITECTURE)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 WiX 中启动 PowerShell 并正确访问 Windows 注册表? 的相关文章

  • Powershell 3.0 - 工作流程 - 限制并行执行数量

    我正在从模板克隆 ESX 服务器上的虚拟机 简化的代码如下所示 Workflow Create VM List 1 500 foreach parallel Elem in List Create VM Configure created
  • 使用 powershell 从 tfs 获取项目的最新版本

    我正在尝试使用 powershell 自动化我们的日常开发人员任务 我的 powershell 脚本已经完成一半了 我想从 TFS 获取特定项目的最新版本 开发人员将可以访问 TFS 中的多个项目 在这些项目中 特定项目下的文件需要更新 我
  • 无法使用 cd 前进

    我在使用 PowerShell 前进时遇到问题 我可以向上移动目录 但不能向下移动 情况是这样的 我打开 PowerShell 并输入 pwd 命令 它显示我当前处于PS C Users Robert Inspiron14 gt 我输入命令
  • Powershell 活动目录属性

    我正在尝试查找活动目录的属性 strFilter objectCategory User objDomain New Object System DirectoryServices DirectoryEntry objSearcher Ne
  • 具有默认值的参数不在 PsBoundParameters 中?

    通用代码 考虑这段代码 PS gt function Test param p default value PsBoundParameters PS gt Test some value Key Value p some value PS
  • 如何通过 Get-AzureRmAppServicePlan 检索workerSize

    通过 Azure PowerShell cmdlet 创建新的 AppServicePlan 时New AzureRmAppServicePlan 预计我会添加一个WorkerSize例如小号 中号或大号 例如 appServicePlan
  • 域用户的AD密码有效期

    我正在使用以下命令从其他域获取用户信息 并且我成功获取了该数据 如何添加过滤器以获取以下查询中用户的密码到期日期 获取 ADuser 用户名 服务器 abc com 这不是超级简单 你必须计算它 Get ADUser username se
  • 如何使用 PowerShell 检查文件是否早于特定时间?

    我怎样才能办理登机手续电源外壳查看 fullPath 中的文件是否早于 5 天 10 小时 5 分钟 老 我的意思是如果创建或修改不晚于 5 天 10 小时 5 分钟 这是一种非常简洁但易读的方法 lastWrite get item fu
  • 如何解析 Powershell 脚本块中的变量

    鉴于我有 a world b write host hello a 如何获取脚本块的解析文本 它应该是包括 write host 的 entre 字符串 write host hello world 更新 补充说明 如果你只是打印 b你得到
  • 使用 ICACLS 将文件权限设置为“只读”[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我很难从简单 直观的方式转变过来chmod 400尝试在 Windows 命令提示符中执行相同的操作ICACLS 与 UNIX LINUX
  • Powershell 将字符串转换为 System.Net.IPAddress

    我是 powershell 新手 我正在尝试自动创建 DHCP 预留 到目前为止 我可以像这样获取 IP 地址 IP GEt VM ComputerName HVCOMPUTERNAME VMName HVNAME Get VMNetwor
  • 在 Powershell 中获取小文件的“磁盘大小”

    我正在使用一个遗留系统 该系统有大量来自外部系统的导入 其中大多数通过下载文件 根据上下文大小不同 处理它 然后将文件存储在 SAN 卷上的其他位置 格式为 NTFS 和安装在 WS2008R2 盒子上 我们遇到的问题是 由于簇的大小 大量
  • 在 PowerShell 中提示用户输入

    我想提示用户进行一系列输入 包括密码和文件名 我有一个使用的例子host ui prompt 这似乎很合理 但我无法理解回报 有没有更好的方法在 PowerShell 中获取用户输入 Read Host http technet micro
  • 将文件夹中所有文本文件中与模式匹配的行提取到单个输出文件

    我试图提取文件夹中所有文件中以 开头的每一行 然后将这些行复制到单独的文本文件中 目前在 PowerShell 代码中使用此代码 但我没有得到任何结果 files Get ChildItem folder Filter txt foreac
  • Powershell:别名和函数有什么区别?

    Im setting up my powershell profile to create aliases of commonly used commands On Microsoft s documentation https learn
  • 从 Python 执行 PowerShell 脚本的最佳方式是什么

    之前关于该主题的所有帖子都涉及其用例的具体挑战 我认为 如果有一篇文章只讨论从 Python 运行 PowerShell 脚本的最简洁方法 并询问是否有人有比我发现的更好的解决方案 那将会很有用 绕过 PowerShell 尝试以与预期不同
  • Windows 安装程序 (C#) 错误代码 2869

    我在 VS 2005 中有一个项目 其中有一个控制台应用程序和一个与安装该应用程序关联的安装项目 我在控制台应用程序中还有一个安装程序类 安装项目将使用它在安装前进行一些验证 这些任务正在检查数据库连接字符串并检查某些目录位置以确保它们在安
  • 在Powershell中显示目录结构及其大小

    尝试使用 dir 命令来显示子文件夹和文件的大小 在谷歌搜索 powershell目录大小 后 我发现了两个有用的链接 确定文件夹的大小http technet microsoft com en us library ff730945 as
  • 我怎么知道PowerShell函数参数被省略了

    考虑这样的函数 function Test foo bar 我们可以称之为 Test foo null Test 我如何知道何时省略了 foo 以及何时为 null 如果您使用的是 Powershell V2 或更高版本 则可以使用 PSB
  • 在客户端系统中安装后桌面应用程序无法打开

    我目前正在使用 Visual Studio 2017 和 4 6 1 net 框架 我为桌面应用程序创建了安装文件 安装程序在我的系统中完美安装并运行 问题是安装程序在其他计算机上成功安装 但应用程序无法打开 edit 在客户端系统中下载了

随机推荐