部署目录文件以支持 Windows Defender 应用程序控制

注意

Windows Defender应用程序控制的某些功能仅在特定 Windows 版本上可用。 有关详细信息,请参阅Windows Defender应用程序控制功能可用性

如果Windows Defender应用程序控制 (WDAC) 具有未签名的业务线 (LOB) 应用程序(签名过程困难),目录文件在部署中可能很重要。 当你不想信任由该 ISV 签名的所有代码时,还可以使用目录文件将自己的签名添加到从独立软件供应商那里获取的应用 (ISV) 。 通过这种方式,目录文件提供了一种方便的方式,让你“祝福”应用以在 WDAC 托管的环境中使用。 而且,你可以为现有应用创建目录文件,而无需访问原始源代码或需要任何昂贵的重新打包。

需要 获取供自己使用的代码签名证书 ,并使用它来对目录文件进行签名。 然后,使用首选内容部署机制分发已签名的目录文件。

最后,将签名者规则添加到签名证书的 WDAC 策略。 然后,签名的目录文件涵盖的任何应用都可以运行,即使这些应用以前未签名也是如此。 使用此基础,可以更轻松地生成 WDAC 策略,以阻止所有未签名的代码,因为大多数恶意软件都是未签名的。

使用包检查器创建目录文件

若要为现有应用创建目录文件,可以使用 Windows 附带的名为 “包检查器” 的工具。

  1. 审核模式下 的策略应用于运行包检查器的计算机。 包检查器使用审核事件在目录文件中包括任何临时安装文件的哈希,这些文件在安装过程中添加然后从计算机中删除。 审核模式 策略不应允许 应用的二进制文件,或者你可能会错过目录文件中所需的一些关键文件。

    注意

    如果在具有强制策略的系统上完成此过程,则无法完成此过程,除非强制实施的策略已允许应用运行。

    可以使用此 PowerShell 示例创建 DefaultWindows_Audit.xml 模板的副本:

    Copy-Item -Path $env:windir\schemas\CodeIntegrity\ExamplePolicies\DefaultWindows_Audit.xml -Destination $env:USERPROFILE\Desktop\
    $PolicyId = Set-CIPolicyIdInfo -FilePath $env:USERPROFILE\Desktop\DefaultWindows_Audit.xml -PolicyName "Package Inspector Audit Policy" -ResetPolicyID
    $PolicyBinary = $env:USERPROFILE+"\Desktop\"+$PolicyId.substring(11)+".cip"
    

    然后应用策略,如使用脚本部署Windows Defender应用程序控制策略中所述。

  2. 启动包检查器以监视安装应用的 本地驱动器 上的文件创建,例如驱动器 C:

    PackageInspector.exe Start C:
    

    重要提示

    写入到使用包检查器监视的驱动器的每个文件都将包含在创建的目录中。 请注意可能正在运行的任何其他进程并在驱动器上创建文件。

  3. 将安装媒体复制到使用包检查器监视的驱动器,以便最终目录文件中包含实际安装程序。 如果跳过此步骤,则可能允许 应用 运行,但实际上无法安装它。

  4. 安装应用。

  5. 启动应用以确保在初始启动时创建的文件包含在目录文件中。

  6. 像平常一样使用应用,以便在正常使用期间创建的文件包含在目录文件中。 例如,某些应用可能会在首次使用应用中的某个功能时下载更多文件。 如果应用具有该功能,请确保检查应用更新。

  7. 关闭并重新打开应用程序,以确保扫描已捕获所有二进制文件。

  8. 在包检查器仍在运行的情况下,对要包含在目录中的任何其他应用重复上述步骤。

  9. 确认前面的步骤已完成后,请使用以下命令停止包检查器。 它会在指定位置创建目录文件和目录定义文件。 对目录文件使用命名约定,以便在一段时间内更轻松地管理已部署的目录文件。 此示例中使用的文件名 LOBApp-Contoso.cat ( 目录文件) 和 LOBApp.cdf (定义文件) 。

    对于停止包检查器的最后一个命令,请务必使用包检查器指定你一直在监视的同一本地驱动器, C:例如 。

    $ExamplePath=$env:userprofile+"\Desktop"
    $CatFileName=$ExamplePath+"\LOBApp-Contoso.cat"
    $CatDefName=$ExamplePath+"\LOBApp.cdf"
    PackageInspector.exe Stop C: -Name $CatFileName -cdfpath $CatDefName
    

