powershell运行脚本权限提升

87 2025-11-30 19:10 2025-12-01 14:30

Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。

尝试新的跨平台 PowerShell https://aka.ms/pscore6

加载个人及系统配置文件用了 4027 毫秒。
(python311) PS C:\Users\Administrator> Set-ExecutionPolicy Bypass -Scope LocalMachine -Force
Set-ExecutionPolicy : Windows PowerShell 已成功更新你的执行策略,但在更具体的作业域中定义的策略覆盖了该设置。由于发生覆
盖,你的外壳程序将保留其当前的有效执行策略 RemoteSigned。请键入“Get-ExecutionPolicy -List”以查看你的执行策略设置。有
关详细信息,请参阅“Get-Help Set-ExecutionPolicy”。
所在位置 行:1 字符: 1
+ Set-ExecutionPolicy Bypass -Scope LocalMachine -Force
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : PermissionDenied: (:) [Set-ExecutionPolicy], SecurityException
    + FullyQualifiedErrorId : ExecutionPolicyOverride,Microsoft.PowerShell.Commands.SetExecutionPolicyCommand
(python311) PS C:\Users\Administrator> Set-ExecutionPolicy Bypass -Scope CurrentUser -Force
(python311) PS C:\Users\Administrator> Get-ExecutionPolicy
Bypass
(python311) PS C:\Users\Administrator>

 

我通过powershell命令进入powershell之后再调用run_mqtt.ps1就没有执行策略,而我在文件夹右键点击run_mqtt.ps1文件,选择使用powershell执行,就又出现执行策略。怎么办

原因
两种启动方式 不在同一个“执行策略作用域”
  1. 手动打开 PowerShell 窗口 → 进程级策略已经被 Anaconda 或你之前设过,所以能跑。
  2. 右键 → 使用 PowerShell 运行 → Windows 会 重新开一个 全新的 powershell.exe 进程,没有任何事先设置,于是又回到了默认 Restricted,就再次弹框。
解决思路
把策略写到 “本地计算机”“当前用户”注册表 里,这样不管怎么启动 PowerShell 都能读到;或者给右键菜单加一个“带 Bypass 参数”的入口。下面给你 3 种常用方案,按安全等级从高到低,你挑一个即可。

方案 1:给“当前用户”永久设 RemoteSigned(最干净)
  1. 手动打开的 PowerShell 窗口(已经能跑脚本的那个)里执行:
    powershell
     
复制
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
 
如果之前已经执行过,可再确认一次:
powershell
 
  1. 复制
    Get-ExecutionPolicy -List
     
    确保 CurrentUser 这一行是 RemoteSigned
  2. 关闭窗口。
    以后无论 Win+X → PowerShell右键 → 使用 PowerShell 运行 还是 Anaconda Prompt (PowerShell),都不会再提示。

方案 2:只给“本地计算机”设一次(对所有用户生效,需管理员)
  1. 开始菜单 → Windows PowerShell → 右键 → 以管理员身份运行
  2. powershell
     
  1. 复制
    Set-ExecutionPolicy -Scope LocalMachine RemoteSigned
     
    这样整台电脑所有账户、任何启动方式都统一策略,一次性解决。

方案 3:不改策略,给右键加个“Bypass”条目(最灵活)
如果你不想动全局策略,可以新建一个右键菜单,专门用 -ExecutionPolicy Bypass 启动脚本。
把下面内容保存为 install-bypass-context.reg 并双击导入注册表:
reg
 
复制
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\Bypass-Run]
@="使用 PowerShell (Bypass) 运行"

[HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\Bypass-Run\Command]
@="powershell.exe -ExecutionPolicy Bypass -File \"%1\""
 
导入后,.ps1 文件右键会多出一项
“使用 PowerShell (Bypass) 运行”,点它就不会弹策略框,也不会改动系统策略。

快速结论
  • 最省心:方案 1CurrentUserRemoteSigned,一次搞定。
  • 多人共用电脑:方案 2LocalMachine 设。
  • 完全不想改策略:方案 3 加右键 Bypass 菜单。
任选其一后,右键运行手动打开窗口 都会一致,不再出现执行策略提示。

 

