在 Windows 终端中使用提升的权限打开 Windows 终端

42

这里有许多问题询问如何从PowerShell提升权限,几乎所有的建议都是使用这个命令:

Start-Process -Verb RunAs powershell.exe .....

(或者使用 Powershell Core 的 pwsh.exe)

这个命令可以打开一个新的具有提升权限的 Powershell 窗口,在经过 UAC 阻止以验证访问后执行。

但是,虽然我正在使用 Powershell,但我是在 Windows Terminal 中进行操作的,Windows Terminal 是 Windows 10 的新终端应用程序,我希望打开一个具有提升权限的 Windows Terminal 实例,而不仅仅是一个 Powershell 窗口。

所以我尝试了以下命令:

Start-Process -Verb RunAs wt
Start-Process -Verb RunAs wt.exe
Start-Process -Verb RunAs (Get-Command wt)
Start-Process -Verb RunAs "C:\Users\lasse\AppData\Local\Microsoft\WindowsApps\wt.exe"

所有的尝试都失败了:

Start-Process: 由于错误,无法运行此命令: 文件无法被系统访问。

我猜想这与可执行文件所在的位置有关, 它位于我的个人资料中, 但是如果我右键单击任务栏上的 Windows 终端图标并选择以管理员身份运行, 它就可以正常打开. 这就是我想复制的方法.

那么有没有办法修改我尝试过的命令或更改一些访问设置以使其工作呢?

对于我的具体情况, 我只想简化打开管理员终端的步骤, 我不需要升级任意命令的方式, 然后我将高兴地使用我已经展示在这里的命令.

13个回答

39

目前你无法在命令行中直接打开 wt.exe 的提权会话,需要采用一些变通方法。这些方法包括使用gsudo、使用任务计划程序(我测试过可以用,但需要使用 wt.exe 的完整路径并且可以跳过创建快捷方式的步骤),或者如果你能接受使用键盘快捷键,则最简单的方法是从任务栏中,使用键盘快捷键以管理员身份运行 Windows 终端。

根据你的需求:

就我个人而言,我只是希望更轻松地打开管理员终端,而不需要提升任意命令的权限,所以我很乐意使用我已经展示的方法。

最简单的方法如下:

将 Windows 终端固定为任务栏上的第一个项目。然后按 Win+Ctrl+Shift+1 以管理员身份打开它。