注意

包检查器会为每个发现的文件编录哈希值。 如果已扫描的应用程序已更新,请再次完成此过程以信任新二进制文件的哈希值。

完成后,该工具会将文件保存到桌面。 可以使用文本编辑器查看 *.cdf 文件,并查看包检查器包含的文件。 还可以双击*.cat文件以查看其内容和特定文件哈希检查。

对目录文件进行签名

现在,你已为应用创建了目录文件,现在可以对其进行签名了。 建议使用 Microsoft 的 受信任签名 服务进行目录签名。 (可选)可以使用 Signtool 按照以下说明手动对目录进行签名。

使用 SignTool.exe 的目录签名

如果你购买了代码签名证书或从自己的公钥基础结构 (PKI) 颁发了证书,则可以使用 SignTool.exe 对目录文件进行签名。

你需要:

  • SignTool.exe,位于 Windows 软件开发工具包 (SDK) 中。
  • 之前创建的目录文件。
  • 从内部证书颁发机构颁发的代码签名证书 (CA) 或购买的代码签名证书。

对于用于对目录文件进行签名的代码签名证书,请将其导入到签名用户的个人存储中。 然后,通过将以下每个命令复制到提升的Windows PowerShell会话中,对现有目录文件进行签名。

  1. 初始化要使用的变量。 $ExamplePath根据需要替换 和 $CatFileName 变量:

     $ExamplePath=$env:userprofile+"\Desktop"
     $CatFileName=$ExamplePath+"\LOBApp-Contoso.cat"
    
  2. 使用 Signtool.exe 对目录文件进行签名:

     <path to signtool.exe> sign /n "ContosoSigningCert" /fd sha256 /v $CatFileName
    

    注意

    变量 <Path to signtool.exe> 应该是 Signtool.exe 实用工具的完整路径。 ContosoSigningCert 表示用于对目录文件进行签名的证书的使用者名称。 此证书应导入到你要尝试对目录文件进行签名的计算机上的个人证书存储中。

    有关 Signtool.exe 和所有其他开关的详细信息,请参阅 签名工具

  3. 验证目录文件的数字签名。 右键单击目录文件,然后选择“ 属性”。 在数字签名选项卡上,使用 sha256 算法验证你的签名证书是否存在,如图 1 所示。

    文件属性中的数字签名列表。

    图 1. 验证签名证书是否存在。

将目录文件部署到托管终结点

Windows 中的目录文件存储在 下 %windir%\System32\catroot\{F750E6C3-38EE-11D1-85E5-00C04FC295EE}

出于测试目的,可以手动将已签名的目录文件复制到此文件夹。 若要大规模部署已签名目录文件,请使用组策略文件首选项或企业系统管理产品(例如Microsoft Configuration Manager)。

使用组策略部署目录文件

若要简化目录文件的管理,可以使用组策略首选项将目录文件部署到组织中的相应计算机。

