2012-02-28 179 views
2

我已经写了一个应该在Windows启动时启动的应用程序。我在HKCU \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Run中的Windows注册中添加了一个条目。输入已成功添加,但程序无法正常启动。在Windows 7启动时启动程序(自动启动)

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

我看到也该条目的值不是引号,但其他人。这是强制性的吗?

这里是我的C#代码:

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

我如何不能让工作?

+0

可能的复制的 http://stackoverflow.com/questions/5127375/running-program-as-administrator-at-startup – Mohit 2012-02-28 18:20:23

+0

不,它没有重复,因为我的程序并不是所有的开始... – nosbor 2012-02-28 18:35:14

+2

如果你的路径需要引号包含空格 – 2012-02-28 18:48:06

回答

3

至于我看到的,这是由于用户访问控制设置,仅允许签名的应用程序启动否则它会要求管理员权限。

由于这个启动过程中,操作系统将根本无法运行,即使你做了注册表设置的应用程序。

此外,报价不是强制性的。你可以拥有或不拥有。

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

另外有一两件事你可以尝试是把/ SYSTEM32或/窗口的文件,然后尝试在注册表中设置。

+0

你能给我们更多的细节吗?现在,单击以admin身份运行,这是否意味着如果你这样做,你的exe不需要清单文件?此外,当UAC完全启用时(这是默认设置),这实际上会工作吗?在UAC的默认设置下,它可以在Vista和Win7上运行吗? 另外,关于system32和windows dirs,这实际上工作吗?所以,我可以在第一次运行时获得提升模式(没​​问题),然后可以执行提升的注册表更改,但在重新启动/第二次运行时,UAC阻止了我的程序。将在这些dirs自动启动位置解决问题? – 2012-07-09 00:44:59

+0

当您以管理员身份运行应用程序时,UAC不会提示,并且不需要嵌入任何清单文件。当您想通过简单的双击来设置权限以运行应用程序时,需要清单文件。如果您双击或简单地打开并且清单文件包含runasAdmin设置,则窗口将自动询问提升。我第一次遇到这种情况,然后在其他时候失败了......我想如果你想在启动时运行它,你需要签署应用程序,但是我从来没有试过签署我的个人应用程序,因为我不想付钱为此:) – Dinesh 2012-07-09 11:39:23

+0

不错的主意,另外,你有没有尝试使用Windows任务计划程序来摆脱提示?不知道为什么WIndows给开发者和用户带来了这个后门,它存在并且是有目的的。 upvoted。 – 2012-09-01 12:33:41

5

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

编辑:

导航到你正在寻找在启动时,右键点击运行exe文件,创建快捷方式。

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

然后把这个启动文件夹(你可以通过点击浏览在开始菜单中的文件夹就行了)。这将在Windows登录时启动该应用程序。如果UAC需要批准,它会提示用户是否可以运行该程序。

+0

你能给我们提供更多细节吗?现在,单击以admin身份运行,这是否意味着如果你这样做,你的exe不需要清单文件?此外,当UAC完全启用时(这是默认设置),这实际上会工作吗?在UAC的默认设置下,它可以在Vista和Win7上运行吗?谢谢。 – 2012-07-09 00:42:33

+0

导航到您正在运行的exe文件,并右键单击,创建快捷方式。在该快捷方式的属性中,选中以管理员身份运行。然后将其放置在启动文件夹中(可以通过单击开始菜单中文件夹的浏览来获得)。这将在Windows登录时启动该应用程序。如果UAC需要批准,它会提示用户是否可以运行该程序。 – JeremyK 2012-07-09 15:37:40

+1

啊,是的,启动文件夹是一个巧妙的技巧,当然自动嵌入作为管理选项的运行到快捷方式是另一个好主意,这种方式你不需要一个清单文件 - 巧妙地使用任何有兴趣的人。 Upvoted。 – 2012-09-01 12:31:15

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 
     } 


    } 
相关问题