应用程序审批流程

应用程序管理的重要方案之一是为需要批准的软件提供受控的安装和卸载过程。 为了减少Configuration Manager基础结构的总体负载并提高性能,工作流不需要创建单独的集合来管理每个应用程序的安装和卸载。

方案 1:必须先批准应用程序,然后才能安装应用程序

Contoso 的 IT 管理员使用软件中心向用户提供软件。 安装这些应用程序之前,必须先获得批准。 管理员将应用程序部署到所有用户,并将其配置为需要批准。

用户在软件中心浏览应用程序列表,但在请求获得批准之前无法安装该应用程序。 用户从软件中心提交请求,并指定请求的原因。 如果启用了“ 批准每个设备的用户的应用程序请求 ”选项,则用户必须从要安装应用程序的每个设备请求批准。 然后,管理员批准或拒绝对发出请求的每个用户设备的请求。

注意

Configuration Manager默认情况下不启用此功能。 在使用前,请启用可选功能 “按设备批准用户的应用程序请求”。 有关详细信息,请参阅启用更新中的可选功能

软件中心要求用户从其设备提交应用程序请求。 用户在软件中心看到以下消息:

用户请求需要软件中心批准的应用程序

用户指定他们想要应用程序的原因并提交审批请求:

用户通知其审批请求已提交到软件中心

管理员批准请求后,用户可以在其设备上安装应用程序。 如果用户不执行任何作,则会自动在非工作时间为用户安装应用程序。

用户从软件中心安装批准的应用程序

方案 2:集成应用程序审批系统

Northwind Traders 具有现有的应用程序审批系统,管理员希望将审批系统与Configuration Manager集成。

管理员将应用程序部署到所有用户,并将其配置为需要批准。 然后,管理员启用软件中心客户端设置,以 在软件中心隐藏未批准的应用程序

隐藏未批准的应用程序软件中心选项

使用此选项时,用户不会在软件中心看到应用程序,直到应用程序请求被批准在设备上安装。 通过组织的审批系统授予审批时,业务流程系统可以在Configuration Manager中对用户及其设备提出已批准的请求。 业务流程系统在 CreateApprovedRequest Configuration Manager 中使用了 WMI 方法。 然后,此方法使用现有的Configuration Manager应用程序部署机制。 它不会修改集合成员身份,并且会立即生效。 应用程序现在可供软件中心的用户使用。

管理员还可以将自动化配置为在用户的设备上自动安装应用程序。 在授予批准之前,任何其他用户都不会看到应用程序在软件中心中可用。 此解决方案提供软件的每个用户和每台设备的控制,而无需创建单独的集合。

类中的 SMS_UserApplicationRequest WMI 方法CreateApprovedRequest具有以下输入参数:

必需参数

  • ClientGUID - 客户端的唯一标识符
  • Username - 用户的唯一用户名
  • ApplicationID - 应用程序的模型名称

ApplicationID 是 SMS_Application 实例的 ModelName 属性。 此值是没有版本的应用程序的唯一 ID。 例如,ScopeId_21A9ED3B-D8C6-49DC-87A6-01F296182F14/Application_40243740-01f2-48db-abf0-c95259986d94

可选参数

  • Comments - 在软件中心中显示的已批准请求的注释。 默认情况下,它指定一个空字符串。

  • AutoInstall - 在请求获得批准后立即安装应用程序。 默认情况下,此参数为 true。

    注意

    在版本 2006 及更早版本中,对于特定应用,只能调用此方法一次。 从版本 2010 开始,可以多次调用此方法。 如果 AutoInstall 参数为 $true,则客户端将尝试再次安装应用。

下面的代码示例是一个Windows PowerShell脚本,演示如何为特定用户、计算机和应用程序调用 WMI 方法:

$machinename = $args[0]
$username = $args[1]
$appid = $args[2]
$autoInstall = $args[3]
$comments = $args[4]

