如果我的 cmd.exe 窗口在标题栏中显示“管理员”,表明它是以提升的权限启动的,这是否意味着我从该命令窗口执行的任何内容也都是以提升的权限运行的?
具体来说,如果我运行如下命令:
msiexec SomeProgram.msi
我的安装程序是否以提升的权限运行,因为它是从以提升的权限运行的 cmd.exe 执行的?
更具体地说:我想知道是否显示 UI 并立即在 cmd.exe 窗口中返回提示的应用程序(如msiexec
上面的调用)正在以提升的权限执行。
答案1
是的,它确实以提升的权限执行。
简单测试:
您可以通过打开一个提升权限和一个非提升权限的命令提示符来轻松测试这一点。notepad.exe
在两个命令提示符中运行该命令,然后尝试将空白文本文件保存到C:\Windows
。一个命令可以保存,另一个命令会抛出权限错误。
彻底测试:
如果这还不足以确认这一点(它并没有真正让我满意),你可以使用访问检查来自 SysInternals。您需要从提升的命令提示符运行此命令。
让我们首先检查正在运行的两个记事本进程:
记事本: (accesschk.exe -v -p notepad
)
[11140] notepad.exe
Medium Mandatory Level [No-Write-Up, No-Read-Up]
RW DOMAIN\Tannerf
PROCESS_ALL_ACCESS
RW NT AUTHORITY\SYSTEM
PROCESS_ALL_ACCESS
[11004] notepad.exe
High Mandatory Level [No-Write-Up, No-Read-Up]
RW BUILTIN\Administrators
PROCESS_ALL_ACCESS
RW NT AUTHORITY\SYSTEM
PROCESS_ALL_ACCESS
一个在我的域用户名下运行,另一个在管理员内置组下运行。它还有一个强制性标准高。您还可以使用标志-f
来细分权限和令牌。
MSIExec 和 MSI 文件
我认为运行时事情可能会变得有点复杂msiexec
。我有一个方便测试的 Google Chrome 独立安装程序。
msiexec.exe 从提升的提示符启动 Chrome 安装程序:
D:\Users\tannerf>accesschk.exe -p msiexec.exe
[10540] msiexec.exe
RW BUILTIN\Administrators
RW NT AUTHORITY\SYSTEM
MSI 生成的 chrome_installer.exe:
D:\Users\tannerf>accesschk.exe -p chrome_installer.exe
[5552] chrome_installer.exe
NT AUTHORITY\SYSTEM
OWNER RIGHTS
RW NT SERVICE\msiserver
不再那么简单了!看起来好像有一个chrome_installer.exe
进程是通过 MSIServer 服务运行的。
这让我想知道其他安装程序可能会有什么样的行为,因此我运行了一个手边的 Evernote.msi:
提升 msiexec.exe 启动 Evernote 安装程序:
[6916] msiexec.exe
High Mandatory Level [No-Write-Up, No-Read-Up]
RW BUILTIN\Administrators
PROCESS_ALL_ACCESS
RW NT AUTHORITY\SYSTEM
PROCESS_ALL_ACCESS
[4652] msiexec.exe
System Mandatory Level [No-Write-Up, No-Read-Up]
R BUILTIN\Administrators
PROCESS_QUERY_INFORMATION
PROCESS_QUERY_LIMITED_INFORMATION
有趣的是,这次有一个 msiexec.exe 在系统级别下运行。我使用进程监视器发现弹出的实际安装窗口来自系统级 msiexec 进程。终止高强制级别也会终止系统级进程。
非提升的 msiexec.exe 启动 Evernote 安装程序:
[7472] msiexec.exe
Medium Mandatory Level [No-Write-Up, No-Read-Up]
RW DOMAIN\Tannerf
PROCESS_ALL_ACCESS
RW NT AUTHORITY\SYSTEM
PROCESS_ALL_ACCESS
[4404] msiexec.exe
System Mandatory Level [No-Write-Up, No-Read-Up]
R BUILTIN\Administrators
PROCESS_QUERY_INFORMATION
PROCESS_QUERY_LIMITED_INFORMATION
看来 Evernote 无论如何都会获得系统级访问权限。双击安装程序也会有同样的效果。
结论:
我认为,除非另有规定,否则进程将继承权限,这一点已经得到很好的证明。但这并不保证进程msiexec SomeProgram.msi
在所有进程中都以高强制级别运行;它可以在系统级别或 MSIServer 下运行。您的情况可能会有所不同,如果看到许多这些规则似乎被“破坏”的情况,我也不会感到惊讶。
答案2
默认情况下,Windows 进程将从父进程继承其安全上下文:
进程的默认安全描述符中的 ACL 来自于创建者的主要令牌或模拟令牌。
但是,可以生成具有较低权限的进程:
虽然进程会继承生成它的进程的完整性级别,但可以在创建进程时自定义完整性级别。除了在用户界面特权隔离技术中定义窗口消息的边界外,Windows Explorer、Internet Explorer、Google Chrome 和 Adobe Reader 等应用程序还使用强制完整性控制将文档与系统中的易受攻击的对象隔离开来。
维基百科关于强制完整性控制关系到其他 MSDN 页面,还提到这里。另一场演讲还提到了进程继承。
但是,我相信 cmd.exe 将启动具有最高权限继承级别的子进程,正如@Tanner 的测试和回答所示。
答案3
有两种方法可以取消提升所执行命令的权限:
runas /trustlevel:0x20000 "msiexec SomeProgram.msi"
(运行后runas /showtrustlevels
即可了解这0x20000
是默认的用户信任级别 - 这甚至适用于安装/运行“需要”提升权限的程序 - 而无需在以管理员身份运行时实际授予这些权限。这通过坦纳的记事本测试) 按照这个 SU 答案psexec -l -d msiexec SomeProgram.msi
每这个 SU 答案(也许也需要一些“”,我没有测试这个,因为runas
对我来说已经足够好了)