Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否向启动时启动的应用程序授予管理员权限而无需UAC提示?_C#_.net_Windows_Uac - Fatal编程技术网

C# 是否向启动时启动的应用程序授予管理员权限而无需UAC提示?

C# 是否向启动时启动的应用程序授予管理员权限而无需UAC提示?,c#,.net,windows,uac,C#,.net,Windows,Uac,背景 我已经编写了一个小型的C#/.NET 4.0应用程序,它可以将程序文件中安装的游戏的各种设置与不同机器上相同游戏的其他副本进行同步(想想Chrome bookmark sync,但适用于此游戏)。同步本身是一件相对简单的事情,处理存储在游戏程序文件文件夹中的文件 在我的机器上,这可以很好地工作,而无需通过UAC提升我的应用程序。Windows7使游戏使用程序文件虚拟化,我的应用程序也可以很好地使用它 然而,在很多测试仪的机器上,我收到报告说应用程序或者不能处理文件,有时候甚至看不到游戏的文

背景

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

在我的机器上,这可以很好地工作,而无需通过UAC提升我的应用程序。Windows7使游戏使用程序文件虚拟化,我的应用程序也可以很好地使用它

然而,在很多测试仪的机器上,我收到报告说应用程序或者不能处理文件,有时候甚至看不到游戏的文件夹!让用户右键单击并“以管理员身份运行”可以解决任何情况下的问题

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

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

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

所以,我的问题

对于需要在启动时运行需要管理员权限的应用程序的情况,最好的解决方法是什么?是否有一种方法可以让用户授权安装,从而使系统以正确的权限自动运行应用程序,而无需在启动/登录时提示


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

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

该服务可以在用户帐户下运行(假设他们有权修改文件),也可以使用其他帐户运行。最坏的情况是,您可以作为系统运行(尽管这不是最佳实践)

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


这里有一个示例项目将为您设置正确的路径:

我将使用安全名称空间并检查用户角色的内联

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


希望这能有所帮助

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

我想这会启发你:干杯:)谢谢,但这不是我问的问题的答案!哦,对不起,我只是重读了你原来的问题。使用windows服务似乎是一个不错的选择。如果我找到另一个解决方案,我会发布它…谢谢-作为服务安装似乎是一种方式。谢谢