设置程序必须在启动时从安装程序运行

J4N*_*J4N 13 c# registry installer startup visual-studio

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

安装的程序工作正常,但我的客户希望应用程序从窗口开始(它是一个"始终顶部"工具栏,帮助他们管理他们的调用).

我想创建一个"类安装程序",并在其中插入一个键在注册表中.

我有两个问题:

第一:如何找到可执行路径?它可以在安装之间改变.我在某处找到了Application.ExecutablePath,但它似乎位于Application.Window.Forms中,所以我认为它与WPF不兼容

第二:我需要在本地机器的注册表中插入此密钥.Windows安装程序中是否有一种方法可以指定用户必须具有管理员权限?

这是我开始的代码:

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

非常感谢您的帮助!

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

/ DIR = "[TARGETDIR] \"

在CustomActionData中.

通常它说我可以通过它检索它

this.Context.Parameters["DIR"];
Run Code Online (Sandbox Code Playgroud)

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

EDIT2:Context是null因为我在构造函数中这样做,我现在正在this.AfterInstall中执行此操作,现在我得到一个上下文,它似乎包含一个var"assemblypath",其中包含我需要的路径.

Pet*_*teH 40

我的假设是你在这里安装项目 ......

一种方法 - 我不是说这是最好的,但它可能是最简单的 - 是做以下事情:

在"文件系统"选项卡中,右键单击"目标计算机上的文件系统","添加特殊文件夹","用户的启动文件夹",此类文件夹将显示在列表中.接下来,获取项目输出的快捷方式(通过右键单击)并将该快捷方式拖到Startup文件夹中.

最后,由于您希望为所有用户提供此功能,请进入"部署项目属性"并将"InstallAllUsers"设置为true.

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

如果你真的想破解注册表,你可以考虑创建一个自定义动作DLL.这是你可以写出你喜欢的东西的东西,在安装过程结束时,安装程​​序会调用你的dll,这样你就可以完成你的工作了.您可以将可执行文件的路径作为参数传递给dll(您可以从安装程序对话框中获取,而不是从任何对象中获取).我不会详细介绍这一点,因为网上必须有关于此的负载.

您应该知道,有一些信息可以传递到dll中 - 如果内存服务,可能会低至256个字符.你可能只是一条路,但是当你开始做更多时......

关于检测用户是否是本地Admin,这有点棘手,只是因为自定义操作dll在安装结束而不是在开始时运行 - 所以你可以编写代码来找出哪些组当前用户进入,但是在代码运行之前你可能已经被炸毁了.我不相信 - 至少在Microsoft安装项目中 - 有可能知道这一点.