授予在没有UAC提示的情况下启动时启动的应用程序的管理员权限?
背景授予在没有UAC提示的情况下启动时启动的应用程序的管理员权限?
我写了一个小的C#/。NET 4.0应用程序,从安装在Program Files文件,并从不同的机器上同一游戏的其他副本游戏同步的各种设置(认为Chrome的书签同步,但是这个游戏)。同步本身是一个相对简单的事情,处理存储在游戏的Program Files文件夹中的文件。
在我的机器上,这工作正常,无需通过UAC提升我的应用程序。 Windows 7使游戏使用程序文件虚拟化,我的应用程序正常工作。
但是,在很多测试仪的机器上,我得到报告说应用程序无法使用这些文件,并且在来的情况下甚至无法看到游戏的文件夹!让用户右键单击并以“以管理员身份运行”解决每种情况下的问题。
所以,我们只是设置应用程序的清单要求管理员权限,对吧?当用户手动调用应用程序或同步过程时,这很好(虽然不理想),因为它们将与应用程序交互并准备好接受UAC请求。
但是,我的应用程序的功能之一是“自动同步”选项,它允许用户“设置并忘记”应用程序。使用此设置,应用程序会将自己放入HKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Run注册表中,以便在启动时运行,并在系统托盘中根据需要同步后台中的设置。
显然,我需要在这里变得更聪明。一旦用户登录到他们的账户或之后的随机间隔,提出UAC提示并不是前进的方向。
所以,我的问题!
在需要管理员权限的启动时需要运行应用程序时,处理这种情况的最佳方法是什么?有没有办法让用户授权安装,导致系统在启动/登录时没有提示而自动运行具有正确权限的应用程序?
更新要明确,这必须在代码中可以实现。
您应该考虑使Windows服务中存在Sync功能。 这是在Windows上运行“后台”功能的首选方法。
服务可以在用户帐户下运行(假设他们有权修改文件),也可以使用另一个帐户。最糟糕的情况是,你可以像SYSTEM一样运行(尽管这不是最佳实践)。
如果您已经拥有了后台进程功能,那么这应该是一个转换为服务的简单过程。
这里有一个示例项目,将设置你在正确的道路上:http://www.codeproject.com/KB/dotnet/simplewindowsservice.aspx
谢谢 - 安装作为一项服务似乎是要做的。谢谢! – 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角色的成员将会收到一条信息消息!
希望这可以帮助!
谢谢,但这不是我问的问题的答案! – iKenndac 2011-01-09 23:08:31
既然你提到在启动时运行,为什么不使用计划任务而不是使用注册表?你可以从代码中设置它们 - 这里有a project on CodePlex,它基本上是一个托管包装器,可以让你不必自己做PInvokes。你运行你的小“设置启动任务”应用程序提升,它指定该应用程序应启动提升,用户甚至不会提示。我相信这是你最后一段中问题的答案。
我认为这会启发你:http://stackoverflow.com/questions/2488632/win-c-run-app-as-administrator-without-uac-prompt/2488645#2488645干杯:) – Machinarius 2011-01-09 16:01:48