在Windows 7启动时启动程序(自动启动)

时间:2012-02-28 18:16:20

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

我写了一个应该从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();

我怎么能让它发挥作用?

3 个答案:

答案 0 :(得分:5)

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

编辑:

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

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

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

答案 1 :(得分:3)

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

由于在启动期间,即使您已完成注册表设置,操作系统也不会运行该应用程序。

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

我的方法是在Startup文件夹中放置一个快捷方式。注册表设置无效。

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

答案 2 :(得分:0)

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

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
        }


    }