如何使用命令提示符(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