whoami 是什么
whoami 显示当前进程所用的账户身份,并可展开查看 SID、所属组与所持特权。它与其他工具的关键区别是:它看的是「进程令牌」而不是「谁登录了机器」——同一个人通过 UAC 提权前后,whoami /groups 的结果就不一样。排查「权限不够」「服务以谁的身份跑」「令牌里到底有没有管理组」这类问题时,它是最直接的证据来源。
基本信息
| 适用平台 | Windows Vista 及以后(含 10/11、Server),CMD 与 PowerShell 通用 |
|---|---|
| 语法 | whoami [/user] [/groups] [/priv] [/all] [/fqdn] [/upn] [/fo 格式] |
| 常用开关 | /user 显示 SID、/groups 显示组成员、/priv 显示特权、/all 全量输出 |
| 扩展参数 | /fqdn 以域\用户全称显示、/upn 显示用户主体名、/nh 去掉表头、/fo csv|table|list |
| 权限要求 | 普通用户即可;查看自身令牌不需要提权 |
典型使用场景
- 服务排障:确认服务进程实际以 SYSTEM、NetworkService 还是域账户身份运行
- 权限核查:比对提权与未提权窗口的组成员差异,解释「同样的操作两个窗口结果不同」
- 特权确认:安装、卸载、备份类操作前确认令牌里是否有对应特权
- 脚本自检:脚本开头记录当前身份,出问题时可回溯是哪个账户在跑
- 域内巡检:用 /fqdn 明确是本域账户还是本机账户、还是来自其他域
常用示例
常用示例
whoami # 当前账户(域\用户名或主机名\用户名)
whoami /user # 当前账户的 SID
whoami /groups # 列出所属组、SID 与启用状态
whoami /priv # 列出令牌中的特权与开关状态
whoami /all # 用户 + 组 + 特权 + 完整性级别
whoami /groups | findstr /i "Administrators" # 只关心是否在管理组
whoami /priv | findstr /i "SeDebug" # 排查调试权限是否存在
whoami /fqdn # 域环境下的完整标识
whoami /groups /fo csv /nh # 便于脚本解析的成分数据输出逐列读法
| 列/字段 | 含义 | 异常或易误读 |
|---|---|---|
| 用户名 | 进程令牌对应的账户 | 提权窗口与普通窗口可能显示同一个名字 |
| SID | 账户唯一安全标识符 | 域账户以 S-1-5-21- 开头,本机账户含机器 SID |
| 组名与类型 | 安全组(Security)或别名,如 Administrators | 中文系统显示为「BUILTIN\Administrators」等本地化名称 |
| 属性 | 组在令牌中的状态:必需、已启用、已禁用、仅用于拒绝 | UAC 未提权时管理组显示「仅用于拒绝」,属正常现象 |
| 特权 | 如 SeShutdownPrivilege、SeBackupPrivilege、SeDebugPrivilege | 显示「已禁用」不代表没有该特权,可能只是默认关闭 |
UAC 是过滤令牌机制:标准用户登录管理员账户时,进程令牌里的 Administrators 会以「仅用于拒绝」出现,这不是账户出了问题,而是令牌被降权;提权窗口中同一项会变成「已启用」。
whoami 反映的是当前进程令牌,不是机器上的登录会话列表。要看「有谁登录了这台机器」用 query user,要看「近期登录记录」用事件日志 4624/4648。
看清真实身份的其它视角
看清真实身份的其它视角
whoami.exe # PowerShell 里也可直接调用
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name # .NET 口径的账户名
[System.Security.Principal.WindowsIdentity]::GetCurrent().IsSystem # 是否 SYSTEM
echo %username% %userdomain% # 环境变量口径,注意它可能被脚本改动排查服务身份时不要只看服务属性页里配置的账户:那只是配置,真正生效要看进程令牌。用 whoami 在该服务的运行上下文里执行,或查看服务进程所属账户,才能确认实际身份。