.net - 什么是 UAC 实现最佳实践? (.NET)

标签 .net windows-7 uac

我正在考虑开发一个在大多数情况下应该以标准用户身份运行的应用程序,但对于某些操作,需要提升管理访问权限。将某些内容复制到 protected 文件夹时,用户体验应该与 Windows 资源管理器中的一样。

现在的问题是,这应该如何在 .NET 中实现?我知道只能提升整个进程或某些 COM 实例,而不是单个功能。但这正是我所需要的。我应该走哪条路?编写两个可执行文件,一个有 list ,另一个没有;以编程方式运行第二次提升的相同进程;使用一些 COM 的东西?然后我有了添加的权限,但是如何告诉其他进程要做什么?使用 .NET 远程处理(已弃用/复杂?);使用套接字/管道/什么来实现我自己的 IPC 东西?该提升的任务可能需要在过程中间询问用户一些事情。而且它必须是可以取消的。

有很多东西告诉我 UAC 在内部是如何工作的,或者系统管理员可以如何配置它,但我没有找到任何可以回答这些基本问题的东西。

最佳答案

我们在这里似乎有两个不同的问题:

  • 我应该如何处理需要提升权限的操作?
  • 如果我使用一个单独的进程,我应该如何告诉另一个进程做什么?

  • 这是我试图回答他们的尝试:
  • 看来,从这个SO问题:Windows 7 and Vista UAC - Programmatically requesting elevation in C#解决方案如您在问题中所建议的(运行另一个进程并在启动时请求提升)是“正确答案”
  • 至于告诉其他进程做什么,这里是我将如何尝试:

  • 我首先将需要提升权限的每个操作拆分为它们自己的“帮助程序”程序。这些帮助程序将只执行一个操作,通过命令行获取参数。

    例如,假设您的程序需要停止/启动服务,我会编写一个名为 servicecontroller 的小帮助程序(实际上您可能想要使用 net 命令),它采用类似于以下的命令行参数:
    servicecontroller stop MyCoolService
    servicecontroller start MyCoolService
    

    这些参数将由“Main”程序建立并在点击“OK”后传递。

    但是,上述解决方案存在几个问题,您可能关心也可能不关心:
  • 您正在命令行上传递参数,可以轻松嗅探
  • 您受限于 ProcessStartInfo.Argument 的长度+ 程序路径(来自 MSDN:添加到进程完整路径长度的参数长度必须小于 2080。)
  • 将信息传回给您可能有点棘手(您是否需要这个)

  • 更多的谷歌搜索揭示了 'DevZest' 的这篇博文这基本上推荐了我上面描述的内容。祝你好运!

    编辑基于评论中提出的其他问题:
  • 在需要执行提升的操作时,您是否建议启动单独的可执行文件或相同的可执行文件?
  • (我正在阅读这一行的字里行间)我应该多久提示用户执行这些操作?

  • 不知道你在这里做什么是我的看法:
  • 我个人会为这些操作中的每一个都有单独的可执行文件,但不知道您正在尝试做什么,因此很难进行此调用。一般来说,虽然您似乎希望为每个提升的操作设置一个单独的过程。
  • 我对你的第二个例子有点困惑,再次不知道你到底想做什么,我只会根据你在评论中给出的例子。

  • 在文件管理器示例中,我将执行资源管理器所做的操作,并首先旋转每个目标目录,以确定是否有任何目标位置需要提升权限才能复制到。如果他们这样做,我会标记一个标志,表明该操作需要以管理员身份执行,提示用户,然后以管理员身份执行整个操作。

    至于文本编辑器的例子,我会做类似上面的事情,当用户给你一个目标目录检查你是否有对该位置的写访问权限时,如果没有,则通知用户他们正在保存到需要提升的位置,将他们的工作保存到一个可写的位置(你的程序的 APPDATA 可能是一个好地方,甚至是 TEMP),然后启动请求提升的复制过程,如果用户取消了 UAC 对话框,请确保你捕获这个取消并删除临时文件。

    如果您发现您的程序需要在程序生命周期内多次请求提升(Readas:1 或 2 个极端情况),我会劝阻您不要保留提升的工作进程,那么我会质疑为什么不是标记为始终升高。我喜欢遵循“最少惊喜”的规则,当我给你提升的权限时,我希望你只执行请求它的操作,而不是在第一个请求中继续执行需要提升的操作。

    话虽如此,没有什么可以阻止您执行上述操作,一旦您让某个过程获得提升的权限,他就可以邀请他的所有好友。基于您希望保持提升进程的愿望,为什么不只保存程序的当前状态,并以提升的权限重新启动程序并恢复状态?在我看来,这与让工作进程始终处于提升状态相同。

    如果您能告诉我们更多关于您正在尝试做什么的确切信息,我们可能能够找到更好的方法来实现这一目标,而不必遇到 UAC 问题。虽然有一些很好的理由可以写入受 UAC 保护的区域,但在大多数情况下,程序不需要写入/访问这些位置。

    关于.net - 什么是 UAC 实现最佳实践? (.NET),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5947583/

    相关文章:

    .net - 对于 .NET ToolStripButton,我可以有多行 "Text"属性吗?

    windows - git 可以在本地 Windows NTFS 机器上保留文件所有者、权限、ACL 和文件属性吗?

    c++ - 如何找出文件夹是否需要管理权限才能修改其内容?

    c# - 我可以从非虚拟化应用程序访问 Windows 虚拟商店中的文件和注册表项吗?

    uac - 强制现有应用程序始终使用 UAC 虚拟化运行

    .net - azure 搜索 search.ismatch 忽略末尾的 "1"

    .net - 将一组点转移到贝塞尔曲线

    c# - uwp AudioGraph 音频处理

    windows - HKLM注册怀疑

    windows - VS2008 DBML 设计器和 Windows 7