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

本文关键字:启动 自动启动 程序 windows | 更新日期: 2023-09-27 18:26:07

我写了一个应用程序,应该在windows启动时启动。我在HKCU''SOFTWARE''Microsoft''windows''CurrentVersion''Run的windows注册表中添加了一个条目。已成功添加条目,但程序未正确启动。

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

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

这是我的c#代码:

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

我怎么能让它工作呢?

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

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

编辑:

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

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

然后将其放在启动文件夹中(单击"开始"菜单中的文件夹上的"浏览"即可到达)。这将在windows登录时启动该应用程序。如果UAC需要批准,它将提示用户是否可以运行程序。

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

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

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

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

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

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

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
        }

    }