如果你确实必须在 Windows 终端内部的命令行中启动 Windows 终端,则可以在任务计划程序中创建一个任务:

  1. 给任务起个名字,勾选“使用最高权限运行”。
  2. 选择“操作”选项卡,点击“新建”,选择“启动程序”作为操作。在“程序/脚本”字段中输入 wt.exe 的完整路径。然后点击“确定”,再次点击“确定”即可。
  • 点击“条件”选项卡,取消选择“仅在计算机使用交流电时启动任务”。
  • 点击“设置”选项卡,确保选择“允许按需运行任务”,并取消选择“如果运行时间超过,则停止任务”。
  • 最后,在您的Shell(PowerShell)中,通过运行以下命令启动一个提升权限的Windows终端会话:schtasks /run /TN "TASK_NAME",其中TASK_NAME是您在步骤1中给出的任务名称。

  • 6
    把“pin-to-taskbar”固定到任务栏是一个适合我的解决办法。如果你有PowerToys,另一个选择是:
    1. 按下Alt+Space,输入Terminal
    2. 选择“以管理员身份运行”(或按Ctrl + Shift + Enter)
    • https://github.com/microsoft/PowerToys
    • https://github.com/microsoft/winget-cli
    - kramfs
    1
    请注意,不要浏览到wt.exe。当您保存时,它会出现错误,因为wt.exe中有0字节,您会得到一些系统错误。打开cmd提示符,输入where wt.exe,然后复制/粘贴该路径。但是对我来说,所有这些只是在Windows终端之外启动了一个新的PowerShell会话。对于我来说,“TASK_NAME”必须是“Microsoft<任务名称>”,否则我会得到“系统未找到”的错误。 - user3622356
    我使用chocolatey安装了gsudo,并将其添加到我的默认配置文件中:"commandline": "gsudo powershell.exe"。一个小的侧面说明:Windows终端现在也有一个“startOnUserLogin”选项(或在“启动”下的配置GUI中启用)。 - WizxX20
    Win+Ctrl+Shift 然后在任务栏上单击图标对我有用。 - ch271828n

    19

    试试这个:

    powershell "Start-Process -Verb RunAs cmd.exe '/c start wt.exe'"
    

    还可以查看以下链接:

    WT.exe命令行参数: https://learn.microsoft.com/en-us/windows/terminal/command-line-arguments?tabs=windows

    关于在资源管理器中添加打开Windows终端命令提示符的文章(包括管理员权限): https://dkcool.tailnet.net/2020/07/add-open-windows-terminal-command-prompt-to-the-explorer-context-menu-in-windows-10/

    关于在资源管理器中添加打开管理员命令提示符的文章: https://dkcool.tailnet.net/2019/05/add-open-admin-command-prompt-to-the-explorer-context-menu-in-windows-10/


    2
    如果您想使用特定的配置文件,则可以使用 powershell "Start-Process -Verb RunAs cmd.exe '/c start wt.exe -p ""<<您的配置文件名称>>""'" - mu88

    14

    最近的更新中,这个问题似乎已经被修复了。现在它可以正常工作,就像你最初尝试并失败的那样(Start-Process -verb RunAs wt)。我建议使用最新版本再次尝试(至少是Windows Terminal,可能还包括PowerShell)。

    不再需要任何解决方法了!


    同意 - 无论是什么修复措施,它已经存在足够长的时间,在至少 Windows Terminal 1.4(当前版本之前的完整版本)中应该已经起作用了,因此不需要预览。或者这可能是 PowerShell 发布中的修复。我知道我自己至少已经这样做了6个月。 - NotTheDr01ds
    也有可能原始用户只是路径问题(当时应该是答案的一部分)。也许他们是通过 Github 发布而不是通过商店安装了 Windows 终端? - NotTheDr01ds
    2
    我正在运行Windows Terminal预览版v1.6.10412.0和Windows终端稳定版v1.5.10411.0,但在尝试在它们中的任何一个上运行“Start-Process -Verb RunAs wt”时仍然出现“系统无法访问该文件”的错误。因此,我只需按照正常流程,在固定到任务栏的项上右键单击,在跳转列表中右键单击“Windows Terminal”,然后选择“以管理员身份运行”。虽然有点不太顺畅,但至少可用。 - Mike Loux
    @MikeLoux:这可能是这个帖子中最简单的答案。运行得非常好。 - Simon Elms
    事实上,您需要以管理员身份运行此命令才能在WT中成为管理员。因此,如果您在Powershell中以非特权用户身份运行它,则无法正常工作。 要检查您当前是否是Powershell中的管理员,请使用此解决方案:https://serverfault.com/questions/95431/in-a-powershell-script-how-can-i-check-if-im-running-with-administrator-privil - t7e

    14

    如果你使用了PowerToys,还有一个选项不是直接回答问题,而是:

    1. 按下Alt + Space,输入Terminal,
    2. 选择以管理员身份运行(或者Ctrl + Shift + Enter)

    你可以使用WinGet来安装PowerToys。


    1
    我不使用powertoys运行应用程序,因为它在我的系统上受到严格限制,似乎只能找到直接安装的东西,而不能找到路径中所有可用的东西,所以我跳过了它,但还是谢谢你的建议。 - Lasse V. Karlsen
    2
    有趣的是,我的系统索引相当不错。我在某个地方保存了一个 cloud-config 文件,只需键入“cloud”就可以找到它。我键入 ubuntu,它就能找到由 Multipass 配置的运行 k3s-master,所以我对此很有经验。 - kramfs
    我已经安装了它,但似乎还有些东西我没弄明白,每次都会被要求输入UAC提示。 - IbrarMumtaz

    5

    1
    在设置中,点击“打开JSON文件”,然后在“defaults”部分中添加“elevate”: true。但是(截至3/22),您需要先安装终端的预览版本。我并不总是需要提升权限,所以我选择了另一个答案中概述的Power Tools选项。我已经安装了它,因为我喜欢Power Tools用于其他事情,比如将我的宽屏显示器分成3个部分。 - MattC
    我的电脑已经应用了这个设置,每次打开它时都会提示我进行用户账户控制。 - IbrarMumtaz

    3

    将Windows终端图标固定到任务栏,并在左键单击时按住Ctrl + Shift


    2
    我喜欢这个解决方案;它为我节省了很多痛苦。 - Ben Collins
    1
    这不是问题所在... - 71GA
    @71GA 这不是最好的解决方法,但对于一些人来说还算可以 - 至少在 这个 合并到主分支之前。 - mbx
    在最新版本的Windows 11上,固定到任务栏的快捷方式,在你右键点击时,只会打开应用程序。每次都会提示用户账户控制(UAC)。 - IbrarMumtaz

    2

    在我的情况下,我需要始终以管理员身份打开Windows终端。这是我所做的:运行“where wt”以显示Windows终端应用程序exe所在的路径,它应该位于C:\Users\YOURUSER\AppData\Local\Microsoft\WindowsApps\wt.exe。 我创建了一个到该文件的快捷方式,并在高级属性中选中“以管理员身份运行”,然后将其固定到开始菜单即可。如果您想要,之后可以删除临时快捷方式。


    我为我的Windows终端创建了一个sudo命令,可以使用它来生成具有管理员权限的Windows终端实例。 - Lasse V. Karlsen

    2
    您可以使用此PowerShell脚本创建一个快捷方式,始终以管理员身份运行Windows终端:
    $WshShell = New-Object -comObject WScript.Shell
    $Shortcut = $WshShell.CreateShortcut("$Home\Desktop\Windows Terminal.lnk")
    $Shortcut.TargetPath = "$env:LOCALAPPDATA\Microsoft\WindowsApps\Microsoft.WindowsTerminal_8wekyb3d8bbwe\wt.exe"
    $Shortcut.Save()
    
    $bytes = [System.IO.File]::ReadAllBytes("$Home\Desktop\Windows Terminal.lnk")
    $bytes[0x15] = $bytes[0x15] -bor 0x20 #set byte 21 (0x15) bit 6 (0x20) ON 
    [System.IO.File]::WriteAllBytes("$Home\Desktop\Windows Terminal.lnk", $bytes)
    

    您只需将其粘贴并在Windows Powershell ISE中运行,它将在您的桌面上创建一个Windows Terminal.lnk文件。每当您双击该快捷方式时,Windows终端将作为管理员运行。


    1

    我知道这个答案不完全符合你的问题,但是考虑到其他答案也是朝着这个方向的,我希望这不会干扰讨论。

    我总是需要以管理员身份运行PowerShell,并且我只想使用Windows Terminal,但由于其限制,无法配置为始终作为管理员运行。

    我讨厌使用我在网上找到的快捷方式和其他技巧,所以我认为我找到了一个更好的解决方案,但你必须支付启动时1/2秒的代价。

    1. 使用 $PROFILE 查找您的用户配置文件(配置文件是 Windows PowerShell ISE 脚本,在启动新会话时自动运行)
    2. 使用任何首选编辑器编辑配置文件 _ code $PROFILE
    3. 将以下代码添加到配置文件并保存
    if (-NOT ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) {
        $host.ui.rawui.windowtitle="Bootstrapper"
        Start-Process -Verb RunAs wt
    } else {
        $Processes = Get-Process | Where-Object {$_.mainWindowTitle -eq 'Bootstrapper' -and $_.name -eq 'WindowsTerminal'}
        if($Processes.count -gt 0)
        {
            Stop-Process -Id $Processes[0].id
        }
    }
    

    这个脚本的作用是什么? 您可以将 Windows 终端图标固定到应用程序栏中,当您单击该图标时,WT 将以非提升用户身份启动,但配置文件会理解这种情况。 当您不以管理员身份运行时,它会更改窗口名称并启动一个新的 WT 作为管理员。 新实例还将执行配置文件,如果该实例正在以管理员身份运行,则会查找名为 Bootstrapper 的 WT 并将其终止。 此过程需要一到两秒钟,我更喜欢这种方式而不是右键单击图标。

    0

    我目前在我的settings.json配置文件的profiles列表中添加了以下内容,以将升级后的Windows Terminal添加到下拉选项中:

    {
        // https://github.com/microsoft/terminal/issues/632#issuecomment-663686412
        "name": "Windows Terminal (elevated)",
        "commandline": "%SystemRoot%\\System32\\WindowsPowerShell\\v1.0\\powershell.exe -Command Start-Process -Verb RunAs \"shell:appsFolder\\Microsoft.WindowsTerminal_8wekyb3d8bbwe!App\"",
        "hidden": false,
        "icon": "ms-appx:///Images/Square44x44Logo.targetsize-32.png"
    }
    

    带有 GitHub 链接的评论应该可以让您找到我最初发现这些信息的地方。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接