一、PowerShell执行权限那些事儿

每次双击ps1脚本都弹出红色警告?别慌,这其实是PowerShell的安全机制在保护你。就像你家防盗门有多重锁一样,PowerShell也有四道安全门(执行策略):

# 查看当前执行策略(技术栈:Windows PowerShell 5.1)
Get-ExecutionPolicy -List

# 典型输出示例:
#        Scope ExecutionPolicy
#        ----- ---------------
# MachinePolicy       Undefined
#    UserPolicy       Undefined
#       Process       Undefined
#   CurrentUser       Undefined
#  LocalMachine    Restricted

看到那个"Restricted"了吗?这就是阻止你运行脚本的"元凶"。这种设计其实很聪明——想想看,如果随便一个脚本都能自动执行,那和把银行密码写在便利贴上有什么区别?

二、破解执行权限的六种武器

2.1 临时通行证(-ExecutionPolicy参数)

# 单次运行脚本时临时放宽限制(技术栈:PowerShell Core 7.2)
powershell.exe -ExecutionPolicy Bypass -File .\your_script.ps1
# 就像用访客卡进公司大楼,用完即失效

2.2 长期签证(Set-ExecutionPolicy)

# 为当前用户永久设置中等安全级别(推荐日常使用)
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
# 相当于给你的脚本颁发"可信作者"证书

3.3 数字签名解决方案

# 给脚本加上数字签名(需代码签名证书)
$cert = Get-ChildItem -Path Cert:\CurrentUser\My -CodeSigningCert
Set-AuthenticodeSignature -FilePath .\server_config.ps1 -Certificate $cert
# 相当于给脚本装上防伪二维码

三、企业级场景生存指南

3.1 域环境下的组策略配置

# 通过组策略批量设置(技术栈:Active Directory)
# 在GPMC中配置:计算机配置 -> 策略 -> 管理模板 -> Windows组件 -> Windows PowerShell
# 建议设置为"RemoteSigned",既安全又实用

3.2 CI/CD中的自动化处理

# Azure DevOps Pipeline示例(技术栈:Azure DevOps)
steps:
- task: PowerShell@2
  inputs:
    targetType: 'inline'
    script: |
      # 临时解除限制执行部署脚本
      Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass -Force
      .\deploy.ps1
    workingDirectory: '$(System.DefaultWorkingDirectory)'

四、那些年我们踩过的坑

4.1 32位 vs 64位陷阱

# 在64位系统上特别注意:
# 32位PowerShell的配置存放在:HKLM\SOFTWARE\Wow6432Node\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell
# 64位则是:HKLM\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell

4.2 杀毒软件的"热心帮助"

# 当脚本被误杀时的处理流程:
1. 将脚本加入杀软白名单
2. 检查脚本内容是否确实安全
3. 必要时联系杀毒软件厂商提交误报

五、高级玩家的秘密武器

5.1 自定义约束语言模式

# 创建受限会话(技术栈:PowerShell 5.1+)
$session = New-PSSession -ConfigurationName RestrictedLangMode
Enter-PSSession -Session $session
# 此时只能运行基础命令,像给PowerShell戴上牙套

5.2 JEA(Just Enough Administration)

# 创建JEA端点示例:
New-PSSessionConfigurationFile -Path .\WebAdmin.pssc -SessionType RestrictedRemoteServer -RoleDefinitions @{ 'CONTOSO\WebAdmins' = @{ RoleCapabilities = 'WebServer' } }
# 让运维人员只能管理Web服务,无法碰数据库

六、最佳实践清单

  1. 开发环境使用"RemoteSigned"
  2. 生产环境使用"AllSigned"配合代码签名
  3. 所有共享脚本必须包含帮助文档
  4. 重要脚本实施版本控制
  5. 定期审计执行日志
# 日志审计示例(技术栈:PowerShell 5.1+)
Get-WinEvent -LogName "Microsoft-Windows-PowerShell/Operational" | 
Where-Object {$_.Id -eq 4104} | 
Select-Object -First 10 | 
Format-Table -AutoSize
# 这相当于PowerShell的"行车记录仪"

记住,执行权限不是敌人而是保镖。就像你不会因为嫌麻烦就拆掉汽车的安全气囊,也不应该为了方便就完全禁用PowerShell的安全机制。找到适合你使用场景的平衡点,让这个强大的工具既安全又好用。

下次再遇到执行权限问题时,不妨把这篇文章当成维修手册。毕竟,了解规则的人才能真正玩转游戏,不是吗?