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