如何在Windows中以另一个管理员用户身份运行应用程序

3

这段代码旨在供计算机的非管理员用户使用,以便他们可以作为管理员运行任务或应用程序。因此,我创建了一个管理员用户,我将使用它来启动应用程序(带路径)。

当我尝试使用另一个用户的Runas命令启动应用程序时,出现了问题。

该命令需要输入用户的密码。

因此,我尝试使用:

import subprocess as sub

prog = sub.Popen(['runas', '/noprofile', '/user:kairos', path/of/app],shell=True, stdin=sub.PIPE, stdout=sub.PIPE)
prog.communicate(input=password.encode())

但什么也没发生。 另一种方法是使用具有凭据的“Start-Process” Powershell 命令。

import subprocess as sub

command = """
    $username = 'kairos'
    $password = 'password'
    $securePassword = ConvertTo-SecureString $password -AsPlainText -Force
    $credential = New-Object System.Management.Automation.PSCredential $username, $securePassword
    Start-Process "path\to\app" -Credential $credential
    """
   exec = sub.Popen(["powershell","& {" + command + "}"], stdout=sub.PIPE)
   exec.communicate()

尽管我是计算机的本地管理员,但此命令返回“访问被拒绝”。

我还尝试使用此命令,但被用户账户控制(UAC)卡住了。

 ctypes.windll.shell32.ShellExecuteW(None, "runas", "path\to\app")

有什么想法吗?

2个回答

3
  • runas.exe 实用程序无法以提升权限的方式运行进程(如管理员)。

  • 使用 -Credential 参数的 Start-Process 也不能提升权限。

  • 只有使用 -Verb RunAsStart-Process 才能以提升权限的方式启动进程,而且 -Verb-Credential 互斥。

    • 换句话说:您可以在不提升权限的情况下作为另一个用户运行进程,或者请求提升权限,在这种情况下,您不能选择作为哪个管理用户来运行提升的进程。

    • 如果接受要求用户响应 UAC 提示(见下文),则可以使用“两步”调用过程,其中您首先使用 -Credential 启动另一个非提升进程,然后从该进程中使用 -Verb RunAs 请求提升权限 - 参见此答案

  • 除非禁用 UAC - 这是强烈不鼓励的 - 您基本上无法完全自动化地以提升权限的方式启动进程。必须要进行以下两个互动操作之一:

    • 如果当前用户标识原则上是 Administrators 组的一部分:则需要进行简单的确认。

    • 否则,需要以交互方式提供管理员凭据。

    • 避免 UAC 提示的唯一方法是要么从一开始就以提升进程运行,要么使用以下受限制的解决方法:假设您原则上是管理员,则可以设置一个预配置命令的计划任务以使用提升权限运行,然后在您的非提升会话中按需调用,而不触发 UAC 提示 - 参见此答案


1
尽管这似乎是任何试图实现此目标的公司安全性的可怕想法,但我可能有一个答案可以帮助你达成目标。 如果UAC已正确启用,则您无法通过任何“非黑客方法”绕过它。您的安全应用程序应该阻止能够执行此类操作的应用程序。 但是,如果您只需要让该应用程序在后台工作而不是在当前用户会话中,那么您可以尝试使用WMI来启动该进程 - 使用wmic尝试https://ss64.com/nt/wmic.html并使用“process call create”- 示例:
wmic /user:username /password:yourpassword /node:remotemachine process call create "c:\folder\app.exe","c:\folder"

另一种选择是创建一个“计划任务”或运行在更高特权下并等待触发的服务。该触发器可能是包含要执行操作的文件夹中创建的文件或应用程序事件日志中的条目。根据文件系统处理程序,对文件更改的等待可以立即通知。
但是,如果您试图在任何公司中应用此方法,必须考虑安全性。如果您使用任何不安全的方法使非管理员成为管理员(只是在另一个进程中),则他就是管理员,并且可能有多种使用所有权限的方式。根据声称需要那些管理权限的应用程序,您可能有许多解决方案,以便使该应用程序在较低权限下工作。其中一种解决方案可能是授予非管理员应用程序所需文件夹的权限。如果应用程序需要更改网络设置,您可以授予用户本地网络运营商权限,以便他始终能够更改网络设置。
另一个提示-永远不要创建具有硬编码任何类型密码的程序。即使是从已编译的应用程序中,也有很多方法可以获取该密码。如果您需要另一个用户,请依赖于操作系统的方法(带有专用服务用户的服务)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接