我正在考虑开发一个在大多数情况下应该以标准用户身份运行的应用程序,但对于某些操作,需要提升管理访问权限。将某些内容复制到 protected 文件夹时,用户体验应该与 Windows 资源管理器中的一样。
现在的问题是,这应该如何在 .NET 中实现?我知道只能提升整个进程或某些 COM 实例,而不是单个功能。但这正是我所需要的。我应该走哪条路?编写两个可执行文件,一个有 list ,另一个没有;以编程方式运行第二次提升的相同进程;使用一些 COM 的东西?然后我有了添加的权限,但是如何告诉其他进程要做什么?使用 .NET 远程处理(已弃用/复杂?);使用套接字/管道/什么来实现我自己的 IPC 东西?该提升的任务可能需要在过程中间询问用户一些事情。而且它必须是可以取消的。
有很多东西告诉我 UAC 在内部是如何工作的,或者系统管理员可以如何配置它,但我没有找到任何可以回答这些基本问题的东西。
最佳答案
我们在这里似乎有两个不同的问题:
这是我试图回答他们的尝试:
我首先将需要提升权限的每个操作拆分为它们自己的“帮助程序”程序。这些帮助程序将只执行一个操作,通过命令行获取参数。
例如,假设您的程序需要停止/启动服务,我会编写一个名为 servicecontroller 的小帮助程序(实际上您可能想要使用 net 命令),它采用类似于以下的命令行参数:
servicecontroller stop MyCoolService
servicecontroller start MyCoolService
这些参数将由“Main”程序建立并在点击“OK”后传递。
但是,上述解决方案存在几个问题,您可能关心也可能不关心:
更多的谷歌搜索揭示了 'DevZest' 的这篇博文这基本上推荐了我上面描述的内容。祝你好运!
编辑基于评论中提出的其他问题:
不知道你在这里做什么是我的看法:
在文件管理器示例中,我将执行资源管理器所做的操作,并首先旋转每个目标目录,以确定是否有任何目标位置需要提升权限才能复制到。如果他们这样做,我会标记一个标志,表明该操作需要以管理员身份执行,提示用户,然后以管理员身份执行整个操作。
至于文本编辑器的例子,我会做类似上面的事情,当用户给你一个目标目录检查你是否有对该位置的写访问权限时,如果没有,则通知用户他们正在保存到需要提升的位置,将他们的工作保存到一个可写的位置(你的程序的 APPDATA 可能是一个好地方,甚至是 TEMP),然后启动请求提升的复制过程,如果用户取消了 UAC 对话框,请确保你捕获这个取消并删除临时文件。
如果您发现您的程序需要在程序生命周期内多次请求提升(Readas:1 或 2 个极端情况),我会劝阻您不要保留提升的工作进程,那么我会质疑为什么不是标记为始终升高。我喜欢遵循“最少惊喜”的规则,当我给你提升的权限时,我希望你只执行请求它的操作,而不是在第一个请求中继续执行需要提升的操作。
话虽如此,没有什么可以阻止您执行上述操作,一旦您让某个过程获得提升的权限,他就可以邀请他的所有好友。基于您希望保持提升进程的愿望,为什么不只保存程序的当前状态,并以提升的权限重新启动程序并恢复状态?在我看来,这与让工作进程始终处于提升状态相同。
如果您能告诉我们更多关于您正在尝试做什么的确切信息,我们可能能够找到更好的方法来实现这一目标,而不必遇到 UAC 问题。虽然有一些很好的理由可以写入受 UAC 保护的区域,但在大多数情况下,程序不需要写入/访问这些位置。
关于.net - 什么是 UAC 实现最佳实践? (.NET),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5947583/