powershell脚本执行策略(如remotesigned、allsigned)仅控制是否允许运行,真正保障可信性的核心是代码签名;它通过私钥生成唯一指纹、公钥验证完整性与来源,防止篡改并确认发布者身份。
powershell 脚本能运行,不等于它该被信任。执行策略只是第一道门槛,真正决定脚本是否可信的,是代码签名——它回答“这脚本真是你写的吗?”
执行策略不是防火墙,而是防误操作开关
默认 Restricted 策略阻止所有 .ps1 文件运行,不是为了拦住黑客,而是防止双击或误执行带来风险。它可被轻易绕过(比如 powershell -ExecutionPolicy Bypass -File script.ps1),所以不能当作安全边界。
- Restricted:仅允许交互命令,适合普通办公电脑
- RemoteSigned:本地脚本直接运行,从网络下载的必须带有效签名——开发环境最常用
- AllSigned:所有脚本(包括本地编写的)都需受信任证书签名,适合生产服务器
- Bypass 和 Unrestricted 极度危险,只应在隔离的自动化管道中临时使用
RemoteSigned 是平衡安全与可用性的首选
它不强制你给每个测试脚本签名,又对来自互联网的脚本保持警惕。设置方法简单,且作用范围可控:
- 仅对当前用户生效(无需管理员权限):
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Force - 查看当前各层级策略:
Get-ExecutionPolicy -List - 若脚本报“无法加载”,先确认是否被系统标记为“来自网络”——可用
Unblock-File .\script.ps1解除阻塞
代码签名才是真实可信的凭证
签名不是加密,而是用私钥生成一段唯一“指纹”,再由公钥验证。别人改了你的脚本,签名立刻失效。
- 测试可用自签名证书:
$cert = New-SelfSignedCertificate -Subject "CN=MyDevTeam" -Type CodeSigningCert -CertStoreLocation "Cert:\CurrentUser\My" - 给脚本签名:
Set-AuthenticodeSignature -FilePath .\deploy.ps1 -Certificate $cert - 验证签名是否有效:
Get-AuthenticodeSignature .\deploy.ps1 | Select-Object Status, StatusMessage - 首次运行签名脚本时,系统会提示“发布者不受信任”——点“始终运行”,证书就自动加入
Cert:\CurrentUser\TrustedPublisher
企业部署需要统一信任链
单台机器上签名有效,不代表全公司都能运行。要让团队成员信任你的脚本,得把签名证书分发到他们的“受信任的发布者”存储区。
- 导出证书(.cer 文件):
Export-Certificate -Cert $cert -FilePath ".\MyDevTeam.cer" - 手动导入:双击 .cer 文件 → “安装证书” → 存储位置选“受信任的发布者”
- 批量部署推荐用组策略(GPO)→ 计算机配置 → 策略 → Windows 设置 → 安全设置 → 公钥策略 → 受信任的发布者
- 避免用 LocalMachine 存储签名证书,除非你有明确的管理员权限和部署流程