以下过程将引导你完成将名为 LOBApp-Contoso.cat 的已签名目录文件部署到名为 “已启用 WDAC 的电脑 ”的测试 OU,其中包含名为 Contoso 目录文件 GPO 测试的 GPO。

  1. 从安装了远程服务器管理工具的域控制器或客户端计算机中,通过运行 GPMC.MSC 或搜索组策略管理来打开组策略管理控制台。

  2. 创建新的 GPO:右键单击某个 OU(例如 已启用 WDAC 的电脑 OU),然后选择“ 在此域中创建 GPO”,并将其链接到此处,如图 2 所示。

    注意

    可以使用任何 OU 名称。 此外,在考虑组合 WDAC 策略的不同方式时,安全组筛选是一个选项。

    组策略管理,创建 GPO。

    图 2. 创建新的 GPO。

  3. 为新 GPO 指定一个名称,例如 Contoso 目录文件 GPO 测试或你喜欢的任何名称。

  4. 打开组策略管理编辑器:右键单击新 GPO,然后选择“编辑”。

  5. 在所选 GPO 中,导航到 “计算机配置\首选项\Windows 设置\文件”。 右键单击“ 文件”,指向“ 新建”,然后选择“ 文件”,如图 3 所示。

    组策略管理编辑器,新建文件。

    图 3. 创建新文件。

  6. 配置目录文件共享。

    若要使用此设置来提供目录文件(在本示例中为 LOBApp-Contoso.cat)的一致部署,则源文件应在每个已部署计算机的计算机帐户可访问的共享上。 此示例在运行名为 的计算机上使用共享Windows 10\\Contoso-Win10\Share。 将要部署的目录文件复制到此共享。

  7. 若要保持版本一致,请在“新建文件属性”对话框中,如图 4 所示,从“操作”列表中选择“替换”,以便始终使用最新版本。

    “文件属性”,“替换”选项。

    图 4. 设置新的文件属性。

  8. “源文件 () ”框中,键入可访问共享的名称,并包含目录文件名。 例如,\\Contoso-Win10\share\LOBApp-Contoso.cat

  9. 目标文件框中,键入路径和文件名,例如:

    C:\Windows\System32\catroot\{F750E6C3-38EE-11D1-85E5-00C04FC295EE}\LOBApp-Contoso.cat

    对于目录文件名,请使用要部署的目录的名称。

  10. 新文件属性框的通用选项卡上,选择当不再应用此项目时,删除此项目选项。 启用此选项可确保从每个系统中删除目录文件,以防需要停止信任此应用程序。

  11. 选择“ 确定” 以完成文件创建。

  12. 关闭组策略管理编辑器,然后通过运行 GPUpdate.exe 更新运行 Windows 10 或 Windows 11 的测试计算机上的策略。 更新策略后,验证运行 Windows 10 的计算机上是否存在C:\Windows\System32\catroot\{F750E6C3-38EE-11D1-85E5-00C04FC295EE}目录文件。

使用 Microsoft Configuration Manager 部署目录文件

作为组策略的替代方法,可以使用 Configuration Manager 将目录文件部署到环境中的托管计算机。 此方法可以简化多个目录文件的部署和管理,并围绕每个客户端或集合部署的目录提供报告。 除了部署这些文件外,Configuration Manager还可用于清点当前部署的目录文件,以便进行报告和符合性。

完成以下步骤来为目录文件创建新的部署包:

注意

以下示例使用名为 \\Shares\CatalogShare 的网络共享作为目录文件的源。 如果你有特定于集合的目录文件,或者希望单独部署它们,请使用最适合组织的文件夹结构。

  1. 打开配置管理器控制台,然后选择“软件库”工作区。

  2. 导航到“概述”\“应用程序管理”,右键单击“ ”,然后选择“ 创建包”。

  3. 为该程序包命名、将你的组织设置为制造商,然后选择相应的版本号。

    创建包和程序向导。

    图 5. 指定有关新包的信息。

  4. 选择“ 下一步”,然后选择“ 标准程序 ”作为程序类型。

  5. 在“ 标准程序 ”页上,选择一个名称,然后将 “命令行” 属性设置为以下命令:

    XCopy \\Shares\CatalogShare C:\Windows\System32\catroot\{F750E6C3-38EE-11D1-85E5-00C04FC295EE} /H /K /E /Y
    
  6. “标准计划 ”页上,选择以下选项,如图 6 所示:

    • 名称中,键入 Contoso 目录文件复制程序之类的名称。
    • 命令行中,浏览到程序位置。
    • “启动”文件夹中,键入 C:\Windows\System32
    • 运行列表中,选择隐藏
    • 程序可以运行列表中,选择用户是否已登录
    • 驱动器模式列表中,选择使用 UNC 名称运行

    向导的“标准程序”页。

    图 6. 指定有关标准程序的信息。

  7. 接受向导其余部分的默认值,然后关闭向导。

