在 Windows 11 中,要禁止指定某个程序的运行,可以通过多种方法实现,包括使用 注册表、组策略、和 防火墙。下面我将详细说明每种方法。使用 PowerShell 也可以实现禁止某个程序运行的功能。下面是通过 PowerShell 实现禁用程序的方法,涵盖注册表、组策略和防火墙等方面。
Windows11 禁止指定程序运行(注册表 DisallowRun / 组策略 / Windows 防火墙)拆解|解构|底层原理|依赖文件|依赖关系|逻辑链路|配套链
重要区分:
- 注册表 DisallowRun、组策略 “不要运行指定 Windows 应用”:Shell 层拦截,仅拦截 Explorer 发起启动,可以被绕过CSDN问...。
- 防火墙:不能阻止程序运行,仅阻断该程序网络收发,程序本体依旧可以完整执行。
- 真正内核级进程拦截:AppLocker / 软件限制策略(企业版),内核驱动拦截 CreateProcess,很难绕过。
三种实现路径
├─① 注册表 DisallowRun(Shell Explorer层拦截)
│ ↓ advapi32.dll 读写注册表 → explorer.exe读取黑名单 → ShellExecute时拦截;直接CreateProcess可绕过
├─② 本地组策略 gpedit.msc「不要运行指定的Windows应用」
│ ↓ GroupPolicy客户端处理 → 向下写入DisallowRun注册表项;本质等价注册表配置,专业版/企业版可用
└─③ Windows Defender防火墙(出站/入站程序规则)
↓ fwbase.dll、wfp.sys WFP Windows过滤平台内核网络栈;**只拦截网络流量,不拦截进程创建执行**
一、底层原理
1、注册表 DisallowRun 原理(家庭版可用)
HKCU:\Software\Microsoft\Windows\CurrentVersion\Policies\ExplorerDisallowRun(DWORD)=1:总开关开启拦截- 子项
DisallowRun,数字命名字符串值,填写程序文件名(exe 名称,不含路径)。
核心本质:拦截点在 explorer.exe 资源管理器内部,只拦截ShellExecute / ShellExecuteEx(双击图标、运行对话框、开始菜单启动)。
- 绕过方式:PowerShell 直接
Start‑Process xxx.exe、计划任务、服务启动、直接调用CreateProcessWAPI,全部可以绕过该限制,程序依旧可以运行。 - 匹配规则:仅匹配 exe 文件名,不校验路径、哈希、数字签名;改 exe 文件名即可绕过CSDN问...。
- 生效条件:注销重登录,explorer 重新加载策略;修改注册表不会即时生效。
2、组策略:不要运行指定的 Windows 应用
用户配置 → 管理模板 → 系统 → 不要运行指定的Windows应用底层:组策略客户端把策略配置自动写入 DisallowRun 注册表项,和手动写注册表底层是同一套 Shell 拦截逻辑。
- 仅 Windows 专业版 / 企业版;家庭版无 gpedit.msc 本地组策略编辑器。
- 域环境 GPO 可以批量下发多台终端;本地管理员可以修改注册表绕过本地组策略。
⚠️该策略不是 AppLocker,仍然是 Shell 层,不是内核拦截,可以被绕过。AppLocker 属于企业版内核级应用控制,依赖AppIDSvc服务、AppID.sys内核驱动,拦截 CreateProcess 创建进程,安全性远高于 DisallowRunGitHub。
3、Windows 防火墙(WFP 平台)原理
- 创建「程序」出站阻止规则:指定 exe 完整路径,该进程发起 TCP/UDP 网络连接时内核丢弃数据包。
- 重大边界:进程创建、内存执行完全不受影响;程序可以本地完整运行,仅仅上不了网。
- 绕过方式:复制 exe 改路径、复制一份副本,防火墙规则按文件路径匹配,副本不受规则约束。
三者安全等级排序:AppLocker(内核拦截) > 组策略DisallowRun(Shell层) = 手动注册表DisallowRun(Shell层) > Windows防火墙(仅断网,不阻止运行)
二、依赖文件清单
| 方案 | 核心文件 | 作用 |
|---|---|---|
| 注册表 DisallowRun | advapi32.dll |
Win32 注册表读写 API |
explorer.exe |
真正读取黑名单并拦截 ShellExecute;拦截逻辑在此进程 | |
| 组策略方式 | gpupdate.exe |
组策略刷新,把策略落地注册表 |
gpedit.dll |
本地组策略编辑器 gpedit.msc 模块 | |
| 防火墙阻断网络 | fwbase.dll |
防火墙用户态管理 API(New‑NetFirewallRule) |
wfp.sys |
WFP Windows 过滤平台内核驱动,拦截网络数据包 | |
mpssvc(Windows Defender Firewall 服务) |
防火墙服务必须运行 |
配套高级方案(内核级拦截 AppLocker)补充:AppIDSvc.exe应用标识服务,AppID.sys内核驱动;仅企业版可用。
三、依赖关系梳理
1)注册表 DisallowRun
- 权限:管理员权限写入 HKCU 注册表;不需要管理员也可以配置当前用户。
- 生效依赖:注销重登录 / 重启 explorer;修改注册表立刻写磁盘,但 explorer 不重新加载策略就不生效。
- 绕过限制:直接 CreateProcess、计划任务、服务启动均可绕过;仅拦截资源管理器发起启动。
- 匹配缺陷:只匹配 exe 文件名;修改程序文件名即可绕过黑名单。
- 版本:Win10/Win11 家庭版、专业版全部支持。
2)本地组策略
- SKU 限制:Windows 家庭版没有本地组策略 gpedit.msc。
- 底层依赖:最终还是写入 DisallowRun 注册表,和手动注册表是同一套拦截逻辑,同样存在绕过漏洞。
- 域环境依赖:域 GPO 下发,优先级高于本地注册表;本地管理员可以删除本地注册表项绕过本地组策略。
- 刷新依赖:
gpupdate /force;部分策略需要注销登录。
3)Windows 防火墙
- 服务依赖:
MpsSvc防火墙服务必须运行;组策略强制防火墙配置会覆盖本地脚本创建规则。 - 匹配依赖:按 exe 完整路径匹配;复制程序到别的目录,规则失效。
- 能力边界:不能阻止程序运行;仅阻断网络;本地离线程序完全不受防火墙规则影响。
- 权限:管理员权限,才能新建防火墙规则。
四、完整逻辑链路
链路 1:注册表 DisallowRun 拦截流程
#示例配置
Set‑ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer" -Name DisallowRun -Value 1 -Type DWord
New‑Item "HKCU:\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\DisallowRun"
Set‑ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\DisallowRun" -Name "1" -Value "badapp.exe"
- PowerShell 调用 advapi32.dll 写入注册表;磁盘配置完成。
- 用户注销重登录,explorer.exe 启动,读取 Policies\Explorer 下 DisallowRun 配置。
- 用户双击
badapp.exe,explorer 调用ShellExecuteEx准备启动程序。 - explorer 内部比对黑名单文件名;命中黑名单,直接拒绝,弹窗提示管理员阻止操作。
- 不会调用 CreateProcess,进程根本没有创建。
绕过链路:PowerShell 直接执行Start‑Process badapp.exe,底层直接调用 CreateProcess,不走 ShellExecute,explorer 完全不参与,拦截失效,程序正常运行。
链路 2:组策略流程
- gpedit.msc 配置 “不要运行指定 Windows 应用”,填入黑名单 exe 文件名。
gpupdate /force,组策略客户端解析 ADMX 模板,把配置写入HKCU:\...\Explorer\DisallowRun注册表。- 后续执行链路完全等同于注册表 DisallowRun 流程。
链路 3:防火墙阻断程序网络链路
New‑NetFirewallRule -DisplayName "Block‑BadApp‑Outbound" -Program "C:\tools\badapp.exe" -Direction Outbound -Action Block
- PowerShell 调用 NetSecurity 模块,调用 fwbase.dll 写入 WFP 过滤规则。
- mpssvc 防火墙服务将规则下发内核驱动 wfp.sys。
- 用户无论什么方式启动
C:\tools\badapp.exe,进程完整创建运行。 - 当该进程发起 TCP/UDP 网络出站数据包,wfp.sys 内核匹配进程 exe 路径,丢弃数据包;本地程序逻辑完全不受影响。
- 将 badapp.exe 复制到 D 盘,程序路径改变,防火墙规则不再匹配,网络恢复正常。
五、配套链:实操 PowerShell 示例
示例 1:注册表 DisallowRun(仅当前用户,Shell 层拦截)
#不需要管理员,针对当前登录用户
$baseReg = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer"
if(-not(Test‑Path $baseReg)){New‑Item $baseReg -Force | Out‑Null}
Set‑ItemProperty -Path $baseReg -Name DisallowRun -Value 1 -Type DWord
$disallowKey = Join‑Path $baseReg "DisallowRun"
if(-not(Test‑Path $disallowKey)){New‑Item $disallowKey -Force | Out‑Null}
#添加黑名单程序exe名称
Set‑ItemProperty -Path $disallowKey -Name "1" -Value "notepad.exe"
Write‑Host "配置完成,请注销重新登录生效;该策略仅拦截资源管理器双击启动,可以被绕过。"
示例 2:防火墙阻止程序网络(不阻止运行)
#requires‑RunAsAdministrator
$exePath = "C:\test\badapp.exe"
New‑NetFirewallRule -DisplayName "Block‑BadApp‑Out" -Program $exePath -Direction Outbound -Action Block -Profile Domain,Private,Public
回滚:删除注册表 DisallowRun 子项;防火墙规则使用Remove‑NetFirewallRule删除。
六、故障排查清单
- 配置 DisallowRun,双击被拦截,但 PowerShell 仍然可以启动程序
属于设计特性,DisallowRun 只是 Shell 层拦截,不是内核拦截;需要真正阻止运行应当部署 AppLocker(企业版)。
- 组策略配置黑名单,策略刷新但不生效
①没有注销重登录,explorer 没有重载注册表策略;②家庭版没有 gpedit,组策略无法本地配置。
- 防火墙规则配置成功,程序依然可以运行
正常现象,防火墙只断网络,不禁止程序执行。
- 防火墙规则配置,复制一份 exe 副本之后网络恢复
防火墙按 exe 完整路径匹配,副本路径不同,规则失效。
- DisallowRun 填入完整路径,拦截不生效
该策略只匹配 exe 文件名,不识别路径,填写完整路径不会匹配拦截。
七、关键认知误区澄清
使用 注册表、组策略 和 防火墙 来禁止指定程序运行的对比,表格化后更容易理解它们的区别。
| 方法 | 实现方式 | 适用环境 | 优点 | 缺点 | 配置方式 |
|---|---|---|---|---|---|
| 注册表 | 修改 Windows 注册表,使用 DisallowRun 来禁止程序运行 |
适用于所有 Windows 版本 | - 适用于家庭版、专业版、企业版等所有版本 - 配置简单,易于实现 | - 配置可能被用户绕过(通过修改注册表) - 需要重启计算机生效 | 通过 PowerShell 脚本修改注册表(需要管理员权限) |
| 组策略 | 使用 Windows 本地组策略管理工具来限制程序运行 | 仅适用于 Windows 专业版、企业版 | - 管理中心化,适合企业环境 - 比注册表更安全,难以绕过 | - 不适用于家庭版 - 配置较复杂 | 通过 gpedit.msc 或 PowerShell 配置(需要管理员权限) |
| 防火墙 | 创建防火墙规则阻止程序访问网络 | 适用于所有 Windows 版本 | - 可以限制程序的网络连接,防止外部交互 - 适用于无网络依赖的程序 | - 仅限于网络访问的阻止,不会完全禁止程序执行 - 无法阻止非联网程序 | 通过 PowerShell 或防火墙管理界面创建规则 |
| AppLocker(企业版) | 使用 AppLocker 配置执行规则 | 仅适用于 Windows 企业版 | - 强大的管理功能,适合企业环境 - 可以配置细粒度的程序执行规则 | - 仅适用于 Windows 企业版 - 配置较复杂,需要专用管理工具 | 通过 PowerShell 或组策略管理工具配置 |
进一步解释:
-
注册表方法:修改注册表中的
DisallowRun键,可以直接禁止程序的运行,适用于各种 Windows 版本。但由于用户可以访问注册表并修改,因此不如组策略安全,且需要重启系统生效。 -
组策略方法:通过本地组策略(
gpedit.msc)配置,可以更精细地控制程序的运行,适用于 Windows 专业版及企业版,难以绕过,比注册表更安全。适合企业环境,但家庭版 Windows 用户无法使用。 -
防火墙方法:防火墙方法并不是完全禁止程序的运行,而是限制其网络访问。这适用于那些联网的程序,能够有效地防止程序通过网络进行交互,适合有网络依赖的应用程序。它不适用于那些完全不依赖网络的程序。
-
AppLocker:这是 Windows 企业版的专有功能,用于精确控制哪些程序可以在计算机上运行,能够防止程序的执行或卸载。适合企业环境,适用于需要高安全性和集中管理的场景。
- 如果仅需禁止某个程序的运行并且不涉及网络,注册表方法简单且有效,适合单台计算机的管理。
- 如果你是在企业环境中,需要集中的安全管理,组策略和AppLocker是更合适的选择。
- 如果你的主要目标是阻止程序的网络通信(例如防止网络攻击、泄漏等),那么防火墙是最好的选择。
在 Windows 11 中,要禁止指定某个程序的运行,可以通过多种方法实现,包括使用 注册表、组策略、和 防火墙。下面我将详细说明每种方法。
方法 1:通过注册表禁止程序运行
注册表是 Windows 系统中存储配置和设置的地方。通过修改注册表,可以禁止某个程序的运行。
步骤:
-
打开注册表编辑器:
- 按 Win + R 打开运行窗口,输入
regedit,然后按 Enter 打开注册表编辑器。
- 按 Win + R 打开运行窗口,输入
-
导航到注册表位置:
- 在注册表编辑器中,导航到以下路径:
Copy Code
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer - 如果
Explorer子项不存在,可以右键点击Policies,选择 新建 > 项,并命名为Explorer。
- 在注册表编辑器中,导航到以下路径:
-
创建或修改键值:
- 在右侧窗口中,右键点击空白处,选择 新建 > 字符串值,命名为
DisallowRun。 - 双击
DisallowRun键,将其值设置为1(启用禁止指定程序)。
- 在右侧窗口中,右键点击空白处,选择 新建 > 字符串值,命名为
-
指定禁止运行的程序:
- 在
Explorer下,右键点击空白处,选择 新建 > 项,并命名为DisallowRun(如果该项不存在)。 - 在
DisallowRun下,右键点击空白处,选择 新建 > 字符串值,命名为程序名(如program.exe)。值设置为该程序的文件名。
- 在
-
重启计算机:
- 完成上述步骤后,重启计算机。这样,指定的程序将被禁止运行。
方法 2:通过组策略禁止程序运行
组策略提供了更全面和灵活的管理方式,可以禁止某些程序的执行。


