【问题标题】:How to run a process elevated on Windows?如何在 Windows 上运行提升的进程?
【发布时间】:2018-12-12 14:22:18
【问题描述】:

我正在使用 Windows API 调用以管理员身份使用 CreateProcessWithLogonW 在简单帐户中创建进程

createprocesswithLogonW('admin',
                        nil,
                        'Pa$$w0rd',
                        LOGON_WITH_PROFILE,
                        'cmd.exe',
                        nil,
                        0,
                        nil,
                        nil,
                        Si,
                        Pi);

但有时它会返回

错误 5 访问被拒绝

,如果没有,即使该帐户是管理员,它也不会以管理员身份运行它

【问题讨论】:

  • 我猜你的意思是它在工作时不会运行提升?
  • 是的,即使指定的帐户是管理员
  • UAC 就是这样工作的。
  • 是的,但是这个函数应该使用指定的凭据运行应用程序
  • 确实如此,但完整性级别(提升)与凭据无关,也与您是否是管理员组的成员无关。

标签: delphi winapi


【解决方案1】:

如果你不介意 UAC 加入(但我担心你会这样做),那么你可以简单地做,例如:

HINSTANCE hInst = ShellExecuteW (NULL, L"runas",
    L"notepad.exe", NULL, NULL, SW_SHOWDEFAULT);

检查documentation 以获取hInst 中返回的值。对不起,这个例子是用 C++ 编写的,但我相信你可以翻译。

如果您想绕过 UAC,那么您确实必须从服务启动您的应用程序才能使其运行提升。示例代码here,再次在 C++ 中,抱歉,它可能需要稍加修饰,但它确实有效。我假设您想像该代码一样在当前登录用户的上下文中运行该进程。如果它对你有帮助,请投票给那个答案(或这个答案,或两者兼而有之)。


编辑:(因为 OP 显然仍在为此苦苦挣扎)。

你知道吗?我可以为你提供如何解决这个问题的章节和章节但我不会,因为你只会在安装软件时构建一个巨大的安全漏洞。这也是可以解决的,但你真的会打扰吗?

无论如何,请暂时设身处地为用户着想。当程序开始执行通常只能由以管理员身份运行的程序而不首先显示预期的 UAC 提示符的情况下才能完成的事情时,您认为 他们 会有什么感觉?如果是我,我会吓坏的。

所以不,只需使用我第一次推荐的ShellExecute 技巧,然后就这样吧。这已经足够了。

【讨论】:

  • 这将提示要求管理员权限,但我想使用我已经拥有的管理员凭据运行它
  • 那你就得写个服务了,不难。请参考我链接的代码。
  • 好吧,我正在创建一个启动器来启动我的应用程序,该应用程序需要管理员权限来更改属于该域的用户的域名,用户不应该是管理员,或者获得管理员凭据,所以我必须这样做
  • 好吧,很抱歉不得不(再次)告诉你这个,但你不能。这是一项服务,或者什么都不是。你的启动器有安装程序吗?如果是这样,您可以运行提升的安装程序并安装该服务。为此,请查看SC 命令,参见:stackoverflow.com/a/47006989/5743288(毫无疑问还有其他类似的信息来源在“网络”上)。
  • @user3374161 然后使用部署/配置工具来执行此操作,例如旨在处理此类功能的 SCCM
【解决方案2】:

如果您希望提升进程(或进程需要提升),则不能使用 CreateProcessWithLogon 来实现。

我现在无法测试,但我认为您需要:

  1. 致电LogonUser获取主令牌
  2. 使用TokenLinkedToken 信息类调用GetTokenInformation 以获取链接的(提升的)令牌。
  3. 使用链接的令牌调用CreateProcessAsUser

【讨论】:

  • 但 CreateProcessAsUser 需要获取权限,并且这些功能返回简单帐户拒绝的访问权限
  • UAC就是这样工作的,你只能通过服务来解决
【解决方案3】:

我相信,可以通过使用中间引导程序应用程序来实现以另一个用户身份运行进程以及提升进程的最终目标。

使用CreateProcessWithLogonW 使用其他用户的凭据创建进程,而不是运行目标应用程序,您可以创建另一个应用程序,该应用程序仅用于创建提升的进程,或者使用一些参数调用当前应用程序,指定您想要的提升目标应用程序(类似于--elevate C:\Windows\Notepad.exe)。此过程将(以其他用户身份运行)使用ShellExecute 中的runas 动词来启动所需的应用程序。

Runner.exe uses CreateProcessWithLogonW(user,pass)
=> (to run)
Runner.exe --elevate C:\App.exe uses ShellExecute(runas)
=> (which gives)
App.exe (running as user + elevated)

你会得到一个 UAC 提示 但这就是 Windows 现在的工作方式,不应该被规避

对于我来说,这比创建一个你必须与之通信的服务等容易得多。

您可以阅读此here(Windows 博客存档:为什么我不能在使用 CreateProcessWithLogonW 时提升我的应用程序以管理员身份运行?)它有点旧,但它仍然有效。很高兴被证明是错误的。

【讨论】:

    【解决方案4】:

    是的,通过服务,您可以使用特定的管理员凭据运行应用程序,但请注意,这会产生其他不良副作用。所以我认为你最好尝试审查你的用例:你真的需要一个简单的非管理员用户来让应用程序在你能想到的每个安全漏洞的情况下运行提升......我的回答是不,绝对不是。通常您可以在安装过程中进行设置(具有管理员权限),有时还可以授予特定用户组一些修改部件的权限(如文件夹权限)。但就是这样。

    如此多的用户一直在问同样的问题,但简单来说,你尝试的每件事都接近于破解 Windows,而且非常糟糕。

    如果您真的不希望 UAC 启动,请为机器禁用它!但我不认为你想要那个……

    【讨论】:

      猜你喜欢
      • 2011-09-11
      • 1970-01-01
      • 2015-10-13
      • 2013-11-09
      • 2011-12-21
      • 2020-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多