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