ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Windows Terminal 管理员提权:elevate 配置与避坑

Windows Terminal 管理员提权:elevate 配置与避坑 改 hosts 又翻车的那一刻我基本能猜到问题出在哪窗口不是管理员权限。打开记事本、改完保存、弹一句你无权修改此文件然后才想起来应该用 Windows Terminal 的管理员权限打开。这事我踩过不止一次身边同事也总有类似的提问比如我明明右键选了以管理员身份运行为什么whoami出来还是普通用户为什么在管理员 CMD 里敲wt出来的窗口没有提权。Windows Terminal 的提权机制和传统 CMD 窗口不一样它牵扯到进程启动时决定权限多标签共享一个进程单实例转交这几件事理解了这几条你就能把管理员终端变成随手可得的东西而不是每次去开始菜单右键一遍。下面我把实测过的几种打开方式、settings.json里那个很少有人注意的elevate字段、提权之后才会冒出来的坑以及没有管理员权限时的替代路线一次讲清楚。内容偏实操命令都是可以直接抄的。1. 先把权限这件事说透Windows Terminal 的管理员身份是启动时定死的1.1 一个反直觉的实测在管理员 CMD 里敲 wt窗口却不是管理员这是我遇到最多人困惑的一点。我本机实测Windows Terminal 1.21 系列先开着一个普通权限的 Terminal 窗口挂着然后右键 CMD 选以管理员身份运行在这个提权的 CMD 里执行wt新弹出来的 Terminal 窗口用后面的验证命令一查是普通权限。原因不在wt.exe写错了而在 Windows Terminal 的单实例模型wt.exe这个执行别名本身更像一个遥控器它把参数通过进程间通信交给已经在跑的那个 Terminal 实例由那个实例去创建新窗口和新进程。既然那个实例是普通权限的它创建出来的子进程自然也继承普通权限——Windows 的进程权限从来是父进程传给子进程没有哪个进程能凭空把自己或者同类提权。反过来说如果此刻机器上没有任何 Terminal 实例在跑这个提权 CMD 里执行wt有可能真的拉起一个提权窗口因为这时候是它自己在启动新实例。这种看情况的行为最容易让人误判所以我一直建议大家别靠猜靠命令验证。还有一点要记住wt.exe的命令行参数里没有提权开关。能传的是-p指定 profile、-d指定起始目录、--window指定窗口等等唯独没有--elevated这种东西。提权是操作系统层面的事不是终端软件能自己决定的。1.2 三条命令五秒钟确认当前窗口到底有没有提权判断当前窗口是不是管理员别去看标题栏有没有盾牌图标——Windows Terminal 的标题栏不显示这个。我常用下面三条任选其一# 方法一看强制完整性级别S-1-16-12288 是高完整性管理员8192 是普通 whoami /groups | findstr /i S-1-16- # 方法二net session 只有管理员能执行成功 net session $null 21; if ($?) { 管理员 } else { 普通用户 } # 方法三fltmc 列文件系统过滤驱动同样管理员专属 fltmc $null 21; if ($?) { 管理员 } else { 普通用户 }在 CMD 里就把$?那段换成net session nul 21 echo 管理员 || echo 普通用户。我个人偏爱fltmc输出短、不依赖网络组件哪怕网卡驱动出问题也能用。顺带澄清一个高频误解WSL 里的sudo和 Windows 管理员完全没关系。sudo只管提升 Linux 发行版内部的用户权限跟你这个终端窗口在 Windows 侧是不是高完整性级别一点关系都没有。你在 WSL 里sudo完回头调explorer.exe打开C:\Program Files想改东西照样可能被拒。这两套权限体系是并行的别混着推理。1.3 提权状态会沿着标签页和窗格往下传因为多标签、多窗格默认都在同一个 Terminal 进程里所以有一个很实用的推论只要这个窗口本身是提权的你在它里面按CtrlShiftT新开的标签、按AltShiftD复制出来的窗格全都是提权的。我第一次意识到这点是在配一个 PowerShell 脚本标签页里跑Get-Service能读到服务状态另一个窗口同样的命令报权限不足排查半天才发现两个窗口一个是管理员开的、一个是普通开的。这条性质的正向用法很明确需要做一堆提权操作的下午就开一个管理员 Terminal然后把 CMD、PowerShell、WSL 都塞进这一个窗口的标签里不用反复弹 UAC。反向的坑也要记住你在这个窗口里顺手启动的编辑器、构建脚本、包管理器全都是提权的产出的文件和目录可能带上不属于普通用户的权限印记后面在 CI 或者别的机器上复现就莫名其妙报错。所以别把管理员窗口当默认工作环境干完提权的活就切回普通窗口。2. 五种把终端开成管理员的实操方式各自适合什么场景2.1 右键以管理员身份运行最笨但最可靠开始菜单搜terminal或者Windows 终端在结果上右键菜单里就有以管理员身份运行。这条路对任何版本都成立不依赖任何配置出问题时它是第一验证手段——如果这都开不出提权窗口那说明你的账户本身就不在管理员组里后面所有办法都不会生效。要注意的是如果你把这个入口做成了开始菜单磁贴Win11 的开始菜单固定磁贴右键菜单里不一定有以管理员身份运行得回到搜索结果或者所有应用列表里右键。这是很多人说右键没有这个选项的原因。2.2 任务栏固定 CtrlShift 单击我最常用的肌肉记忆这是我日常用得最多的一种因为完全不用改配置正常打开 Windows Terminal在任务栏图标上右键 → 固定到任务栏。以后要提权按住CtrlShift再左键单击任务栏上的图标。或者右键任务栏图标在跳转列表里对着Windows Terminal那一项再右键也有以管理员身份运行。CtrlShift 单击这个组合不只对终端有效对绝大多数固定到任务栏的程序都能触发提权我拿它开过提权的 PowerShell、提权的注册表编辑器、提权的资源管理器提权资源管理器适合处理那些外面看不到的目录但用完记得关别长期用。唯一要注意的是这个方法的前提是那个任务栏图标对应的是一个可以直接启动的 exe。某些商店应用的固定项在部分系统版本上行为不稳定这种情况下退回 2.1 或者下面 2.3 的做法。2.3 快捷方式勾以管理员身份运行适合做长期入口想做一个双击就是管理员终端的入口标准做法是新建一个快捷方式目标填wt.exe它通过应用执行别名解析指向已安装的 Windows Terminal。右键快捷方式 → 属性 → 快捷方式标签页 → 高级 → 勾选以管理员身份运行。把它拖到任务栏或开始菜单。有两点容易踩坑。第一如果你的快捷方式指向的是商店安装的包路径路径里带版本号终端升级之后路径会变快捷方式就失效了。所以更稳的目标是wt.exe这种别名或者先用Get-AppxPackage Microsoft.WindowsTerminal | Select-Object -ExpandProperty InstallLocation把安装目录查出来再拼上WindowsTerminal.exe别自己去资源管理器里翻WindowsApps目录那个目录默认设了访问限制翻不到很正常。第二也是更隐蔽的一个快捷方式属性里还有个运行方式下拉框。如果它被设成了最小化你双击之后会看到 UAC 弹一下然后窗口不见了、只剩任务栏一个图标第一反应会以为是程序崩了。这种提权 最小化启动叠加出来的现象和很多打包安装程序要求管理员权限、双击之后窗口最小化的问题是同一类根因——启动时的窗口显示状态最小化叠加 UAC 抢焦点。我的排查顺序固定是先看快捷方式属性的运行方式是不是常规窗口再看程序清单里是不是要求管理员requireAdministrator最后才怀疑程序本身的显示逻辑。这三步能解决我遇到的九成此类问题。2.4 让提权的控制台程序顺路把终端带起来Windows 11 里可以把 Windows Terminal 设为默认终端应用程序设置里搜默认终端就能找到。设好之后任何启动的控制台程序都会显示在 Windows Terminal 里而不是老的控制台宿主。这条性质的用法是你只要让那个控制台程序是提权的显示它的 Terminal 窗口就是提权的。比如右键 CMD 或 PowerShell 选以管理员身份运行窗口就在 Terminal 里开出来而且权限是对的。反过来从任务管理器运行新任务里勾上以系统管理权限创建此任务再启动cmd效果一样。这个办法的好处是你不需要专门为终端做任何提权配置坏处是入口绕了一圈。2.5 Windows 11 新版的 sudo可以试但别当万能钥匙Windows 11 24H2 之后系统内置了sudo在设置 → 系统 → 开发者选项里开启后可以在命令行前面加sudo来提权执行。它的定位很明确给命令行程序用。拿它来提权跑终端本身实际效果取决于版本和模式设置而且会再弹一次 UAC除非你自己去改 UAC 策略改策略这事我不建议安全代价太大。我的态度是能开就开着用来跑单条提权命令很方便但打开一个管理员终端这件事还是上面几种方式更直接。把五种方式横向摆一下按我的使用频率排序方式操作成本每次弹 UAC适合场景主要坑任务栏 CtrlShift 单击极低是日常随机提权图标来源异常时不稳定右键以管理员身份运行低是排错、验证账户权限磁贴右键可能没有该菜单项快捷方式勾管理员一次性是固定入口、固定 profile包路径带版本号会失效默认终端 提权 cmd中是不想改终端配置入口绕需要先设默认终端系统 sudo中是单条提权命令版本要求高模式设置影响行为3. settings.json 里的 elevate把管理员 PowerShell变成一等公民3.1 配置写法与两个必须记住的路径Windows Terminal 从 1.12 开始支持在 profile 里写elevate: true含义是启动这个 profile 时终端会请求提权弹 UAC。这是把管理员终端从临时操作变成可管理配置的关键字段。{ profiles: { list: [ { name: PowerShell (管理员), guid: {574e775e-4f2a-5b96-ac1e-a2962a402336}, commandline: powershell.exe -NoLogo, icon: ms-appx:///ProfileIcons/pwsh.png, elevate: true, startingDirectory: %USERPROFILE%, hidden: false } ] } }改文件之前先确认路径商店版和便携版的路径不一样商店MSIX安装%LOCALAPPDATA%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json便携非打包/ZIP版本%LOCALAPPDATA%\Microsoft\Windows Terminal\settings.json在终端里直接notepad $env:LOCALAPPDATA\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json最快。注意guid必须唯一别直接复制别人的值否则两个 profile 会打架想省事就把guid整个删掉让终端自己生成一个。另外elevate是profile 级设置写在defaults里对所有 profile 生效这件事我不推荐——那等于每次开终端都弹 UAC用不了三天你肯定会把它删掉。3.2 为什么我建议单独建一个 profile而不是改默认的那个我自己的配置里保留了两套默认 profile 不提权另外加一个名字带(管理员)的 PowerShell profile。理由有三条都是被坑出来的第一日常八成操作不需要提权。git 操作、跑测试、看日志、连 ssh提权没有任何好处反而让新建的文件带上高完整性标签在团队协作或 CI 里偶尔会冒出这个文件为什么在我的机器上能删、在别人机器上删不掉这种问题。第二提权窗口和普通窗口是两个独立进程标签不能互相搬。一个进程里的标签组在这个窗口里另一个进程的是另一组你在普通窗口开了一堆标签想整体提权是做不到的只能重开。第三出问题时排查路径清晰。whoami /groups一跑就知道自己在哪个环境不用去回忆我这个窗口到底是哪个方式开的。如果你确实想让某个 profile 默认就是提权的也可以直接给默认 profile 加elevate: true只是得接受每次启动都弹 UAC——而且弹 UAC 的时候整个屏幕会切到安全桌面正在看的东西会被遮住体验上其实比 CtrlShift 单击更烦。3.3 配置生效的验证方式以及三种不生效的常见原因写完保存之后别急着下结论按这个顺序验证按CtrlShiftP打开命令面板搜你那个新 profile 的名字看它是否出现在列表里。出现了说明 JSON 至少语法正确。从命令面板启动它。按我的实测elevate: true的 profile 触发时会另开一个新窗口并弹 UAC而不是在当前非提权窗口里加一个标签——因为提权必须由新进程完成而当前进程没法给新标签换一个更高的权限令牌。在新窗口里跑fltmc确认权限。如果第 1 步就找不到 profile常见原因有三种JSON 里有多余的逗号或者中文引号从网页复制配置最容易带进来guid和别人重复导致条目被吞掉改了settings.json但改的是另一份文件便携版和商店版各自的配置是分开的这点特别容易搞混。另外提一句不要指望把提权 profile 绑成一个快捷键就能在当前窗口开个提权标签。绑定是可以绑的newTab动作 profile 的 guid但实际行为取决于版本可能是另开窗口也可能是静默失败。想试的话绑完直接按一下看结果别在配置里推演。4. 提权之后才会冒出来的坑从映射盘符消失到拖不进文件4.1 映射的网络驱动器在管理员窗口里不见了这是个经典现象也是很多人以为提权把环境搞坏了的来源普通窗口里net use映射出来的Z:盘在管理员窗口里dir Z:直接报找不到驱动器。根本原因是 UAC 的拆分令牌机制——普通用户令牌和提权令牌属于不同的登录会话而盘符映射是登录会话级的资源。你在普通会话里映射的盘提权会话看不见。反过来也一样。解决办法有两个。临时的在提权窗口里直接net use Z: \\server\share /persistent:no用完即走。长期的把程序里对这个盘的依赖改成 UNC 路径\\server\share\...这条最稳因为 UNC 路径不依赖盘符映射脚本拿去别的机器上也能跑。如果你确实需要让两种会话共享盘符可以改注册表HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System下的EnableLinkedConnections值为 1然后重启。这个开关会让提权会话也能看到用户的映射盘算是个半官方的做法。我不默认推荐它因为改了之后的行为在某些网络环境里会有别的副作用比如同一台共享被挂两次、凭据缓存混乱除非你确实深受其苦否则用 UNC 就够了。4.2 拖拽失效、子进程被连带提权以及那些看起来像 bug的事提权窗口有一批行为跟普通窗口不一样我第一次遇到会以为是终端出问题了其实都是 UAC 的完整性级别保护从普通资源管理器往提权窗口拖文件拖不进去。Windows 不允许低完整性级别的进程向高完整性级别进程发送拖放消息。想往里放文件要么用命令行cd要么先在提权窗口里用start .打开一个同样是提权的资源管理器窗口去拖。在提权窗口里启动的编辑器、终端里的构建工具、包管理器全都是提权的它们生成的子进程也是。VS Code 在提权上下文里跑的时候会提示以管理员身份运行时功能受限某些插件比如本地语言服务、部分调试器会不正常这不是插件坏了。粘贴多行命令的提示。提权窗口里执行多行粘贴终端会弹一次确认提示防止你粘贴进来的内容里有隐藏的换行导致误执行。这个功能默认开着confirmOnPaste: true之类的键值可以在设置里调我建议保持开启。某个 profile 的startingDirectory指向了需要管理员才能进的目录比如C:\Program Files\某工具普通窗口打开它时会 fallback 到别的目录看起来像起始目录配置失效。这种情况配提权 profile 反而正常。还有个小提醒提权窗口的标题栏颜色可以在 profile 里用tabColor或主题色区分开。我给管理员 profile 设了深红色标签扫一眼就知道自己在哪个权限级别比每次敲fltmc快多了。4.3 双击之后窗口最小化/躲在后面这一类现象的统一排查法前面在快捷方式那节提过这里单独说清楚我的排查链路因为它不只出现在 Windows Terminal 上任何要求管理员权限的东西都可能中招先看快捷方式的运行方式。属性 → 快捷方式 → 运行方式如果是最小化改成常规窗口再试。这一步能解决相当一部分案例。看是不是卡在 UAC 提示上。有些系统设置下 UAC 会切到安全桌面如果此时你去点别的东西程序窗口可能被挤到后面任务栏闪一下就被忽略了。看任务栏有没有一个新图标。看程序清单里请求的权限级别。用文本或十六进制方式查看可执行文件内嵌的清单重点看requestedExecutionLevel是asInvoker还是requireAdministrator。如果本身就是requireAdministrator那就一定是先弹 UAC 后启动跟不弹 UAC 就起来的预期冲突。看有没有别的启动器在中间转一手。比如通过某个脚本、某个启动器、某个快捷方式再加一层cmd /c start的包装启动参数里的窗口显示状态可能在传递过程中被改掉。5. 两个最常见的必须提权的活改 hosts 和删顽固文件夹折腾提权权限说到底就是为了干这两件事。把命令存下来比每次现查快得多。5.1 改 hosts注意编码和扩展名这两个老陷阱在提权终端里执行notepad $env:SystemRoot\System32\drivers\etc\hosts保存的时候有两个老陷阱。一是记事本的另存为默认会加.txt后缀文件名变成了hosts.txt看着没差别实际 DNS 客户端读的还是老的hosts。二是编码带 BOM某些情况下会影响第一行的解析。稳妥做法是另存为时把保存类型改成所有文件编码选 ANSI 或 UTF-8 无 BOM。如果你想脚本化用追加的方式更省事Add-Content -Path $env:SystemRoot\System32\drivers\etc\hosts -Value 127.0.0.1 dev.local -Encoding ascii ipconfig /flushdnsipconfig /flushdns这一步别省尤其是浏览器和 IDE 里有自己的缓存改完不刷 DNS 你会以为没生效。5.2 删不掉的文件夹takeown icacls 两件套遇到需要管理员权限才能删除文件夹或者你必须提供管理员权限才能删除此文件在提权终端里三步走# 1. 把所有权拿过来/r 递归/d y 是回答是否对目录也操作的默认应答 takeown /f D:\StubbornFolder /r /d y # 2. 给当前用户完全控制权限/t 递归 icacls D:\StubbornFolder /grant ${env:USERNAME}:(F) /t # 3. 删除 Remove-Item D:\StubbornFolder -Recurse -Force顺序不能反先拿所有权再改权限否则icacls会因为没有权限改权限而失败。如果目标在Program Files下面先确认相关程序已经退出、相关服务已经停止不然文件被占用会以拒绝访问的形式报出来让你误以为是权限问题。这种误判我很长一段时间都犯过把权限改了又改实际上是进程占用。还有一种情况是目录名超长、或者路径里有特殊字符导致命令行解析出问题可以用\\?\D:\超长路径...这种前缀绕开路径长度限制。6. 没有管理员权限怎么办便携版和用户级安装的边界经常有人问机器上没有管理员权限还怎么用 Windows Terminal。答案分两层。第一层已经装了的情况Windows Terminal 作为每个用户独立的应用普通用户是可以正常启动的只是不能提权。你需要的功能多标签、分屏、SSH、WSL基本都能用只有少数需要写系统目录或者操作系统级配置的操作用不了。这种情况下不用纠结提权改 hosts、删系统目录文件夹这类活本来也不该由没有管理员权限的账户去干。第二层根本装不上的情况。这时候有两条不绕路的路子便携版解压即用。Windows Terminal 提供非打包的 ZIP 分发版本解压到你的用户目录下的任意位置直接运行WindowsTerminal.exe就行不需要写入Program Files也不需要注册系统组件。要注意它的配置路径和商店版不一样前文给过以及和系统的一些集成能力会比商店版少一点。用户级安装。如果你用winget很多包支持--scope user安装到用户目录也可以用安装在用户目录下的用户级包管理器。这条路的前提是你自己要装的东西支持用户级部署——写系统服务、装驱动、注册全局文件关联的程序本来就绕不开管理员权限。判断标准很简单这个软件要动的东西在谁的地盘上。动自己用户目录里的东西不需要管理员动Program Files、HKLM注册表、系统服务、驱动就必须管理员。想清楚这一点就不用去琢磨怎么绕过了很多所谓的绕过其实只是换了一个合法路径。6.1 离线安装和装包失败时的排查顺序内网机器上装终端是个高频需求。顺序我一般这么走winget --version确认包管理器可用然后winget install --id Microsoft.WindowsTerminal -e。要离线包用winget download --id Microsoft.WindowsTerminal -e -d C:\temp\wt把下载下来的文件拷到目标机器。在目标机器上Add-AppxPackage -Path .\Microsoft.WindowsTerminal_x.y.z.msixbundle。这里有两个实际的坑。一是系统版本门槛Windows Terminal 对 Windows 10 的最低要求是 1903内部版本 18362级别更老的长期服务版需要挑对应时期的旧版本硬装新包会直接报不兼容。二是提权 PowerShell 装 MSIX 有时反而失败报部署相关的错误码退回普通用户权限的 PowerShell 里再执行一次经常就过了。原因是这类应用包默认是按用户部署的在管理员上下文里安装的归属和目标用户可能对不上。遇到部署失败我一般的动作顺序是换非提权窗口重试 → 检查依赖包 → 看 Release 页面列出的依赖项早期版本需要额外装 VCLibs 类框架包→ 最后才去清理已有的半成品包。排查报错的时候把错误码完整抄下来再搜比截个模糊的图去问人要快得多——Add-AppxPackage的输出里HRESULT那段才是关键信息。
返回列表