$scObj=Get-WmiObject -Namespace root\sms -Query 'select SiteCode from sms_providerlocation'
$sitecode = $scObj.SiteCode
$namespace ="root\sms\site_" + $sitecode
$machine = Get-WmiObject -Namespace $namespace -Query "SELECT * FROM SMS_R_SYSTEM WHERE Name = '$machinename'"
$clientGuid = $machine.SMSUniqueIdentifier
Invoke-WmiMethod -Path "SMS_UserApplicationRequest" -Namespace $namespace -Name CreateApprovedRequest -ArgumentList @($appid, $autoInstall, $clientGuid, $comments, $username)

以下命令行运行示例脚本:

.\CreateApprovedRequest.ps1 "MachineName" "Domain\User" "ScopeId_2E4DAE44-C9A0-4694-8B7A-474424C080D4/Application_88808a3a-86e4-4820-be59-aa7d61cb8c33 "true" "Application has been approved"

管理员仍可以从软件库>应用程序管理>审批请求查看Configuration Manager控制台中的已批准请求

Configuration Manager控制台中的应用程序请求节点

限制

此应用程序审批 WMI 方法的当前版本具有以下限制:

  1. CreateApprovedRequest对于唯一的计算机 ID、应用程序 ID 和用户名组合,方法只能调用一次。 如果多次使用相同的参数调用方法,则返回错误。 有关此错误的详细信息,请参阅 SMSProv.log
  2. 若要启用应用程序的自动安装,请在调用 WMI 方法之前将应用程序部署到用户或用户组的集合。 如果在调用 WMI 方法后创建部署,则应用程序可供用户安装,并且不会自动安装。

方案 3:撤销应用程序审批

如果管理员撤销了审批,或者应用程序不再使用,请卸载该应用程序。

管理员使用 Configuration Manager 控制台、PowerShell 脚本或 WMI 撤销对应用程序的批准。 即使应用程序已获得批准,管理员也可以使用“拒绝”选项。 撤销审批会阻止用户在其设备上安装应用程序。 如果以前安装了应用程序,则相同的作还会导致卸载用户设备上的应用程序。

详细了解 Deny-CMApprovalRequest cmdlet。

撤销应用审批的先决条件

  1. “选择这些新设置以指定公司信息 ”客户端设置设置为 “是”。
  2. 启用可选功能“审批每台设备的用户的应用程序请求”。 有关详细信息,请参阅启用更新中的可选功能

方案 4:基于计算机的预批准请求

可以使用 API CreateApprovedRequest 为不需要用户的设备创建预先批准的请求。 通过此作,可以实时安装和卸载应用程序。 目前,此功能仅在 SDK 中可用。 若要使基于计算机的预批准请求正常工作,还必须启用可选功能 “批准每个设备的用户的应用程序请求”。 有关详细信息,请参阅启用更新中的可选功能

管理员可以使用 New-CMApplicationDeployment cmdlet 创建需要批准的计算机可用部署。 下面是一个示例:

New-CMApplicationDeployment -CollectionName "All Systems" -Name "Test app" -DeployAction Install -DeployPurpose Available -ApprovalRequired $true -DistributionPointName 'DistributionPoint.domain.com" -DistributeContent

创建的部署将 requires approval 标志设置为 true 将 保留在服务器上,并且可以与较大的集合一起使用。 用户请求流尚不适用于需要批准的面向计算机的部署。 因此,在对单个设备创建预先批准的请求之前,应用程序在软件中心不可见。

以下Windows PowerShell示例脚本演示如何调用计算机和应用程序的 WMI 方法以创建预先批准的请求:

$machinename = $args[0]
$appid = $args[1]
$autoInstall = $args[2]
$comments = $args[3]

