从命令提示符检查正在运行的进程的 UAC 提升

从命令提示符检查正在运行的进程的 UAC 提升

如何使用命令提示符(cmd.exe)检查进程是否以 UAC 提升/提升的权限运行?

如果我使用任务管理器(taskmgr.exe),我可以通过添加“UAC 虚拟化”或在 Windows 8 上添加“提升”列进行检查。(本文解释得很好。

但是我可以通过命令提示符(例如使用 tasklist 或 wmic)获取此信息吗?Windows 中是否还有其他内置命令行工具可以让我检查提升状态?

我的问题适用于所有具有 UAC 的 Windows 操作系统。

答案1

我发现使用 CMD 脚本检查管理员权限的最干净的方法是这样的:

@echo off

REM  Calling verify with no args just checks the verify flag,
REM   we use this for its side effect of setting errorlevel to zero
verify >nul

REM  Attempt to read a particular system directory - the DIR
REM   command will fail with a nonzero errorlevel if the directory is
REM   unreadable by the current process.  The DACL on the
REM   c:\windows\system32\config\systemprofile directory, by default,
REM   only permits SYSTEM and Administrators.
dir %windir%\system32\config\systemprofile >nul 2>nul

REM  Use IF ERRORLEVEL or %errorlevel% to check the result
if not errorlevel 1 echo has Admin privs
if     errorlevel 1 echo has only User privs

此方法仅使用 CMD.exe 内置函数,因此应该非常快。它还会检查进程的实际功能,而不是检查 SID 或组成员身份,因此有效的权限测试。这在 Windows 2003 和 XP 中都有效。普通用户进程或非提升权限的进程无法通过目录探测,而管理员或提升权限的进程则能成功。

答案2

我认为 Windows 中没有内置任何可以在命令行上显示此信息的功能。如果不调用 Win32 函数,即使是 PowerShell 似乎也无济于事。

SysInternals 访问检查可能对你有用:

.\accesschk.exe -p powershell.exe -e

跑高,显示:

[3256] powershell.exe
  Medium Mandatory Level [No-Write-Up, No-Read-Up]
  RW superUserPC2\peter
  RW NT AUTHORITY\SYSTEM
[3660] powershell.exe
  High Mandatory Level [No-Write-Up, No-Read-Up]
  RW BUILTIN\Administrators
  RW NT AUTHORITY\SYSTEM

您可以看到第二个 PowerShell(3660)正在提升运行,因为它具有High Mandatory Level

但是如果你以标准用户身份运行此命令,你会得到:

[3256] powershell.exe
  Medium Mandatory Level [No-Write-Up, No-Read-Up]
  RW superUserPC2\peter
  RW NT AUTHORITY\SYSTEM
Error opening [3660] powershell.exe:
Access is denied.

您仍然会知道第二个 PowerShell 运行速度会提升,因为您已经Access denied为它获得了一个。

.\accesschk.exe -p -f powershell -e

为您提供更多信息

答案3

你可以检查一下任务列表命令

尝试tasklist /v哪个将给你进程哪个进程拥有哪些权限

句法

任务列表/v

示例用法

tasklist.exe /FI “用户名 eq system” /v

这将列出系统用户运行的进程。

答案4

我迟到了,但是这里有一个 PowerShell cmdlet:Test-ProcessElevated

用法:

# from a pipeline:
Get-Process notepad | Test-ProcessElevated

# from a parameter:
Test-ProcessElevated $(Get-Process notepad)

# it returns boolean
if (ps notepad | Test-ProcessElevated)
{
    Write-Host 'notepad.exe is running elevated!'
}

# dwm.exe usually runs in a different session:
ps dwm | Test-ProcessElevated

相关内容