使用 Windows Defender 应用程序控制 (WDAC) 执行脚本

注意

Windows Defender 应用程序控制的某些功能仅适用于特定 Windows 版本。 详细了解 应用程序控制功能可用性

重要提示

选项 11 Disabled:Script EnforcementWindows Server 2016Windows 10 1607 LTSB 上不受支持,不应在这些平台上使用。 这样做将导致意外的脚本强制行为。

脚本强制实施概述

默认情况下,为所有 WDAC 策略启用脚本强制,除非策略中设置了选项 11 Disabled:Script Enforcement 。 WDAC 脚本强制实施涉及启发式脚本主机(如 PowerShell)和 WDAC 之间的握手。 但是,脚本主机会处理实际强制行为。 如果有任何 WDAC UMCI 策略处于活动状态,某些脚本主机(如 Microsoft HTML 应用程序主机 (mshta.exe) )会阻止所有代码执行。 大多数脚本主机首先询问 WDAC 是否应根据当前处于活动状态的 WDAC 策略允许脚本运行。 然后,脚本主机会阻止、允许或更改脚本的运行 方式 ,以最好地保护用户和设备。

使用 WinVerifyTrust API 对已签名脚本进行验证。 若要通过验证,签名根必须存在于设备上的受信任根存储中,并且 WDAC 策略必须允许它。 此行为不同于可执行文件的 WDAC 验证,后者不需要安装根证书。

WDAC 共享所有脚本强制事件的 AppLocker - MSI 和脚本 事件日志。 每当脚本主机询问 WDAC 是否应允许脚本时,都会记录事件,并将答案 WDAC 返回到脚本主机。 有关 WDAC 脚本强制事件的详细信息,请参阅 了解应用程序控制事件

注意

当运行策略不允许的脚本时,WDAC 会引发一个事件,指示脚本已被“阻止”。但是,实际的脚本强制行为由脚本主机处理,实际上可能不会完全阻止文件运行。

另请注意,即使 WDAC 策略仅处于审核模式,某些脚本主机也可能更改其行为方式。 应查看本文中的脚本主机特定信息,并在环境中全面测试,以确保需要运行的脚本正常工作。

属于 Windows 的启发式脚本主机

PowerShell

WDAC 策略必须允许所有 PowerShell 脚本 (.ps1) 、模块 (.psm1) 以及清单 (.psd1) ,以便它们使用全语言权限运行。

WDAC 策略还必须允许允许的模块加载的任何 依赖 模块,并且强制执行 WDAC 时,必须按名称显式导出模块函数。 未指定任何导出函数的模块 (没有导出名称列表) 仍可加载,但无法访问任何模块函数。 在其名称中使用通配符 (*) 的模块将无法加载。

WDAC 策略不允许的任何 PowerShell 脚本仍运行,但仅在约束语言模式下运行。

不建议使用 PowerShell 点源 。 相反,脚本应使用 PowerShell 模块来提供常见功能。 如果允许的脚本文件确实尝试运行点源脚本文件,则这些脚本文件还必须通过策略。

如果强制执行任何 WDAC UMCI 策略并且任何活动 WDAC 策略启用脚本强制实施,则 WDAC 会将交互式 PowerShell 置于约束语言模式,即使该策略处于审核模式也是如此。 若要运行具有完整语言权限的交互式 PowerShell,必须 对所有策略禁用 脚本强制实施。

有关详细信息,请参阅 关于语言模式约束语言模式

VBscript、cscript 和 jscript

WDAC 策略必须允许使用基于 Windows 的脚本主机 (wscript.exe) 或基于 Microsoft 控制台的脚本主机 (cscript.exe) 运行所有脚本。 否则,将阻止脚本。

Microsoft HTML 应用程序主机 (MSHTA) 和 MSXML

如果具有脚本强制实施的任何 WDAC 策略处于活动状态,则阻止使用 MSHTA 或 MSXML 执行的所有代码,即使该策略处于审核模式也是如此。

COM 对象

WDAC 还对 WDAC 策略可以扩展或进一步限制的 COM 对象强制实施受限允许列表。 COM 对象强制 不受 选项 11 Disabled:Script Enforcement 的影响。 有关如何允许或拒绝 COM 对象的详细信息,请参阅 允许 COM 对象注册

不由 WDAC 直接控制的脚本

WDAC 不会直接控制通过 Windows 命令处理器 (cmd.exe) 运行的代码,包括 .bat/.cmd 脚本文件。 但是,此类批处理脚本尝试运行的任何内容都受 WDAC 控制的约束。 如果不需要运行 cmd.exe,建议完全阻止它或仅允许基于调用过程的异常。 请参阅 使用 Windows Defender 应用程序控制策略控制特定的插件、加载项和模块

WDAC 不会控制脚本通过未启发的脚本主机(例如许多第三方 Java 或 Python 引擎)运行。 如果 WDAC 策略允许未启用的脚本主机运行,则隐式允许所有脚本通过该主机运行。 对于非 Microsoft 脚本主机,应与软件供应商核实其脚本主机是否已启用 WDAC 策略。