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

我有一个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为null 🙁

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

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

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

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

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

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

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

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

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