在 System Center 2012 Configuration Manager 中扩展应用程序目录

使用 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 = "https://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

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