【问题标题】:Granting administrator privileges to an application launched at startup without UAC prompt?在没有 UAC 提示的情况下向启动时启动的应用程序授予管理员权限?
【发布时间】:2011-01-09 15:45:55
【问题描述】:

背景

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

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

但是,在许多测试人员的机器上,我收到报告说应用程序要么无法处理文件,甚至在某些情况下甚至看不到游戏的文件夹!让用户右键单击并“以管理员身份运行”可以在任何情况下解决问题。

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

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

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

那么,我的问题!

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

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

【问题讨论】:

标签: c# .net windows uac


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢 - 安装为服务似乎是一种方式。谢谢!
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    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 可能会启动您的应用程序,如果他不是管理员角色的成员,则会收到一条信息消息!

    希望这会有所帮助!

    【讨论】:

    • 谢谢,但这不是我所提问题的答案!
    • 哦,对不起,我刚刚重读了你原来的问题。似乎使用 Windows 服务可能是一个不错的选择。如果我找到另一个解决方案,我会发布它......
    猜你喜欢
    • 2013-12-24
    • 2017-03-18
    • 1970-01-01
    • 2021-05-21
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    相关资源
    最近更新 更多