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