vb.net - 程序组上下文菜单项丢失

标签 vb.net windows-installer

我有一个带有设置/安装程序项目(VB.NET 4.5 和 Windows Installer 4.5)的 Visual Studio 2013 Windows 窗体解决方案。

我让安装程序添加了“开始程序”文件夹和项目,即“开始/所有程序/我的公司/应用程序名称”。

安装程序的工作原理与广告中的差不多,只是上下文菜单没有显示我希望看到的几个项目。

左侧是一个“普通”程序项上下文菜单(例如 Skype),右侧是我的应用程序的上下文菜单:

Context menu comparison

请注意,缺少“以管理员身份运行”、“打开文件位置”、“固定到开始菜单”等。

我进一步观察,如果我比较每个程序菜单项的属性,我会发现 Skype 的目标是一个明确的“.exe”,而我自己的目标是我期望的整个程序组(Skype 在左侧,我的右侧的应用程序):

Properties comparison

另请注意,我无法编辑目标。

现在,如果我手动将应用程序的“.exe”添加到程序组,属性和上下文菜单将与 Skype 的显示相同:

Exe Properties and context

然后我检查了安装程序项目的文件系统设置中的 Windows Installer 快捷方式设置。据我所知,它只允许我创建解决方案主输出的快捷方式,而我无法显式快捷地创建 KeyOutput“.exe”。

有人能解释一下吗?我是否遗漏了一些明显的东西?

更新:为了澄清我的需要,我希望安装程序按照 Skype 示例创建一个程序菜单项快捷方式,并具有所有相同的上下文菜单选项。

更新:使用 Orca 进行 Stein 建议的 MSI 更改后,验证失败并出现几个错误:

ICE43 错误组件“C__667B7EAE74690565610625BA20DE4CEE”具有未公布的快捷方式。它应该使用 HKCU 下的注册表项作为其 KeyPath,而不是文件。 ICE57错误组件“C__667B7EAE74690565610625BA20DE4CEE”同时具有每用户和每机器数据以及每机器KeyPath。

(还有一个与手动更改无关的附加警告:

ICE90 警告快捷方式“_2B5AE78F623048DC8EDAB2174FC1AB82”有一个属于公共(public)属性(全部大写)的目录,并且位于用户配置文件目录下。如果 ALLUSERS 属性的值在 UI 序列中发生更改,则会导致出现问题。

可以通过进一步手动更改 key 以包含小写字母(例如 _2b5AE78 ...)来解决此问题

不幸的是,我发现当经常使用修改后的 MSI 时,程序组实际上根本没有创建。最初,它似乎有效,但后来却不起作用。因此,我恢复了未修改的 MSI,只是解决了上下文问题,因为它确实不值得这么痛苦。

最佳答案

您所描述的是广告快捷方式标准快捷方式 ( a lot of info on MSI shortcuts )。广告中的快捷方式是 Windows Installer 功能 - 它们是唯一的,因为它们实际上指向产品功能(MSI 包中的功能),而不是直接指向文件。因此,我认为为处理快捷方式文件(*.lnk 文件)而设置的 shell 扩展以不同的方式处理它们。

从广义上讲:广告快捷方式是 MSI 的“按需安装”功能的核心,并且还会触发调用时的 MSI key 路径检查(安装完整性检查) - 这可能会触发自启动如果有问题的产品安装不正确,请进行修复。

*.lnk 文件的 shell 处理 定义于:HKEY_CLASSES_ROOT\.lnk\

按住SHIFT,然后右键单击广告的快捷方式应该会弹出更多选项 - 例如以管理员身份运行。我认为是 shell 本身 (%SystemRoot%\system32\shell32.dll) 处理 *.lnk 文件

从您提供的描述中我们无法真正判断您需要什么。也许您只需要以管理员身份运行选项?也许不是,但如果你这样做,我想有几个选择:

  1. 只需使用常规快捷方式(将 WiX 项目Shortcut element广告属性设置为“” )。安装后,这应该会显示快捷方式的“正常”上下文菜单。

  2. 依靠上面描述的SHIFT + 鼠标右键单击来在需要时显示以管理员身份运行 - 如果这样就是你所追求的。

    • 这实际上显示了通常隐藏的菜单项,并在注册表本身中标记为“扩展”,或者在已编译的 shell 扩展处理程序的代码库中标记为“扩展”。
    • 您可以添加自己的 shell 扩展菜单,只需触发命令行 - 无需编译 shell 扩展处理程序。您甚至可以添加子菜单(级联)并将其设置为仅在 SHIFT + 右键单击(以及各种其他选项)上显示。题外话,只是想提一下。
  3. 如果您始终需要管理员权限,我想您可以通过应用程序 list 请求管理员权限?一般来说现在非常不受欢迎,但有可能:How do I force my .NET application to run as administrator?

    • 此提升权限适用于管理员,但不适用于普通用户(非管理员用户) - 他们无法提升至管理员权限。
    • 普通用户需要输入管理员凭据(针对管理员帐户)才能以管理员权限运行。

要对已编译的 MSI 进行后处理以禁用公布的快捷方式:

  1. 使用 Orca 打开 MSI ( or another capable tool )。
  2. 在文件表中,从第一列获取文件 ID。例如类似_55E33B8404377A30ACD2C521F357BF91
  3. 在“快捷方式”表中,将“目标”字段设置为:[!_55E33B8404377A30ACD2C521F357BF91]。
  4. 保存并测试安装。

关于vb.net - 程序组上下文菜单项丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49119319/

相关文章:

windows - 将 cloudbase-init msi 包安装到已安装的 vhd 文件上

java - 使用 Windows 安装程序分发 Java Web 应用程序

.net - Visual Studio Launch 2010 时间的最佳利用

c# - .NET 中的多线程绘图?

vb.net - 将 xml 数据加载到 Ultragrid 中

vb.net - 如何拆分逗号分隔的字符串?

asp.net - Datapager 控制每 5 秒自动换页

WIX CustomAction - 如何在安装/日志中获取更多信息

installation - Wix如何隐藏功能选项

scripting - Powershell:使用动态创建的参数运行msiexec