步骤:
-
打开组策略编辑器:
- 按 Win + R 打开运行窗口,输入
gpedit.msc,然后按 Enter 打开本地组策略编辑器。
- 按 Win + R 打开运行窗口,输入
-
导航到组策略位置:
- 在组策略编辑器中,依次展开:
Copy Code
计算机配置 > 管理模板 > 系统
- 在组策略编辑器中,依次展开:
-
启用“不要运行指定的 Windows 应用程序”策略:
- 找到并双击 不要运行指定的 Windows 应用程序(
Don't run specified Windows applications)。 - 设置为 已启用,然后点击 显示。
- 找到并双击 不要运行指定的 Windows 应用程序(
-
添加禁止的程序:
- 在 显示内容 对话框中,点击 添加,然后输入要禁止的程序的可执行文件名(例如
program.exe)。 - 点击 确定 完成设置。
- 在 显示内容 对话框中,点击 添加,然后输入要禁止的程序的可执行文件名(例如
-
应用并退出:
- 设置完毕后,点击 确定 并关闭组策略编辑器。
- 如果策略没有立即生效,可以在命令提示符下运行
gpupdate /force强制更新组策略。
方法 3:通过防火墙阻止程序的网络访问
防火墙可以阻止某些程序的网络连接,但不影响程序的本地运行。这对限制某些程序的网络访问非常有效,特别是那些依赖互联网连接的程序。

步骤:
-
打开 Windows 防火墙设置:
- 按 Win + R 打开运行窗口,输入
wf.msc,然后按 Enter 打开 Windows 防火墙高级安全性设置。
- 按 Win + R 打开运行窗口,输入
-
创建出站规则:
- 在左侧面板中,点击 出站规则。
- 在右侧面板中,点击 新建规则。
-
选择“程序”:
- 在新建规则向导中,选择 程序,然后点击 下一步。
-
选择禁止的程序:
- 选择 此程序路径,然后浏览并选择要禁止的程序的可执行文件(如
program.exe)。
- 选择 此程序路径,然后浏览并选择要禁止的程序的可执行文件(如
-
选择“阻止连接”:
- 选择 阻止连接,然后点击 下一步。
-
设置规则名称:
- 给该规则命名(例如:禁止程序的名称),然后点击 完成。
-
验证规则是否生效:
- 通过测试禁止的程序,检查它是否能够连接互联网。如果配置正确,程序的网络访问将被阻止。
方法 4:通过应用控制 (AppLocker) 禁止程序
AppLocker 是 Windows 企业版或教育版中的一项高级功能,可以帮助管理员控制哪些应用程序可以或不能运行。


步骤:
-
打开本地安全策略:
- 按 Win + R 打开运行窗口,输入
secpol.msc,然后按 Enter 打开本地安全策略。
- 按 Win + R 打开运行窗口,输入
-
配置应用控制策略:
- 在左侧面板中,依次展开:
Copy Code
应用控制策略 > AppLocker > 执行规则
- 在左侧面板中,依次展开:
-
创建新规则:
- 右键点击 执行规则,选择 新建规则。
-
选择规则类型:
- 选择 阻止,然后按照向导步骤选择指定的程序进行阻止。
-
应用并启用:
- 完成设置后,确保启用规则。程序将无法运行。
- 注册表方法适用于小范围的个性化设置,但修改不当可能导致系统不稳定。
- 组策略方法适用于通过系统管理工具对程序进行禁止,尤其适合公司和组织使用。
- 防火墙方法适用于网络相关的程序限制,防止程序与外部网络连接。
- AppLocker适用于企业版本的 Windows,可以更精细地控制应用程序的执行。
每种方法适用于不同的需求,可以根据具体的场景选择最合适的方式来禁止程序的运行。
使用 PowerShell 也可以实现禁止某个程序运行的功能。下面是通过 PowerShell 实现禁用程序的方法,涵盖注册表、组策略和防火墙等方面。
方法 1:通过 PowerShell 修改注册表禁用程序
我们可以使用 PowerShell 修改注册表,禁止某个程序运行。
步骤:
-
打开 PowerShell:以管理员身份运行 PowerShell。
-
添加注册表键值: 以下脚本会在注册表中创建一个
DisallowRun键,并指定一个程序不允许运行。假设我们要禁止program.exe。powershellCopy Code# 设置注册表路径 $regPath = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer" # 创建 DisallowRun 键 if (-not (Test-Path $regPath)) { New-Item -Path $regPath -Force } # 设置 DisallowRun 值为 1 Set-ItemProperty -Path $regPath -Name "DisallowRun" -Value 1 # 设置程序名称(禁止运行的程序名) $programName = "program.exe" # 创建 DisallowRun 子项并添加禁止的程序 $disallowRunPath = "$regPath\DisallowRun" if (-not (Test-Path $disallowRunPath)) { New-Item -Path $disallowRunPath -Force } # 添加程序到禁用列表 Set-ItemProperty -Path $disallowRunPath -Name "1" -Value $programName Write-Host "程序 $programName 已禁用" -
重启系统:修改注册表后需要重启计算机才能生效。
方法 2:通过 PowerShell 创建组策略规则禁用程序
PowerShell 可以通过 Local Group Policy 来禁用指定程序的运行。这里我们通过 PowerShell 启用组策略来限制程序运行。
步骤:
-
启用策略“不要运行指定的 Windows 应用程序”:
powershellCopy Code# 设置组策略路径 $policyPath = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer" # 创建策略键 DisallowRun if (-not (Test-Path $policyPath)) { New-Item -Path $policyPath -Force } # 启用禁止应用程序策略 Set-ItemProperty -Path $policyPath -Name "DisallowRun" -Value 1 # 设置禁止的程序名称(例如 program.exe) $programName = "program.exe" $disallowRunPath = "$policyPath\DisallowRun" if (-not (Test-Path $disallowRunPath)) { New-Item -Path $disallowRunPath -Force } # 添加程序到禁用列表 Set-ItemProperty -Path $disallowRunPath -Name "1" -Value $programName Write-Host "$programName 被禁止运行" -
应用组策略并更新:
完成配置后,可以通过
gpupdate命令更新组策略。powershellCopy Codegpupdate /force
方法 3:通过 PowerShell 配置防火墙禁止程序网络访问
通过 PowerShell 可以设置 Windows 防火墙来阻止某个程序的网络访问。
步骤:
-
使用 PowerShell 创建防火墙规则:
powershellCopy Code# 要阻止的程序路径 $programPath = "C:\Path\To\program.exe" # 创建防火墙规则来阻止程序的网络访问 New-NetFirewallRule -DisplayName "Block $programPath" -Direction Outbound -Program $programPath -Action Block Write-Host "$programPath 的网络访问已被阻止"这个命令会创建一条出站规则,阻止指定程序的网络连接。
-
验证防火墙规则: 可以通过以下命令查看已创建的防火墙规则:
powershellCopy CodeGet-NetFirewallRule -DisplayName "Block program.exe" -
删除防火墙规则: 如果需要删除防火墙规则,可以使用:
powershellCopy CodeRemove-NetFirewallRule -DisplayName "Block program.exe"
方法 4:通过 PowerShell 使用 AppLocker 禁止程序(仅限企业版)
如果你使用的是 Windows 企业版,可以通过 PowerShell 配置 AppLocker 来禁止某些程序。
步骤:
-
启用 AppLocker 配置: AppLocker 策略需要由管理员设置。首先,启用 AppLocker 的规则。
powershellCopy Code# 检查 AppLocker 是否启用 Get-AppLockerPolicy -Effective | Format-Table -Property RuleType, Identity, Action -
创建 AppLocker 执行规则:
创建一个新的规则来禁止特定程序运行。
powershellCopy Code# 获取当前 AppLocker 配置 $applockerPolicy = Get-AppLockerPolicy -Local # 创建禁止执行程序规则(指定路径) $rule = New-AppLockerPolicyRule -Action Deny -FilePath "C:\Path\To\program.exe" -User "Everyone" # 应用新的 AppLocker 配置 Set-AppLockerPolicy -AppLockerPolicy $applockerPolicy -Merge
- 注册表方法:通过修改注册表配置禁止程序运行。
- 组策略方法:通过 PowerShell 配置组策略,阻止指定程序的运行。
- 防火墙方法:通过 PowerShell 配置防火墙规则,限制程序的网络访问。
- AppLocker 方法:适用于 Windows 企业版,通过 PowerShell 配置 AppLocker 策略禁止程序运行。
这些方法都可以通过 PowerShell 自动化执行,适用于不同的使用场景,选择合适的方法可以根据你的需求禁用程序。

浙公网安备 33010602011771号