使用 System Center 2012 Configuration Manager 中的应用程序目录,用户能够浏览、请求和安装提供给他们的软件。您也许想知道是否可以量身定制应用程序目录功能,使其更符合您的业务需求。回答是肯定的,这篇博文将提供一些示例。

应用程序目录网站角色包括与目录网页一同运行的 ASP.NET Web 服务。此服务支持应用程序目录操作,例如检索应用程序列表或提交应用程序请求

入门知识

第一个步骤是将该 Web 服务配置为公布其接口,使得连接客户端能够使用该服务。要执行此操作,请在应用程序目录网站的物理文件夹的根目录下找到 web.config 文件。该文件夹可能位于以下位置,取决于您的配置:

  • <drive>:\SMS_CCM\CMApplicationCatalog\
  • <drive>:\Program Files\SMS_CCM\CMApplicationCatalog\
  • <drive>:\Windows\CCM\CMApplicationCatalog\

找到 web.config 中的“webServices”部分:

修改 web.config 以删除 <remove name=”Documentation”> 节点:

然后,您可从以下来源获取服务引用(假设应用程序目录网站角色的默认虚拟名称):

http(s)://<myserver>/CMApplicationCatalog/ApplicationViewService.asmx

– 其中 <myserver> 是托管应用程序目录网站角色的服务器。

如果您使用的是 Visual Studio,您可添加对应用程序目录的服务引用,如以下屏幕截图所示:

您现在应该能够从项目调用可用服务方法。在本例中,将在“ApplicationCatalogService”命名空间下生成 Soap 客户端类。

示例:使用 Web 服务检索可用应用程序列表

创建服务引用后,您可以调用 Web 服务方法以检索用户可用的类别和应用程序列表。请注意,仅返回应用程序目录中的可用应用程序。

同样,以下服务调用将检索表示为 AppDetailView 对象的应用程序列表:

在此情况下,应用程序目录将返回前 20 个应用程序,按名称排序。

请注意,应用程序目录网站角色要求 Windows 身份验证。没有模拟,Soap 客户端将使用当前用户上下文来传递信息。

示例:使用 Windows PowerShell 检索应用程序列表和提交应用程序请求

下一个示例显示如何使用 Windows PowerShell 来创建脚本,以提交应用程序请求。请注意,本例不包括在应用程序得到批准后提供审批对话框所需的功能。

我建议使用 Windows PowerShell 2.0 中的非常方便的 New-WebServiceProxy cmdlet,以动态创建服务引用,如下所示:

# Create web service proxy
$catalogurl = "http://myserver/CMApplicationCatalog";
$url = $catalogurl+"/ApplicationViewService.asmx?WSDL";
$service = New-WebServiceProxy $url -UseDefaultCredential;

然后,您可以调用服务来检索应用程序列表。为简单起见,本例从列表中挑选第一个应用程序。或者,也可以使用 SMS 提供程序或应用程序目录来检索应用程序 ID。请注意,应用程序目录方法的应用程序 ID 参数没有版本信息。 

# Retrieve the first 20 applications sorted by name 
# Sample app id: "ScopeId_82A46150-9A71-421A-9645-AD4B92AF1B72/Application_295530ae-5755-48fc-a04b-c01c9631c1f7" 
 
$total = 0; 
$apps = $service.GetApplications("Name",$null,"Name","",20,0,$true,"PackageProgramName",$false,$null,[ref]$total) 
$appid = $apps[0].ApplicationId;

当用户从应用程序目录请求应用程序时,将使用设备信息来验证和跟踪请求。以下示例显示如何在客户端计算机上使用 WMI 检索设备信息:

# Retrieve device id to identify the machine 
$clientsdk = [wmiclass]'root/ccm/clientSDK:CCM_SoftwareCatalogUtilities'; 
$deviceidobj = $clientsdk.GetDeviceID(); 
$deviceid = $deviceidobj.ClientId+","+$deviceidobj.SignedClientId;

接下来,包含请求原因的设备信息发送至应用程序目录:

# Submit application request to the server 
$reason = "Test request reason"; 
$reqresult = $service.RequestApplicationForUser($reason, $appid, $deviceid, $null);

示例:使用 Windows PowerShell 审批应用程序请求

要对待处理请求执行管理操作,请首先连接到 SMS 提供程序。请注意,您必须具备应用程序审批者权限,才能执行以下操作: 

# Retrieve provider info, assumes one provider 
$siteserver = "MySiteServer" 
$provider = gwmi -ComputerName $siteserver -namespace "root\sms" -query "SELECT * FROM SMS_ProviderLocation"; 
$prov_machine = $provider.Machine; 
$sitecode = $provider.SiteCode; 
$namespace = "root\sms\site_"+$sitecode;

接下来,运行查询以查找应用程序的请求对象。然后,本例批准对此应用程序的所有待处理请求。请注意,批准是不可还原的。此外,也不支持对 SMS_UserApplicationRequest 对象的删除操作。
虽然此处的特定操作不需要查询,但我仍然提供了对特定 SMS_Application 对象的查询示例: 

# get the list of pending requests for this application and approve for all users 
$wmiquery = "SELECT * FROM SMS_Application WHERE ModelName = '"+$appid+"' AND IsLatest='TRUE'"; 
$adminapp = gwmi -ComputerName $prov_machine -namespace $namespace -query $wmiquery; 
$wmiquery = "SELECT * FROM SMS_UserApplicationRequest WHERE ModelName = '"+$appid+"'"; 
$adminrequests = gwmi -ComputerName $prov_machine -namespace $namespace -query $wmiquery; 
foreach ($request in $adminrequests) 
{        
    $res = $request.Approve("Approved via Windows PowerShell");    
}

如果用户浏览到应用程序目录,对此应用程序的请求将标记为已批准。

出于安全原因,当您不再需要 WSDL 发布来实施 Web 服务时,请务必还原您对 web.config 文件所做的全部更改。

总结:

        应用程序目录网站角色提供帮助扩展应用程序目录的服务层

        SMS 提供程序公开 API 以批准或拒绝应用程序请求

        本篇博文所示的操作可使用您选择的任何语言编写,包括 Windows PowerShell

我希望这些信息能够帮助您扩展应用程序目录功能。有关应用程序目录和 System Center 2012 Configuration Manager 可扩展性的更多信息,请参阅 TechNet 上的 System Center 2012 Configuration Manager 文档库中的在 Configuration Manager 内配置应用程序目录和软件中心,以及 MSDN 库中的 System Center 2012 Configuration Manager SDK

Anton Varshavskiy

本文按“原样”提供,不包含任何保证,而且不授予任何权利。