【问题标题】:Set that a program has to run at startup from an installer设置程序必须在启动时从安装程序运行
【发布时间】:2023-04-01 00:01:01
【问题描述】:

我有一个 C# .net 4 应用程序,我正在开始创建安装程序。

已安装的程序运行良好,但我的客户希望应用程序以窗口开头(它是一个“始终位于顶部”的工具栏,可帮助他们管理呼叫)。

我想创建一个“类安装程序”,并在其中插入一个注册表项。

我有两个问题:

首先:如何找到可执行路径?它可以在安装之间更改。我在某个地方找到了 Application.ExecutablePath,但它似乎位于 Application.Window.Forms 中,所以我认为它与 WPF 不兼容

第二:我需要在本地机器的注册表中插入这个键。 Windows 安装程序中有没有办法指定用户必须具有管理员权限?

这是我开始的代码:

RegistryKey rkApp = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
rkApp.SetValue("CstStart", ???);

非常感谢您的帮助!

编辑:我发现我可以将一些数据传递给我的自定义操作:

/DIR="[TARGETDIR]\"

在 CustomActionData 中。

通常说我可以通过

this.Context.Parameters["DIR"];

但是....在我的安装程序类中,this.Context 似乎为空:(

EDIT2:上下文为空,因为我在构造函数中执行此操作,我现在正在执行此操作,如果 this.AfterInstall 现在我得到一个上下文,它似乎包含一个 var "assemblypath",其中包含完全我需要的路径。

【问题讨论】:

  • 您正在编写自己的安装程序吗?不要,安装项目可以毫无问题地做到这一点。
  • 完全没有,我正在使用 Visual Studio 安装程序。但我正在做一个“类安装程序”,它是一个自定义操作,应该由 Visual Studio 安装程序执行。你知道如何在没有自定义类的情况下向注册表添加一个条目吗?我很高兴知道如何:):)

标签: c# visual-studio installation registry startup


【解决方案1】:

我的假设是您正在从 安装项目 在这里工作.....

做到这一点的一种方法 - 我并不是说它是最好的,但它可能是最简单的 - 是执行以下操作:

在“文件系统”选项卡中,右键单击“目标机器上的文件系统”、“添加特殊文件夹”、“用户的启动文件夹”,这样的文件夹就会出现在列表中。接下来,获取项目输出的快捷方式(通过右键单击)并将该快捷方式拖到 Startup 文件夹中。

最后,由于您希望所有用户都使用此功能,请进入部署项目属性并将“InstallAllUsers”设置为 true。

现在,这种方法有一个警告,即应用程序不会在 Windows 启动时启动,而是在有人登录时启动。根据您对项目(UI 应用)的评价,这可能没问题。

如果您真的想破解注册表,您可以考虑创建一个自定义操作 dll。这是您可以编写几乎您喜欢的任何东西的地方,并且在安装过程结束时,安装程​​序将调用您的 dll,以便您可以做自己的事情。您可以将可执行文件的路径作为参数传递到 dll 中(您可以从安装程序对话框中获取,而不是从任何对象获取)。我不会详细介绍这个,因为网上肯定有很多关于这个的内容。

您应该知道,您可以传递到 dll 中的信息量是有限的 - 如果内存可用,可能低至 256 个字符。您可能只接受一条路径就可以了,但是当您开始做更多事情时......

关于检测用户是否是本地管理员,这有点棘手,如果只是因为自定义操作 dll 在安装结束时而不是在开始时运行 - 所以你可以编写代码来找出当前用户所在的组,但是您可能在该代码运行之前就被炸毁了。我不相信 - 至少在 Microsoft 安装项目中 - 有可能知道这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-06
    • 2011-03-11
    相关资源
    最近更新 更多