创建部署程包后,将其部署到集合,以便使客户端收到目录文件。 在此示例中,将创建的包部署到测试集合:

  1. 在“软件库”工作区中,导航到“概述\应用程序管理\包”,右键单击目录文件包,然后选择“ 部署”。

  2. 在“ 常规 ”页上,选择测试集合,然后选择“ 下一步”。

  3. 在“ 内容 ”页上,选择“ 添加 ”以选择为所选集合提供内容的分发点,然后选择“ 下一步”。

  4. 部署设置页上,在用途框中选择必需

  5. “计划” 页上,选择“ 新建”。

  6. 在“ 分配计划 ”对话框中,选择 “在此事件之后立即分配”,将值设置为“ 尽快”,然后选择“ 确定”。

  7. “计划 ”页上,选择“ 下一步”。

  8. 在“ 用户体验 ”页上,如图 7 所示,设置以下选项,然后选择“ 下一步”:

    • 选中软件安装复选框。

    • 选中在截止日期或在维护时段期间提交更改(需要重新启动)复选框。

    “部署软件向导”,“用户体验”页。

    图 7. 指定用户体验。

  9. 在“ 分发点 ”页上的“ 部署选项 ”框中,选择“ 从分发点运行程序”,然后选择“ 下一步”。

  10. “摘要 ”页上,查看所选内容,然后选择“ 下一步”。

  11. 关闭向导。

使用Microsoft Configuration Manager清点目录文件

将目录文件部署到环境中的计算机后,无论是使用组策略还是Configuration Manager,都可以使用 Configuration Manager 的软件清单功能对其进行清点。

可以通过创建和部署新的客户端设置策略来配置软件清单,以查找托管系统上的目录文件。

注意

目录文件的标准命名约定将大大简化目录文件软件清单过程。 在此示例中, -Contoso 已添加到所有目录文件名称。

  1. 打开配置管理器控制台,然后选择“管理”工作区。

  2. 导航到 “概述”\“客户端设置”,右键单击“ 客户端设置”,然后选择“ 创建自定义客户端设备设置”。

  3. 为新策略命名,然后在选择和随后配置客户端设备的自定义设置下选中软件清单复选框,如图 8 所示。

    创建自定义客户端设备设置。

    图 8. 选择自定义设置。

  4. 在导航窗格中,选择“ 软件清单”,然后选择“ 设置类型”,如图 9 所示。

    设备的软件清单设置。

    图 9. 设置软件清单。

  5. 在“ 配置客户端设置 ”对话框中,选择“ 开始 ”按钮以打开“ 清单文件属性 ”对话框。

  6. 在“ 名称 ”框中,键入名称(如 *Contoso.cat),然后选择“ 设置”。

    注意

    键入名称时,请遵循目录文件的命名约定。

  7. 在“ 路径属性 ”对话框中,选择“ 变量或路径名称”,然后在 C:\Windows\System32\catroot\{F750E6C3-38EE-11D1-85E5-00C04FC295EE} 框中键入,如图 10 所示。

    路径属性,指定路径。

    图 10. 设置路径属性。

  8. 选择“确定”

  9. 创建客户端设置策略后,右键单击新策略,选择“ 部署”,然后选择要清点目录文件的集合。

在下一个软件清单周期时,当目标客户端收到新的客户端设置策略时,你将能够在内置Configuration Manager报表或资源资源管理器中查看清单文件。 若要在资源管理器内查看客户端上的清点文件,请完成以下步骤:

  1. 打开配置管理器控制台,然后选择“资源和合规性”工作区。

  2. 导航到“概述\设备”,并搜索要查看清单文件的设备。

  3. 右键单击计算机,指向 “开始”,然后选择“ 资源资源管理器”。

  4. 在资源资源管理器中,导航到“软件”\“文件详细信息”以查看已列出清单的目录文件。

注意

如果此视图中未显示任何内容,请导航到“资源资源管理器中的软件\上次软件扫描”,验证客户端最近是否完成了软件清单扫描。

允许在 WDAC 策略中由目录签名证书签名的应用

拥有已签名的目录文件后,可以向策略添加一个签名者规则,以允许使用该证书签名的任何内容。 如果尚未创建 WDAC 策略,请参阅Windows Defender应用程序控制设计指南

