如何在没有管理员权限的情况下运行程序并绕过 UAC 提示

Jacki

启动时,某些程序需要权限提升(应用程序图标旁边的盾牌),但实际上,它们的正常操作不需要管理员权限。例如,您可以手动为用户授予对 ProgramFiles 中的应用程序文件夹和/或程序使用的注册表项的权限。如果计算机上启用了用户帐户控制,如果您尝试以标准用户身份运行此类程序,则会出现 UAC 提示,并且 Windows 会要求用户输入管理员密码。

为了绕过此机制,许多管理员只需禁用 UAC 或通过将用户帐户添加到本地组“管理员”来授予管理员权限。当然,这两种方法都不安全。这两种方法都不建议广泛使用,因为它们会降低 Windows 的安全性。在本文中,我们将了解如何以标准用户身份运行需要管理员权限的程序并抑制 UAC 提升提示。

内容:

配置非管理员用户运行程序的权限

如果出现以下情况,Windows 程序在启动时可能会要求您提供管理员权限:

  • 程序需要访问未授予非特权用户NTFS权限的系统目录或文件;
  • 如果程序是使用特殊标志编译的,需要在启动时提升(requireAdministrator)。

在第一种情况下,解决问题所需要做的就是授予程序目录或所需系统目录/文件的RW或完全控制用户权限。例如,程序将其文件(日志、配置文件等)存储在其自己的文件夹中C:Program Files (x86)SomeApp或者一些系统目录。用户必须有权写入这些文件才能使程序正常工作。为了使该程序正常运行,需要管理员权限。

要允许程序以非管理员用户身份运行,只需手动授予用户(或内置用户组)在 NTFS 文件系统级别修改/写入文件/目录的权限即可

要查找程序正在访问的文件、文件夹和注册表项的列表,请使用过程监控器https://learn.microsoft.com/en-us/sysinternals/downloads/procmon)。启用按程序进程名称过滤并查找所有资源,如果尝试访问它们,则会显示“访问被拒绝”。授予文件夹/文件/注册表项必要的权限。

笔记。实际上,不建议将更改的应用程序数据存储在 C:Program Files 目录中。最好将应用程序数据存储在用户配置文件中。但这是应用程序开发人员的懒惰和无能的问题。

允许标准用户运行需要管理员权限的程序

之前我们描述了如何使用以下命令禁用特定程序的 UAC 提示人类召唤者范围。但这种方法不够灵活。

让我们看看一种更简单的方法,强制任何程序在没有管理员权限(无需输入管理员密码)且启用 UAC(UAC 滑块的级别 4、3 或 2)的情况下运行。

让我们以注册表编辑器为例——注册表编辑器(它位于 C:Windows 文件夹中)。请注意应用程序图标旁边的 UAC 盾牌。此图标表示需要 UAC 提升才能运行此应用程序。

当你跑步时regedit.exe,您将看到一个用户帐户控制提示,要求输入管理员凭据(Do you want to allow this app to make changes to your device?)。如果您不提供密码且不确认提升,应用程序将不会启动。

让我们尝试绕过该程序的UAC 请求。创建文本文件以非管理员身份运行.bat桌面上包含以下代码:

cmd /min /C "set __COMPAT_LAYER=RUNASINVOKER && start "" %1"

要强制 regedit.exe 在没有管理员权限的情况下运行并抑制 UAC 提示,只需将要运行的 EXE 文件拖到桌面上的此 BAT 文件中即可。

注册表编辑器应在没有 UAC 提示且无需输入管理员密码的情况下启动。如果您打开任务管理器并添加高架列中,您将看到存在没有提升状态的 regedit.exe 进程(以非管理员用户权限运行)。

尝试编辑 HKEY_LOCAL_MACHINE 注册表配置单元下的任何项目。如您所见,用户无法编辑此注册表项中的项目(用户没有系统注册表项的写入权限)。但是,您可以在用户配置单元 (HKEY_CURRENT_USER) 中添加或编辑注册表项和参数。

同样,您可以使用 BAT 文件运行任何应用程序。只需指定可执行文件的路径即可。

运行应用程序作为非管理员.bat
Set ApplicationPath="C:Program FilesSomeApptestapp.exe"
cmd /min /C "set __COMPAT_LAYER=RUNASINVOKER && start "" %ApplicationPath%"

您还可以添加一个上下文菜单,允许在不提升权限的情况下运行所有​​应用程序。为此,请创建以用户身份运行.REG文件中,将以下代码复制到其中,保存并通过双击 reg 文件将其导入 Windows 注册表(您需要管理员权限才能应用此更改)。

Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT*shellforcerunasinvoker]
@="Run as user without UAC privilege elevation"
[HKEY_CLASSES_ROOT*shellforcerunasinvokercommand]
@="cmd /min /C "set __COMPAT_LAYER=RUNASINVOKER && start "" "%1"""

之后,要在没有管理员权限的情况下运行任何应用程序,只需选择“以没有 UAC 权限提升的用户身份运行”从 Windows 文件资源管理器上下文菜单。

您可以通过使用 GPO 导入注册表参数来将此菜单项部署到域中的所有计算机。

我想提醒您,使用RUNASINVOKER该程序的模式不允许您提升权限。 RunAsInvoker 抑制 UAC 提示并告诉程序它应该以当前用户的权限运行,而不是要求提升权限。如果程序确实需要提升权限来编辑系统设置或文件,它将无法工作或会再次请求管理员权限。

