下载的PowerShell脚本被Windows Defender删除的相关技术咨询
自有PowerShell脚本被Windows Defender误删相关问题技术解答
一、脚本下载后是否可编程化添加至Windows Defender排除列表
- 该操作完全可行,属于Windows Defender原生支持的能力,可直接通过PowerShell命令完成,无需依赖第三方工具。
- 常用的排除规则配置命令(需管理员权限执行,普通用户权限会被系统拒绝修改,规则配置完成后即时生效,无需重启Defender服务):
- 按文件夹路径添加排除:
Add-MpPreference -ExclusionPath "你的自有脚本存储的完整文件夹路径" - 按进程添加排除:
Add-MpPreference -ExclusionProcess "powershell.exe", "pwsh.exe" - 按文件类型添加排除(仅建议在专属隔离的脚本目录场景使用,避免全局开放风险):
Add-MpPreference -ExclusionExtension ".ps1", ".psm1"
- 按文件夹路径添加排除:
- 关键操作提示:必须在脚本下载落地完成的第一时间添加排除规则。如果等Defender完成实时扫描、将文件判定为威胁并删除/隔离后再加排除,被清除的脚本不会自动恢复,需要从Defender隔离区手动还原。
二、Unrestricted执行策略的风险、自签名流程与临时策略切换方案的可行性
Unrestricted执行策略的实际安全边界
- 相比RemoteSigned策略,Unrestricted的安全约束确实更宽松,但并非无防护的完全开放:
- 核心规则差异:RemoteSigned要求所有从互联网下载的带Mark-of-the-Web(MotW)标识的脚本必须带有效签名才能运行;Unrestricted不强制要求互联网来源脚本的签名,但会在交互式执行这类文件时弹出确认窗口,要求用户手动授权后才能运行。
- 真实风险点:如果脚本通过计划任务、无窗口后台进程等非交互方式启动,Unrestricted策略下的用户确认弹窗不会触发,无签名的恶意下载脚本会被直接放行执行,没有额外拦截。
PowerShell脚本自签名(含自签证书)的操作流程
- 完全可以通过自签名证书完成自有脚本的签名,无需购买商业代码签名证书,所有操作均可通过系统原生PowerShell命令实现:
- 在本地用户证书存储生成代码签名类型的自签名证书:
New-SelfSignedCertificate -Type CodeSigningCert -Subject "CN=LocalOwnPSCode" -CertStoreLocation "Cert:\CurrentUser\My" - 将生成的自签名证书复制到本地受信任的根证书、受信任的发布者存储区,避免PowerShell运行时抛出“证书不受信任”的拦截报错:
- 复制到受信任根目录:
Copy-Item "Cert:\CurrentUser\My\<你的证书指纹字符串>" "Cert:\CurrentUser\Root\" - 复制到受信任发布者目录:
Copy-Item "Cert:\CurrentUser\My\<你的证书指纹字符串>" "Cert:\CurrentUser\TrustedPublisher\"
- 对目标脚本添加数字签名:
Set-AuthenticodeSignature -FilePath "你的脚本完整路径" -Certificate (Get-ChildItem "Cert:\CurrentUser\My" -CodeSigningCert)[0]
- 在本地用户证书存储生成代码签名类型的自签名证书:
- 签名完成后,保持RemoteSigned执行策略即可正常运行脚本,同时因为脚本不再是无签名的下载文件,被Defender误报删除的概率会大幅降低。
关于“临时切换为Unrestricted策略、下载文件、添加排除后切回RemoteSigned”的方案评估
- 该方案的逻辑存在认知误区,实际操作中无法达到预期的避免文件被删的效果:
- PowerShell的执行策略是脚本运行层面的拦截规则,仅作用于PowerShell进程自身的脚本加载流程;Windows Defender的文件扫描是独立的系统级防护机制,两者完全没有联动。就算临时把执行策略切到Unrestricted,Defender依然会在文件下载落地的瞬间启动实时扫描,该删除还是会删除,执行策略的切换对Defender的扫描动作没有任何影响。
- 更合理的操作流程为:保持RemoteSigned执行策略不做临时切换 → 提前创建专属的自有脚本存储文件夹,第一时间把该文件夹路径加入Defender排除列表 → 下载自有脚本到该排除目录 → 按需完成脚本自签名 → 正常运行脚本即可。
内容的提问来源于stack exchange,提问作者YorSubs
相关产品推荐
相关产品推荐

