授予在没有UAC提示的情况下启动时启动的应用程序的管理员权限?

问题描述:

背景授予在没有UAC提示的情况下启动时启动的应用程序的管理员权限?

我写了一个小的C#/。NET 4.0应用程序,从安装在Program Files文件,并从不同的机器上同一游戏的其他副本游戏同步的各种设置(认为Chrome的书签同步,但是这个游戏)。同步本身是一个相对简单的事情,处理存储在游戏的Program Files文件夹中的文件。

在我的机器上,这工作正常,无需通过UAC提升我的应用程序。 Windows 7使游戏使用程序文件虚拟化,我的应用程序正常工作。

但是,在很多测试仪的机器上,我得到报告说应用程序无法使用这些文件,并且在来的情况下甚至无法看到游戏的文件夹!让用户右键单击并以“以管理员身份运行”解决每种情况下的问题。

所以,我们只是设置应用程序的清单要求管理员权限,对吧?当用户手动调用应用程序或同步过程时,这很好(虽然不理想),因为它们将与应用程序交互并准备好接受UAC请求。

但是,我的应用程序的功能之一是“自动同步”选项,它允许用户“设置并忘记”应用程序。使用此设置,应用程序会将自己放入HKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Run注册表中,以便在启动时运行,并在系统托盘中根据需要同步后台中的设置。

显然,我需要在这里变得更聪明。一旦用户登录到他们的账户或之后的随机间隔,提出UAC提示并不是前进的方向。

所以,我的问题!

在需要管理员权限的启动时需要运行应用程序时,处理这种情况的最佳方法是什么?有没有办法让用户授权安装,导致系统在启动/登录时没有提示而自动运行具有正确权限的应用程序?

更新要明确,这必须在代码中可以实现。

+1

我认为这会启发你:http://stackoverflow.com/questions/2488632/win-c-run-app-as-administrator-without-uac-prompt/2488645#2488645干杯:) – Machinarius 2011-01-09 16:01:48

您应该考虑使Windows服务中存在Sync功能。 这是在Windows上运行“后台”功能的首选方法。

服务可以在用户帐户下运行(假设他们有权修改文件),也可以使用另一个帐户。最糟糕的情况是,你可以像SYSTEM一样运行(尽管这不是最佳实践)。

如果您已经拥有了后台进程功能,那么这应该是一个转换为服务的简单过程。

这里有一个示例项目,将设置你在正确的道路上:http://www.codeproject.com/KB/dotnet/simplewindowsservice.aspx

+0

谢谢 - 安装作为一项服务似乎是要做的。谢谢! – iKenndac 2011-01-12 16:12:15

我会使用安全命名空间和检查在线用户角色。

using System.Threading; 
using System.Security.Principal; 

namespace StackOverflow_Demo 
{ 
    class Program 
    { 
    static void Main(string[] args) 
    { 
     AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal); 
     WindowsPrincipal currentPrincipal = (WindowsPrincipal) Thread.CurrentPrincipal; 

     if (currentPrincipal.IsInRole("Administrators")) 
     { 
      // continue programm 
     } 
     else 
     { 
      // throw exception/show errorMessage - exit programm 
     } 
    } 
    } 
} 

当前用户可能会启动您的应用程序,并且如果他不是admininistrator角色的成员将会收到一条信息消息!

希望这可以帮助!

+0

谢谢,但这不是我问的问题的答案! – iKenndac 2011-01-09 23:08:31

既然你提到在启动时运行,为什么不使用计划任务而不是使用注册表?你可以从代码中设置它们 - 这里有a project on CodePlex,它基本上是一个托管包装器,可以让你不必自己做PInvokes。你运行你的小“设置启动任务”应用程序提升,它指定该应用程序应启动提升,用户甚至不会提示。我相信这是你最后一段中问题的答案。