如何使用 CMD 中的 RunAsInvoker 选项绕过 UAC?

__COMPAT_LAYER 环境变量允许您为应用程序设置不同的兼容性级别(兼容性EXE 文件属性中的选项卡)。此变量允许您指定要运行程序的兼容性设置。例如,要在 Windows 8 兼容模式下以 640×480 分辨率启动应用程序,请设置以下内容:

set __COMPAT_LAYER=Win8RTM 640x480

__COMPAT_LAYER变量有一些我们感兴趣的选项。有以下参数:

  • 人类召唤者– 使用父进程的权限运行应用程序,而无需出现 UAC 提示;
  • 跑得最高– 以用户可用的最高级别权限运行程序(如果用户具有管理员权限,则会出现UAC提示);
  • 以管理员身份运行– 以管理员身份运行应用程序(UAC 提示将始终出现)。

这意味着 RunAsInvoker 参数不会授予管理员权限,它只是抑制 UAC 提示。

以下命令为当前进程启用 RunAsInvoker 模式并在不提升的情况下运行指定的程序:

set __COMPAT_LAYER=RUNASINVOKER
start "" "C:Program FilesMyApptestapp.exe"

在 EXE 文件清单中启用 RunAsInvoker 模式

如上所述,Windows 会为需要提升权限才能运行的程序显示 UAC 盾牌图标。开发者在程序中编译应用程序时设置了这个要求显现

您可以编辑任何 EXE 文件的清单并禁用在提升模式下运行程序的要求。

使用免费的资源黑客编辑程序清单的工具。在 Resource Hacker 中打开可执行程序。

在此示例中,我将编辑Autologon.exeSysinternals 提供的工具,可用于无需密码自动登录 Windows。

在左边的树中,转到显现部分并打开程序清单。请注意以下 XML 部分:

<requestedPrivileges>
<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
</requestedPrivileges>

随着需要管理员启用该选项后,Windows 始终以管理员权限运行该程序。

将 requireAdministrator 更改为作为调用者并将更改保存到 .exe 文件。

请注意,现在 UAC 盾牌已从程序图标中消失,您可以以当前用户身份运行它,而无需询问管理员密码。

如果可执行应用程序文件使用数字签名(代码签名证书)进行签名,那么在修改exe文件后,它可能会停止工作或显示警告。

在这种情况下,您可以强制程序使用外部清单文件。创建纯文本文件应用程序名称.exe.manifest(例如,Autologon.exe.manifest)在包含 exe 文件的目录中,并将 Resource Hacker 中的清单代码复制到其中。将 requireAdministrator 替换为作为调用者。保存清单文件。

阅读更多:如何在没有密码的情况下获得 Windows 管理员权限

要使 Windows 在启动 EXE 文件时始终尝试使用外部清单文件,请启用特殊的注册表参数:

REG ADD "HKLMSOFTWAREMicrosoftWindowsCurrentVersionSideBySide" /v PreferExternalManifest /t REG_DWORD /d 1 /f

重新启动 Windows 并确保该程序正在使用外部清单文件并且在没有管理员权限的情况下运行。

创建一个快捷方式以使用保存的管理员密码运行程序

如果运行程序的方法是人类召唤者标志不适用于您的旧应用程序,您可以尝试使用保存的管理员凭据在用户会话中运行此类应用程序。这是在不授予用户本地管理员权限的情况下运行程序的最不安全的方法,因此我们故意将其保留在最后。

要打开该程序,请在桌面上创建一个新的快捷方式。指定计算机名称、本地管理员名称以及目标应用程序可执行文件的完整路径。

例如:

runas /user:wks-123root /savecred "C:CorpAppmyapp.exe"

当您第一次运行该程序时,它将打开一个命令提示符,要求您输入管理员密码。

RunAs 命令,当使用/SaveCRED选项,将用户名和密码保存到 Windows 凭据管理器。

下次运行快捷方式时,runas 工具将自动从凭据管理器获取保存的密码,并使用它在指定的本地管理员帐户下运行应用程序(每次打开快捷方式时都不会提示您输入密码)。

以下命令列出了凭据管理器中保存的密码:

RunDll32.exe keymgr.dll,KRShowKeyMgr

在 Windows 11 上启动此类快捷方式时出现错误:

RUNAS ERROR: Unable to run - C:CorpAppmyapp.exe
740: The requested operation requires elevation.

要解决此问题,请更改快捷方式属性中的命令。将其替换为:

C:WindowsSystem32runas /profile /user:WKS-123root /savecred "cmd.exe /C C:CorpAppmyapp.exe"

正如我们上面提到的,使用 /savecred 选项并不安全。这是因为在其个人资料中保存了管理员密码的用户可以使用它来运行任何具有提升权限的程序或命令,甚至重置管理员帐户密码。存储在凭证管理器中的密码也可以通过 Mimikatz 等工具以纯文本形式转储,因此最好禁用已保存的密码。

在 Windows 上,您可以使用组策略选项禁用在凭据管理器中保存密码网络访问:不允许存储网络身份验证的密码和凭据(计算机配置 -> Windows 设置 -> 安全设置 -> 本地策略 -> 安全选项)。

有几个第三方工具可以让您解决在 runas 中使用存储的管理员密码的缺点。例如,管理员链接,抢夺者,运行方式Spc。这些应用程序允许您存储加密的管理员密码并以管理员权限安全地运行程序。这些工具不允许用户使用保存的凭据运行任何应用程序或命令,因为它们在启动时检查可执行文件的路径和校验和。