$scObj=Get-WmiObject -Namespace root\sms -Query 'select SiteCode from sms_providerlocation'
$sitecode = $scObj.SiteCode
$namespace ="root\sms\site_" + $sitecode
$machine = Get-WmiObject -Namespace $namespace -Query "SELECT * FROM SMS_R_SYSTEM WHERE Name = '$machinename'"
$clientGuid = $machine.SMSUniqueIdentifier
Invoke-WmiMethod -Path "SMS_ApplicationRequest" -Namespace $namespace -Name CreateApprovedRequest -ArgumentList @($appid, $autoInstall, $clientGuid, $comments)

以下命令行运行示例脚本:

.\CreateApprovedRequestForMachine.ps1 "MachineName" "ScopeId_2E4DAE44-C9A0-4694-8B7A-474424C080D4/Application_88808a3a-86e4-4820-be59-aa7d61cb8c33 "true" "Application has been approved"

对于 autoInstall 基于计算机的预批准请求,将 参数 false 设置为 在 ConfigurationManger 中不起作用。 在网站上创建预先批准的请求后,设备将尝试安装该应用程序。 可以拒绝从设备中删除应用程序的审批请求。

显示特定设备的所有用户已批准的应用程序的控制台

方案 5:重新提供以前被拒绝的应用程序请求

可以重新提供以前被拒绝的应用程序请求。 重新配置只能通过 SDK API 使用。 以下 PowerShell 示例脚本演示如何在请求被拒绝后批准请求:

$machinename = $args[0]
$username = $args[1]
$appid = $args[2]

$scObj=Get-WmiObject -Namespace root\sms -Query 'select SiteCode from sms_providerlocation'
$sitecode = $scObj.SiteCode
$namespace ="root\sms\site_" + $sitecode
$reqObj = Get-WmiObject -Namespace $namespace -Class SMS_UserApplicationRequest | Where {$_.ModelName -eq $appid -and $_.RequestedMachine -eq $machinename -and $_.User -eq $username }
$reqObjPath = $reqObj.__PATH
Invoke-WmiMethod -Path $reqObjPath -Name Approve

以下命令行运行示例脚本:

.\ReapproveRequest.ps1 "MachineName" "DomainName\Username" "ScopeId_2E4DAE44-C9A0-4694-8B7A-474424C080D4/Application_88808a3a-86e4-4820-be59-aa7d61cb8c33"

方案 6:Email应用程序审批请求的通知

管理员可以为应用程序审批请求配置电子邮件通知。 可以在应用程序部署期间指定应用程序审批者。 当用户请求应用程序时,所有审批者都会收到电子邮件通知,并且可以使用电子邮件中提供的链接批准或拒绝请求。 还可以将云管理网关配置为允许在内部网络外部批准应用程序请求。

电子邮件通知的先决条件

  • 从版本 2107 开始,SMS 提供程序需要 .NET 版本 4.6.2,建议使用版本 4.8。 在版本 2103 及更早版本中,此角色需要 .NET 4.5 或更高版本。 有关详细信息, 请参阅站点和站点系统先决条件

  • 启用可选功能“审批每台设备的用户的应用程序请求”。 有关详细信息,请参阅启用更新中的可选功能

  • 如果未设置 PKI 证书基础结构,请启用 增强型 HTTP

    注意

    增强型 HTTP 的配置按主站点进行。 如果在层次结构中的任何主站点上启用它,则Configuration Manager在所有提供程序上使用自签名证书。 此行为包括 CAS 和其他主站点。

配置电子邮件通知

  1. 在Configuration Manager控制台中,转到“管理>站点配置->站点”。
  2. 选择层次结构中的顶级站点,然后在功能区中选择“ 配置站点组件 ”。
  3. 选择“Email通知”以打开“属性”对话框。
  4. 选中 “为警报启用电子邮件通知 ”,并指定 SMTP 服务器的端口。 如果使用 Microsoft 365,则可以使用 Microsoft 365 SMTP 服务器
  5. 输入 SMTP 服务器的 FQDN 或 IP 地址。
  6. 选择 “指定帐户”,选择“ 设置”,然后选择“ 新建帐户”。
  7. 提供新帐户的用户名和密码,然后单击“ 确定”。
  8. 输入 电子邮件警报的发件人地址
  9. 单击“应用”。
  10. 可以通过发送电子邮件示例来测试 SMTP 服务器。 在“Email通知属性”对话框中选择“测试 SMTP 服务器”。
    • 查看 中的 NotiCtlr.log错误。
    • 建议在 SMS 提供程序上使用 PKI 证书配置 SSL,以在未设置云管理网关时成功批准或拒绝内部网络中的请求。 否则,你将看到包含警告“此安全证书有问题”的页面。

