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