在 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。
本文按“原样”提供,不包含任何保证,而且不授予任何权利。