【问题标题】:How to force user to user Administrator account in WinForms如何在 WinForms 中强制用户使用管理员帐户
【发布时间】:2011-02-10 10:26:16
【问题描述】:

我有一个简单的 WinForms 应用程序,用于修改 Windows 注册表。问题是在 Vista / Windows 7 中我需要强制用户切换到管理员。

我不想强制用户以管理员身份运行表单启动应用程序。我希望他在需要写入注册表时这样做。

当用户需要“切换”到管理员时,最好的情况是达到与许多设置中出现的完全相同的消息,因此没有必要以管理员身份运行表单开始。

如何在 .Net 中实现这一点?

【问题讨论】:

    标签: c# .net windows winforms windows-7


    【解决方案1】:

    据我所知,没有 API 可以提升流程。当一个进程试图以提升模式启动另一个进程时,它会自动发生。

    这也是它与 Windows 安装程序一起使用的方式。我不确定它是从字面上开始另一个提升的进程还是只是创建一个提升的 COM 对象,但它实际上是同一件事。

    我个人不会诉诸这种骇人听闻的解决方法来提升您的流程执行中期;如果您的流程可能需要提升,请使用清单明确说明,并在启动时弹出同意消息。但是,如果您绝对必须这样做,那么就是这样 - 您需要从您的应用程序中启动一个提升的进程。

    【讨论】:

    • 我实际上认为最好只在需要时要求加高。在相同的 Windows Installer 的情况下,我喜欢我可以通过选项,并且可以在任何时间点取消,而无需让应用程序在提升模式下运行。它只会在需要时要求提升,而不是“只是为了展示”:)
    • @Artiom:但正如我所解释的,安装程序只是一个存根。实际的“安装”是在进程外完成的。该方法仅在您的应用程序以相同的方式或可以以相同的方式进行分区时才有意义,具有特定的提升“步骤” - 否则您的应用程序将每 2 分钟或每当它决定需要提升时启动单独的进程,而这不是一件好事。
    【解决方案2】:

    正如 Aaronaught 所说,我认为进程不可能请求提升自身。解决此问题的一种方法是将进程拆分为两个应用程序,一个是正常的一个,它完成大部分工作,另一个只负责注册表写入,而这个的清单包含类似

    <requestedExecutionLevel level="requireAdministrator"/>
    

    【讨论】:

      【解决方案3】:

      如果应用程序有时不做注册表的事情,有时做的话,分区是一种方法。分区的三个关键是(1)在第二个 exe 上有一个清单,正如 Ho 所说,(2)在按钮/菜单项上放置一个屏蔽,以便用户期望提升,以及(3)使用 ShellExecute 启动它(之前调用 Start,将 UseShellExecuteFlag 设置为 true)以便使用清单。

      但是,在麻烦拆分您的应用之前,我想问两个问题。首先,它是否曾经用于非管理目的,还是每个用户总是“点击那个按钮”并需要提升?如果是这样,那么只需在应用程序上放置一个管理员清单,不要对其进行分区。其次,您确定需要写入注册表的那部分吗?你能把你的钥匙移到 HKCU 下吗?如果可以,那么您不再需要提升,每个人都会更快乐。我总是喜欢首先考虑这些可能性,因为它们意味着比分区更少的代码和更少的测试。

      【讨论】:

      • 我需要这些权限才能与扩展名关联文件。在 HKCU 中,它会检查远端的关联 :( 所以看起来这不是一个好的解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多