Configuration Manager控制台中的Email通知组件属性

在内部网络外部批准应用程序请求

若要在内部网络外部批准应用程序请求,需要其他设置:

  1. “管理>站点配置>服务器”和“站点系统角色>”SMS 提供程序>属性中启用“允许Configuration Manager云管理网关流量”。
  2. 配置 云管理网关
  3. 启用Microsoft Entra用户发现
  4. 在 Microsoft Entra ID 中为此本机应用配置以下设置, (客户端应用) 。 应在Azure 门户中手动配置这些设置。
    • 重定向 URIhttps://<CMG FQDN>/CCM_Proxy_ServerAuth/ImplicitAuth。 使用云管理网关的完全限定域名 (CMG) 服务,例如,GraniteFalls.Contoso.com。 显示已注册应用的重定向 URI 的Azure 门户

    • 清单:将 oauth2AllowImplicitFlow 设置为 true。 例如:"oauth2AllowImplicitFlow": true,Azure 门户显示已注册应用的清单

测试电子邮件审批过程

让我们演练端到端方案:

  1. 部署可供用户集合使用的应用程序。 在 “部署设置” 页上,启用它以供审批。 此外,输入几个电子邮件地址来接收有关应用程序请求的通知。

    使用批准管理员电子邮件地址创建部署

  2. 用户在软件中心看到新应用程序,并为其发送请求。 站点会在五分钟内将电子邮件通知发送到应用程序部署中指定的地址。

    向审批管理员发送的示例电子邮件

  3. 电子邮件收件人选择 “批准”“拒绝”。 如果站点成功处理了应用程序请求,则会在浏览器中显示成功消息。

    • 如果通过电子邮件批准或拒绝了应用程序请求,则链接将过期,不能由其他人使用。

已知问题

  1. 单击或Deny链接后Approve显示 404 错误。
    • 没有绑定到 管理员 服务的证书。 检查是否启用了Configuration Manager生成的证书功能。 否则,请设置自己的 PKI 证书基础结构。
    • 检查 SMS_REST_PROVIDER.log 是否存在任何错误。
  2. There is a problem with this security certificate 警告后 ApproveDeny 单击链接。
    • 客户端上的 Web 浏览器不信任Configuration Manager生成的证书。 建议在内部网络中使用链接时设置 PKI 证书基础结构。
  3. Service is unavailable, HTTP Error 503 消息。
    • 检查管理员服务是否正在运行。 在提供程序计算机上,转到 “任务管理器>详细信息”。 确保存在名为 的活动进程 sccmprovidergraph.exe
    • 打开Configuration Manager控制台、管理>站点配置>服务器和站点系统角色>SMS 提供程序。 右键单击“ 属性”。 当电子邮件审批功能打算与云管理网关一起使用时, Allow Configuration Manager cloud management gateway traffic. 请确保选中;当该功能用于批准或拒绝内部网络中的请求时,请确保未检查。
  4. 通过云管理网关批准或拒绝请求的链接不起作用。
    • 验证是否已启用Microsoft Entra用户发现。
    • 确保应用程序部署期间指定的电子邮件地址属于组织。
  5. 当用户请求应用程序时,不会发送Email。
    • 验证电子邮件地址是否正确。
    • 确保已配置警报电子邮件通知。
    • 检查 NotiCtrl.log 错误。
  6. “创建应用程序部署”向导中的错误。
    • 确保你有权创建订阅。 订阅将在应用程序部署期间自动创建。