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

时间:2020-01-09 10:46:52  来源:igfitidea点击:

启动时,许多程序都需要权限提升(在应用程序图标上带有屏蔽),但实际上,它们不需要管理员权限即可正常运行。例如,我们可以在程序使用的ProgramFiles和/或者注册表配置单元中的app文件夹上为用户手动授予权限。因此,当在常规用户帐户下启动此类程序时(如果在计算机上启用了"用户帐户控制"),将出现UAC提示,并且要求用户输入管理员密码。要绕过此机制,许多用户可以通过将用户帐户添加到本地组Administrators来简单地禁用UAC或者向计算机上的用户授予admin特权。当然,这两种方法都不安全。

为什么某些Windows应用程序不能在标准用户下运行并且需要管理员权限?

应用可能需要管理员权限才能修改C:\Program Files(x86)\ SomeApp中其自己文件夹中的某些文件(日志,配置等)。默认情况下,用户对此目录没有编辑(写入和修改)权限。为了使该程序正常工作,需要管理员权限。若要解决此问题,我们必须在NTFS级别的app文件夹上手动授予用户(或者Users组)的修改和/或者写入权限。

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

如何在标准用户下运行需要管理员特权的程序?

前面我们描述了如何使用RunAsInvoker参数为特定应用禁用UAC提示。但是,这种方法不够灵活。我们也可以使用RunAs和保存的管理员密码来使用

/SAVECRED

选项(也不安全)。让我们考虑一种在没有管理员特权(无需输入管理员密码)和启用UAC(UAC滑块的级别4、3或者2)的情况下强制运行任何程序的简便方法。

让我们以注册表编辑器为例" regedit.exe"(位于C:\Windows \文件夹中)。当我们启动regedit.exe时,会出现UAC窗口,并且如果我们不确认海拔高度,则注册表编辑器将不会运行。

在桌面上创建包含以下代码的文本文件" run-as-non-admin.bat":

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

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

然后,注册表编辑器应在没有UAC请求的情况下启动。如果打开任务管理器并添加" Elevated"列,我们将看到系统中存在regedit.exe进程,但没有提升状态(使用标准用户权限运行)。

尝试编辑HKLM注册表配置单元中的任何参数。如我们所见,用户无法在此注册表项中编辑注册表(该用户没有对系统注册表配置单元的写权限)。但是我们可以在用户分支HKCU中添加或者编辑注册表项和参数。

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

run-app-as-non-admin.batSet ApplicationPath="C:\Program Files\SomeApp\testapp.exe" cmd /min /C "set __COMPAT_LAYER=RUNASINVOKER && start "" %ApplicationPath%"

我们还可以添加一个上下文菜单,该菜单允许运行所有应用程序而无需提升。为此,创建以下REG文件并导入注册表。

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

之后,要在没有管理员特权的情况下运行任何应用程序,只需在上下文菜单中选择"以没有UAC特权提升的用户身份运行"。

__COMPAT_LAYER环境变量和RunAsInvoker参数

环境变量__COMPAT_LAYER允许我们为应用程序设置不同的兼容性级别(EXE文件属性中的"兼容性"选项卡)。使用该变量,可以指定启动程序时要使用的兼容性设置。例如,要以Windows 8兼容模式和640480分辨率启动应用程序,请设置以下内容:

set __COMPAT_LAYER=Win8RTM 640x480

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

  • RunAsInvoker在没有UAC提示的情况下以父进程的特权运行应用程序;
  • " RunAsHighest"以用户可用的最高级别权限运行程序(如果用户具有管理员权限,则将显示UAC提示);
  • " RunAsAdmin"以管理员身份运行应用(每次都会出现UAC提示)。

这意味着RunAsInvoker参数不提供管理员权限,而仅阻止UAC窗口。