执行策略问题 → 用 Set-ExecutionPolicy -Scope CurrentUser RemoteSigned 未能解决右键点击文件,使用powershell运行被策略拦截的问题。

原因 99% 是 “右键 → 使用 PowerShell 运行” 并没有走真正的 powershell.exe,而是被 Windows 10/11 的 “Windows Terminal”“PowerShell 7” 的新上下文菜单抢了过去;
这些启动器会先开一个 **空白进程 **,再在里面 & "xxx.ps1",于是 CurrentUser 策略虽然已设,但窗口初始阶段仍短暂处于 Restricted,触发拦截。
下面按 “先验证、再一次性根治” 的顺序给出排查/解决步骤,任选其一即可。

一、先确认策略到底写进注册表没有
  1. Win+R → 输入
    powershell.exe -NoProfile -Command "Get-ExecutionPolicy -List"
     
    如果 CurrentUser 列仍显示 Undefined,说明前面命令没成功,再执行一次:
    powershell
     

    powershell.exe -NoProfile打开后再 Get-ExecutionPolicy -List

复制
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned -Force
 
成功后再看应显示:
 
  1. 复制
    Scope            ExecutionPolicy
    -----            ---------------
    MachinePolicy    Undefined
    UserPolicy       Undefined
    Process          Undefined
    CurrentUser      RemoteSigned        ← 必须有这一行
    LocalMachine     Undefined
     
    若这里已正确,继续第二步。

二、检查右键到底调用了哪个“PowerShell”
  1. 随便找个 .ps1 → 右键 → “打开方式”“选择其他应用” → 拉到最底下 “更多应用” → 勾选 “始终使用此应用” → 选 Windows PowerShell(蓝底图标,不是黑色 Terminal 图标)。
    确认后再次双击/右键运行,看是否还拦。
    如果不再拦,说明之前是被 Terminal 抢走了;下面给两种永久改法。

三、永久方案(任选其一)
方案 A 把右键菜单改回 Windows PowerShell(最干净)
把下面内容存为 restore-context.reg 并双击导入:
reg
 
复制
Windows Registry Editor Version 5.00

; 删除 Terminal 的抢占
[-HKEY_CLASSES_ROOT\SystemFileAssociations\.ps1\Shell\0\Command]
[-HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\Open]

; 恢复原生 Windows PowerShell
[HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\Open\Command]
@="\"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe\" -ExecutionPolicy RemoteSigned -File \"%1\""

; 可选:再加一个“以管理员运行”
[HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\runas\Command]
@="\"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe\" -ExecutionPolicy RemoteSigned -Command \"Start-Process powershell -ArgumentList '-ExecutionPolicy RemoteSigned -File \\\"%1\\\"' -Verb RunAs\""
 
导入后右键会看到两项:
  • Open → 普通用户直接跑,不再弹策略。
  • 以管理员运行 → 提权跑,同样不弹。
方案 B 不改菜单,直接给 当前用户 再写一条 “右键自动 Bypass” 条目
reg
 
复制
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\BypassRun]
@="使用 PowerShell (Bypass) 运行"

[HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\BypassRun\Command]
@="\"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe\" -ExecutionPolicy Bypass -File \"%1\""
 
导入后右键多出一项 “使用 PowerShell (Bypass) 运行”,想用就用,原菜单不动。
方案 C 干脆把 LocalMachine 也设成 RemoteSigned(整台电脑一次性解决)
管理员身份 打开 Windows PowerShell,执行:
powershell
 
复制
Set-ExecutionPolicy -Scope LocalMachine RemoteSigned -Force
 
这样 任何进程任何启动方式 都继承 RemoteMachine 策略,右键问题 100% 消失。

四、验证
改完后再右键 .ps1Open(或 BypassRun),应直接运行,不再出现
“执行策略可帮助你防止执行不信任的脚本 …” 的蓝色提示框。

一句话总结
策略已设却仍被拦,几乎总是 右键菜单被 Windows Terminal / PS7 劫持
要么把右键改回原生 powershell.exe(方案 A),要么加一条带 -Bypass 的新菜单(方案 B),或者直接把 LocalMachine 策略也写掉(方案 C),即可彻底消除右键拦截。

 

 

 

 

 

 

 

 

 

 

全部评论

·