在已部署已签名目录文件的计算机上,可以使用 New-CiPolicyRule 从该目录中包含的任何文件创建签名者规则。 然后使用 Merge-CiPolicy 将规则添加到策略 XML。 请务必替换以下示例中的路径值:

$Rules = New-CIPolicyRule -DriverFilePath <path to the file covered by the signed catalog> -Level Publisher
Merge-CIPolicy -OutputFilePath <path to your policy XML> -PolicyPaths <path to your policy XML> -Rules $Rules

或者,可以使用 Add-SignerRule 从证书文件 (.cer) 向策略添加签名者规则。 可以轻松保存已签名目录文件中.cer文件。

  1. 右键单击目录文件,然后选择“ 属性”。
  2. 在“ 数字签名 ”选项卡上,从列表中选择签名,然后选择“ 详细信息”。
  3. 选择“ 查看证书 ”以查看叶证书的属性。
  4. 选择“ 详细信息 ”选项卡,然后选择“ 复制到文件”。 此操作运行证书导出向导。
  5. 使用 “导出文件格式 ”的默认选项完成向导,并指定保存.cer文件的位置和文件名。

注意

这些步骤选择证书链的最低级别,也称为“叶”证书。 相反,可以选择使用证书的中间证书或根颁发者证书。 若要在链中使用不同的证书,请在上述步骤 3 之后切换到“ 证书路径 ”选项卡,然后选择要使用的证书级别,然后选择“ 查看证书”。 然后完成剩余步骤。

以下示例使用 .cer 文件向用户和内核模式签名方案添加签名者规则。 请务必替换以下示例中的路径值:

Add-SignerRule -FilePath <path to your policy XML> -CertificatePath <path to your certificate .cer file> -User -Kernel

使用包检查器的已知问题

使用包检查器生成目录文件的一些已知问题包括:

  • USN 日记大小太小,无法跟踪安装程序创建的所有文件

    • 若要诊断 USN 日记帐大小是否是问题,请在运行包检查器后:
      • 在 HKEY_CURRENT_USER/PackageInspectorRegistryKey/c 处获取 reg 键的值: (运行 PackageInspector 启动) 时,此 USN 是最新的 USN。 然后使用 fsutil.exe 读取起始位置。 将以下命令中的“RegKeyValue”替换为 reg 键中的值:
        fsutil usn readjournal C: startusn=RegKeyValue > inspectedusn.txt
      • 如果由于溢出而不再存在较旧的 USN,则上述命令应返回错误
      • 可以使用 来扩展 USN 日记大小:fsutil usn createjournal使用新的大小和分配增量。 Fsutil usn queryjournal 显示当前大小和分配增量,因此使用 的倍数可能会有所帮助。
  • CodeIntegrity - 操作事件日志太小,无法跟踪安装程序创建的所有文件

    • 若要诊断事件日志大小是否是问题,请在运行包检查器后:
      • 打开事件查看器并展开应用程序和服务//Microsoft//Windows//CodeIntegrity//Operational。 检查初始安装程序启动的 3076 审核块事件。
      • 若要增加事件日志大小,请在事件查看器右键单击操作日志,选择“属性”,然后设置新值。
  • 每次安装或运行应用时更改哈希的安装程序或应用文件

    • 某些应用在运行时生成文件,其哈希值每次都不同。 可以通过查看生成的 3076 审核块事件 (或 3077 强制事件) 中的哈希值来诊断此问题。 如果每次尝试运行文件时,都会观察到具有不同哈希的新块事件,则包不适用于包检查器。
  • 具有无效签名 Blob 或其他“不可删除”文件的文件

    • 当已签名文件被修改为使文件的 PE 标头失效时,会出现此问题。 无法根据 Authenticode 规范对以这种方式修改的文件进行哈希处理。
    • 尽管 PackageInspector 创建的目录文件中不能包含这些“不可删除”文件,但应该可以通过向使用文件平面文件哈希的策略添加哈希 ALLOW 规则来允许它们。
    • 此问题会影响在自定义操作中使用已签名 DLL 文件的某些 InstallShield 包版本。 InstallShield 向文件添加跟踪标记, (编辑后签名) 使文件处于此“不可删除”状态。