如何在启动时授予应用程序管理员权限而无需UAC提示?

7

背景

我编写了一个小的C#/.NET 4.0应用程序,可以将一个游戏在Program Files中安装的各种设置与其他不同机器上的相同游戏的设置进行同步(类似于Chrome书签同步,但是针对这个游戏)。同步本身是一个相对简单的过程,处理存储在游戏Program Files文件夹内的文件。

在我的机器上,这可以正常工作,而无需通过UAC提升我的应用程序。Windows 7使用Program Files虚拟化,我的应用程序可以很好地运行。

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

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

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

显然,我需要更加聪明。在用户登录其帐户或随机间隔后立即呈现UAC提示并不是正确的方法。

所以,我的问题是!

如何处理需要以管理员特权运行应用程序的启动情况?是否有一种方法可以使用户授权安装,从而导致系统在启动/登录时自动以正确的权限运行应用程序,而无需提示?

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


1
我认为这会让你受益:https://dev59.com/hHE95IYBdhLWcg3wCJXk#2488645 干杯 :) - Machinarius
3个回答

6
您应该考虑将同步功能存在于Windows服务中。这是在Windows上运行“后台”功能的首选方法。
服务可以在用户帐户下运行(假设他们有修改文件的权限),或者您可以使用另一个具有权限的帐户。最糟糕的情况是,您可以作为SYSTEM运行(虽然这不是最佳实践)。
如果您已经拥有了后台进程功能,则将其转换为服务应该是一个简单的过程。
这里有一个示例项目,可以帮助您找到正确的路径:http://www.codeproject.com/KB/dotnet/simplewindowsservice.aspx

谢谢 - 安装为服务似乎是正确的方法。谢谢! - iKenndac

2
既然你提到了开机自启动,为什么不使用计划任务来代替你使用注册表的方法呢?你可以通过编程设置计划任务——有一个在 CodePlex 上的项目任务计划程序库,它是一个托管封装类,省去了你必须自己做 PInvoke 的麻烦。运行你的小型“启动任务设置”应用程序并提权,指定该应用程序以提权方式启动,用户甚至不会被提示。我相信这就是你最后一段问题的答案。

1
我会使用安全命名空间并检查用户角色。
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
谢谢,但那不是我问的问题的答案! - iKenndac
哦,对不起,我刚刚重新阅读了您的原始问题。似乎使用Windows服务可能是一个不错的选择。如果我找到另一个解决方案,我会发布它... - Pilgerstorfer Franz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接