【问题标题】:Start program at windows 7 startup(Autostart)在 Windows 7 启动时启动程序(自动启动)
【发布时间】:2012-03-18 06:01:19
【问题描述】:

我编写了一个应在 Windows 启动时启动的应用程序。我在 HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run 的 windows 寄存器中添加了一个条目。条目已添加成功,但程序未正常启动。

我已经在 Windows 7 64 位上测试了应用程序。 应用程序需要有管理员权限才能运行,也许这就是它无法启动的原因?

我还看到条目的值不在引号中,但其他值在引号中。是强制性的吗?

这是我的 C# 代码:

            var registry = Registry.CurrentUser;
            var key = registry.OpenSubKey(runKeyBase, true);
            key.SetValue(KEY, directory + @"\" + filename);
            Registry.CurrentUser.Flush();

我怎么不能让它工作?

【问题讨论】:

  • 不,它没有重复,因为我的程序根本没有启动......
  • 如果您的路径包含空格,则需要引号

标签: c# .net windows-7 registry autostart


【解决方案1】:

为什么不在启动文件夹中放置一个快捷方式?这样您还可以将快捷方式的属性设置为以管理员身份运行

编辑:

导航到您要在启动时运行的 exe,然后右键单击,创建快捷方式。

在该快捷方式的属性中,选中以管理员身份运行。

然后将其放在启动文件夹中(您可以通过单击开始菜单中文件夹上的探索来到达那里)。这将在 Windows 登录时启动该应用程序。如果 UAC 需要批准,它将提示用户是否可以运行该程序。

【讨论】:

  • 你能告诉我们更多的细节吗?现在,单击以管理员身份运行属性,这是否意味着如果您这样做,您的 exe 不需要清单文件?此外,当 UAC 完全启用(默认设置)时,这是否真的有效。它可以在默认设置下使用 UAC 在 Vista 和 Win7 中工作吗?谢谢。
  • 导航到您要在启动时运行的 exe,然后右键单击,创建快捷方式。在该快捷方式的属性中,选中以管理员身份运行。然后将其放在启动文件夹中(您可以通过单击开始菜单中文件夹上的探索来到达那里)。这将在 Windows 登录时启动该应用程序。如果 UAC 需要批准,它会提示用户是否可以运行程序。
  • 啊,是的,启动文件夹是一个巧妙的技巧,当然,将 run as admin 选项自动嵌入到快捷方式中是另一个好主意,这样您就不需要清单文件 - 巧妙的技巧使用任何有兴趣的人。赞成。
【解决方案2】:

据我所知,这是由于用户访问控制设置只允许已签名的应用程序启动,否则它将要求管理员权限。

因此在启动过程中,即使您完成了注册表设置,操作系统也不会运行应用程序。

报价也不是强制性的。你可以拥有也可以不拥有。

我的做法是在启动文件夹中放置一个快捷方式。注册表设置将不起作用。

另外,您可以尝试的一件事是将文件放在 /system32 或 /windows 中,然后尝试在注册表中进行设置。

【讨论】:

  • 你能告诉我们更多的细节吗?现在,单击以管理员身份运行属性,这是否意味着如果您这样做,您的 exe 不需要清单文件?此外,当 UAC 完全启用(默认设置)时,这是否真的有效。它可以在默认设置下使用 UAC 在 Vista 和 Win7 中工作吗?另外,关于 system32 和 windows 目录,这真的有效吗?所以,我可以在第一次运行时获得提升模式(没​​问题)然后可以进行提升的注册表更改,但是在我重新启动/第二次运行时,UAC 会阻止我的程序。在这些目录中设置自动启动位置会解决问题吗?
  • 当您以管理员身份运行应用程序时,UAC 不会提示,这不需要嵌入任何清单文件。当您想要设置权限以通过简单的双击运行应用程序时,需要清单文件。如果您双击或直接打开清单文件并包含 runasAdmin 集,则 Windows 将自动要求提升。我第一次运行时也遇到了同样的情况,然后其他时候又失败了......我认为如果你想在启动时运行它,你需要签署应用程序,但我从未尝试签署我的个人应用程序,因为我不想付钱为此:)
  • 好主意,另外,您是否尝试过使用 Windows 任务计划程序来摆脱提示?不知道为什么 WIndows 给开发者和用户提供了这个后门,而且它的存在和它的目的。赞成。
【解决方案3】:

您可以在启动时自行提升程序。只需在开头执行以下代码:

public static void runAsAdmin(string[] args)
    {
        ProcessStartInfo proc = new ProcessStartInfo();

        if (args != null)
            proc.Arguments = string.Concat(args);

        proc.UseShellExecute = true;
        proc.WorkingDirectory = Environment.CurrentDirectory;
        proc.FileName = System.Reflection.Assembly.GetExecutingAssembly().CodeBase;
        proc.Verb = "runas";



        bool isElevated;
        WindowsIdentity identity = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(identity);
        isElevated = principal.IsInRole(WindowsBuiltInRole.Administrator);

        if (!isElevated)
        {

            try
            {
                Process.Start(proc);
            }
            catch
            {
                //No Admin rights, continue without them
                return;
            }
            //Close current process for switching to elevated one
            Environment.Exit(0);
        }
        return;
    }

此外,在获得管理员权限后,您可以禁用 UAC 通知(如果已启用)以在未来静默启动:

private void disableUAC()
    {
        RegistryKey regKey = null;

        try
        {
            regKey = Registry.LocalMachine.OpenSubKey(ControlServiceResources.UAC_REG_KEY, true);
        }

        catch (Exception e)
        {
            //Error accessing registry
        }


        try
        {
            regKey.SetValue("ConsentPromptBehaviorAdmin", 0);
        }
        catch (Exception e)
        {
            //Error during Promt disabling
        }


    }

【讨论】: