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

时间:2011-01-09 15:45:55

标签: c# .net windows uac

背景

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

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

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

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

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

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

所以,我的问题!

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

更新为了清楚起见,这必须在代码中实现。

3 个答案:

答案 0 :(得分:6)

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

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

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

这里有一个示例项目,可以让您走上正确的道路:http://www.codeproject.com/KB/dotnet/simplewindowsservice.aspx

答案 1 :(得分:2)

我会使用Security命名空间并检查内联用户角色。

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
        }
     }
   }
 }

currentUser可能会启动您的应用程序,如果他不是管理员角色的成员,则会收到一条信息消息!

希望这可能有所帮助!

答案 2 :(得分:1)

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