【问题标题】:Is it possible for the executable to ask for Administrator rights? (Windows 7)可执行文件是否可以要求管理员权限? (Windows 7的)
【发布时间】:2012-02-13 12:05:02
【问题描述】:

我正在开发一个分区磁盘程序,我需要管理员权限才能读取\\\\.\\PhysicalDrive0

我想知道程序是否有可能在运行时获得管理员权限?有没有win api呢?

我想这样做是因为我希望程序仅在读取/写入磁盘时以管理员权限执行。出于安全原因,我不希望程序一直以管理员权限执行,因为有人可能会在某些模块中发现错误(例如堆栈或堆溢出)并以 adm 身份执行任意命令。

【问题讨论】:

  • 没有。您必须将该代码移动到另一个具有要求 UAC 提升权限的清单的 .exe 项目中。必要时启动该 .exe。
  • 感谢您的所有回答!分离流程的技巧将完成这项工作。
  • @HansPassant:不一定是 另一个 .exe。查看任务管理器,如果您选择“查看所有用户的进程”,它会以管理员权限重新启动。
  • @MSalters - 是的。但那是 autoElevate 在工作中,不适用于普通人。 technet.microsoft.com/en-us/magazine/2009.07.uac.aspx#id0560031
  • @HansPassant:autoElevate 保留给操作系统,但这只是为了抑制提示。

标签: c++ winapi windows-7


【解决方案1】:

我从未见过在进程开始执行后转换权限的方法。我知道的唯一方法是将进程创建为特权。

如果有其他方法,我期待其他答案。

(更新)
文章Teach Your Apps To Play Nicely With Windows Vista User Account Control(大约一半)确认只能在进程创建时授予管理员权限。

【讨论】:

  • 链接已损坏。
【解决方案2】:

您需要使用 requireAdministrator 标志嵌入清单

http://msdn.microsoft.com/en-us/library/bb756929.aspx

【讨论】:

  • 由于该程序需要访问低级计算机部件,我看不出有任何理由不应该以管理员权限运行。同样的原因也适用于每次需要执行特权操作时启动的特权子进程
  • 出于完全相同的原因,OpenSSH 没有以 root 权限运行所有内容,只是因为它必须在端口 22 上侦听.. 其他任何东西都是可怕的设计,并且违反了最基本的安全原则之一代码设计。 There's even a wiki article about it
  • “分区程序”本身被启动以执行一些管理员特权操作。分区本身需要管理员权限。
  • 该程序显然还有其他一些不需要管理员权限的事情 - 毕竟这就是整个问题的意义所在!
【解决方案3】:

进程启动后,您无法获得提升的权限。您的选择是:

  1. 将需要提升权限的应用程序部分放入一个单独的进程中,并使用requireAdministrator 显示。
  2. 将需要提升权限的应用程序部分作为进程外 COM 对象运行。

【讨论】:

  • 有关 COM 提升方法,请参阅 MSDN 上的 this article
【解决方案4】:

项目的属性(Alt + Enter)->链接器->清单文件 -> UAC 执行级别(在 VS2015 中,在 2010 中类似) ->requireAdministrator 或highestAvailable

编辑:另外,如果是更新程序,只需将程序名称以Update 开头,Windows 就会自动识别它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 2012-07-19
    相关资源
    最近更新 更多