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执行,就又出现执行策略。怎么办
原因
两种启动方式 不在同一个“执行策略作用域”:
两种启动方式 不在同一个“执行策略作用域”:
-
手动打开 PowerShell 窗口 → 进程级策略已经被 Anaconda 或你之前设过,所以能跑。
-
右键 → 使用 PowerShell 运行 → Windows 会 重新开一个 全新的
powershell.exe进程,没有任何事先设置,于是又回到了默认Restricted,就再次弹框。
解决思路
把策略写到 “本地计算机” 或 “当前用户” 的 注册表 里,这样不管怎么启动 PowerShell 都能读到;或者给右键菜单加一个“带 Bypass 参数”的入口。下面给你 3 种常用方案,按安全等级从高到低,你挑一个即可。
把策略写到 “本地计算机” 或 “当前用户” 的 注册表 里,这样不管怎么启动 PowerShell 都能读到;或者给右键菜单加一个“带 Bypass 参数”的入口。下面给你 3 种常用方案,按安全等级从高到低,你挑一个即可。
方案 1:给“当前用户”永久设 RemoteSigned(最干净)
-
在 手动打开的 PowerShell 窗口(已经能跑脚本的那个)里执行:powershell
复制
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
如果之前已经执行过,可再确认一次:
powershell
-
复制
Get-ExecutionPolicy -List确保CurrentUser这一行是RemoteSigned。 -
关闭窗口。
以后无论 Win+X → PowerShell、右键 → 使用 PowerShell 运行 还是 Anaconda Prompt (PowerShell),都不会再提示。
方案 2:只给“本地计算机”设一次(对所有用户生效,需管理员)
-
开始菜单 → Windows PowerShell → 右键 → 以管理员身份运行
-
powershell
-
复制
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\""
导入后,
“使用 PowerShell (Bypass) 运行”,点它就不会弹策略框,也不会改动系统策略。
.ps1 文件右键会多出一项“使用 PowerShell (Bypass) 运行”,点它就不会弹策略框,也不会改动系统策略。
快速结论
-
最省心:方案 1 给
CurrentUser设RemoteSigned,一次搞定。 -
多人共用电脑:方案 2 给
LocalMachine设。 -
完全不想改策略:方案 3 加右键 Bypass 菜单。
任选其一后,右键运行 和 手动打开窗口 都会一致,不再出现执行策略提示。
执行策略问题 → 用 Set-ExecutionPolicy -Scope CurrentUser RemoteSigned 未能解决右键点击文件,使用powershell运行被策略拦截的问题。
原因 99% 是 “右键 → 使用 PowerShell 运行” 并没有走真正的
这些启动器会先开一个 **空白进程 **,再在里面
powershell.exe,而是被 Windows 10/11 的 “Windows Terminal” 或 “PowerShell 7” 的新上下文菜单抢了过去;这些启动器会先开一个 **空白进程 **,再在里面
& "xxx.ps1",于是 CurrentUser 策略虽然已设,但窗口初始阶段仍短暂处于 Restricted,触发拦截。下面按 “先验证、再一次性根治” 的顺序给出排查/解决步骤,任选其一即可。
一、先确认策略到底写进注册表没有
-
Win+R → 输入
powershell.exe -NoProfile -Command "Get-ExecutionPolicy -List"如果CurrentUser列仍显示Undefined,说明前面命令没成功,再执行一次:powershellpowershell.exe -NoProfile打开后再Get-ExecutionPolicy -List
复制
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned -Force
成功后再看应显示:
-
复制
Scope ExecutionPolicy ----- --------------- MachinePolicy Undefined UserPolicy Undefined Process Undefined CurrentUser RemoteSigned ← 必须有这一行 LocalMachine Undefined若这里已正确,继续第二步。
二、检查右键到底调用了哪个“PowerShell”
-
随便找个
.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% 消失。四、验证
改完后再右键
“执行策略可帮助你防止执行不信任的脚本 …” 的蓝色提示框。
.ps1 → Open(或 BypassRun),应直接运行,不再出现“执行策略可帮助你防止执行不信任的脚本 …” 的蓝色提示框。
一句话总结
策略已设却仍被拦,几乎总是 右键菜单被 Windows Terminal / PS7 劫持;
要么把右键改回原生
要么把右键改回原生
powershell.exe(方案 A),要么加一条带 -Bypass 的新菜单(方案 B),或者直接把 LocalMachine 策略也写掉(方案 C),即可彻底消除右键拦截。
全部评论