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