时间:2019-05-10 标签:c#applicationautostartwindows7

Posted

技术标签:

【中文标题】时间:2019-05-10 标签:c#applicationautostartwindows7【英文标题】:c# application auto start windows 7 【发布时间】:2012-12-29 14:34:27 【问题描述】:

我有一个项目,我在其中添加了一个安装程序项目。我在关注这个 (custom installer)

我添加了一个自定义安装程序类。这样做的一个目的是将程序添加到注册表中,以便在任何用户登录时自动启动。我以管理员身份运行 Visual Studio(在 Visual Studio 顶部这样说 - 注意:在计算机管理中我不是管理员)。然而,我的笔记本电脑也使用了一个名为 powerbroker 的应用程序。要安装应用程序,我右键单击并选择运行提升。从阅读其他帖子运行提升与管理员不同,这可能是问题所在。

无论如何,问题是: 在 Visual Studio 中,没有生成错误(代码运行良好)来添加密钥(我编写了一个单独的应用程序来测试它。但是没有写入密钥——我不明白为什么?

当我将代码放入我的安装程序并运行提升时,不会引发错误并且密钥也不会被写入 - 至少如果它出错并回滚安装......

我确实尝试为当前用户设置密钥,效果很好,但对我没有用....

我还创建了一个本地用户,该用户是管理员的成员,但也没有访问权限。

总结一下我想弄清楚的是: 如何抛出注册表写入失败的错误并回滚安装(请记住,代码当前在提升的权限下不会抛出错误但实际上不起作用)

这个问题有解决办法吗?

谢谢 达摩

C# 安装程序类代码

using System;
using System.Diagnostics;
using System.Windows.Forms;
using System.Collections;
using System.ComponentModel;
using System.Configuration.Install;
using System.Reflection;
using System.IO;
using Microsoft.Win32;



namespace OffLine.Installer

    // Taken from:http://msdn2.microsoft.com/en-us/library/
    // system.configuration.configurationmanager.aspx
    // Set 'RunInstaller' attribute to true.

    [RunInstaller(true)]
    public class InstallerClass : System.Configuration.Install.Installer
    
        public InstallerClass()
            : base()
        
            // Attach the 'Committed' event.
            this.Committed += new InstallEventHandler(MyInstaller_Committed);
            // Attach the 'Committing' event.
            this.Committing += new InstallEventHandler(MyInstaller_Committing);
        

        // Event handler for 'Committing' event.
        private void MyInstaller_Committing(object sender, InstallEventArgs e)
        
            // **** Beta Only **** Set program to autostart
            try
            

                RegistryKey add = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);

                add.SetValue("FactoryAuditEventNotification", "\"" + Application.ExecutablePath.ToString() + "\"");

            
            catch (Exception ex)
            
                MessageBox.Show(ex.Message.ToString());             

            

        

        // Event handler for 'Committed' event.
        private void MyInstaller_Committed(object sender, InstallEventArgs e)
        
            try
            
                Directory.SetCurrentDirectory(Path.GetDirectoryName
                (Assembly.GetExecutingAssembly().Location));
                Process.Start(Path.GetDirectoryName(
                  Assembly.GetExecutingAssembly().Location) + "\\FactoryAuditEventNotification.exe");
             
            catch 
            
                // Do nothing... 

            
        

        // Override the 'Install' method.
        public override void Install(IDictionary savedState)
        
            base.Install(savedState);
        

        // Override the 'Commit' method.
        public override void Commit(IDictionary savedState)
        
            base.Commit(savedState);
        

        // Override the 'Rollback' method.
        public override void Rollback(IDictionary savedState)
        
            base.Rollback(savedState);
        
    

【问题讨论】:

查看注册表项 HKLM\..\Run 的权限。打开注册表。单击该键。在编辑菜单上,单击权限。尝试使用procmon 跟踪对 hklm\..\run 密钥的访问。 编写注册表值的代码很多。您是否考虑过只使用 Registry 表? @christopherpainter - 是的,我刚刚尝试过 - 我在 HKPU\SOFTWARE\Microsoft\Windows\Currentversion\Run 位置添加了一个字符串值“[TARGETDIR]myapp.exe”,但确实如此也不起作用 - 它实际上将此值添加到 HKPU\SOFTWARE\WOW6432node\Microsoft\Windows\Currentversion\Run 【参考方案1】:

我想这就是你的情况Adding registry key in C# shows when I read it back, but not in regedit

如何确认 按照 cmets 中的建议,使用 ProcMon util 并且在重定向的情况下进行关键读/写操作的结果将是 REPARSE

【讨论】:

以上是关于时间:2019-05-10 标签:c#applicationautostartwindows7的主要内容,如果未能解决你的问题,请参考以下文章

时间:2019-05-10 标签:c#socketconnectionwithmultithreadingtelnet

时间:2019-05-10 标签:c#paypalrestapitransactionsearch

时间:2019-05-10 标签:c#socketThread

时间:2019-05-10 标签:c++threadeddbclassmemorymixup

时间:2019-05-10 标签:c#applicationautostartwindows7

时间:2019-05-10 标签:c++freadjibberish