SCCM是微软的企业级桌面管理产品,说是桌管,但其实在老王看来SCCM最能拿得出手的实际上是它的资产智能报表和符合性基线功能。

大家玩过SCCM的都知道,SCCM报表默认能统计上来的资产无非就是硬件信息,软件安装信息,许可信息。

统计软件的时候可以按照软件的维度,统计某集合下所有的已安装软件,通过报表钻取一级一级的找到安装了软件的计算机,计算机的硬件配置,IP,登录用户。

但是在我国企业信息项目永远都需要的就是定制,老板们需要简单一目了然

举个例子,有个需求,需要定义出一类非办公软件,在一张报表里面统计出有哪些计算机,安装了非办公软件,以及这些计算机的使用人。

得到这个需求后,如果你仔细看过每一张报表你会发现,看起来很简单的需求,但没有一张报表可以直接显示出来这些信息。而且怎样定义出来非标准软件也是个问题,如果你只是到处简简单单的了解一下,你是找不到怎么去定义这个东西的。

本篇文章老王就以这个需求为例,为广大itpro介绍一下如何去定义非办公软件,简单的找到我们需要的数据,以及如何在不开发的情况下的输出成报表。


在正式开始之前,我们需要补充一些基础知识

什么是WMI,WMI是微软提供的一个封装了Windows上面所有硬件软件信息资源的规范API接口,我们可以通过wmic命令,VBScript,powershell,C#,WQL语言去对WMI封装的资源进行查询,管理操作。
举个例子我们可以通过powershell调用WMI类SoftwareLicensingProduct,查询系统windows office的到期时间。

WQL是WMI特有的查询语言

可以通过wbemtest工具查找类,对WQL语言进行测试。

WQL类似于SQL语言,但语法仍存在不同之处,不可直接拿到SQLServer里面执行。


WMI和SCCM的关系

SCCM客户端代理通过WMI收集客户端信息,汇报给SCCM服务器

SMS Provider :在ConfigMgr 控制台和站点数据库服务器之间提供接口的WMI提供程序,默认安装完成主站点之后自动包括的一个组件,由于SCCM使用WMI(WQL语言),而SQL数据库运行的是SQL实例,可以简单理解为是通过SMS Provider将WQL翻译为SQL,最终实现SCCM和SQL之间的交互。

大家在SCCM控制台执行操作的时候,比较明显的两个地方,基于查询规则创建集合,监视里面创建查询的时候,我们通过图形界面点击的时候,在图形界面看到的语言显示的会是WQL,很多人以为是SQL语言,实际上我们控制台上面写的查询并不是实际的SQL,而是通过smsprov将wql转为sql语言最终去执行,事实上不仅仅是这个地方,很多个位置都是我们在SCCM控制台执行的操作后台都会通过smsprov这个组件实际帮我们转换成SQL执行。


OK,基础知识铺垫到位,下面开始完成我们的需求,要实现这个需求有两种方案,今天我们先说曲线救国的一种

这个需求首先我们需要定义出一类软件,这一些软件为非办公软件,先把这部分数据拿到。

打开SCCM控制台-监视-查询,查询是个好玩具,我们可以通过简单的向导,生成一个WQL查询,我们甚至不需要关注WQL语言怎么写,只需要知道我们想要的数据应该在哪找到就可以。

一,创建查询,定义需要包含在查询内的范围,本次我们选择设备集合
SCCM2016定制软件资产报表

二,点击编辑查询语句,弹出查询向导,定义查询结果中,需要显示的列,这里有很多属性类大家可以多去看看找出自己需要的。
SCCM2016定制软件资产报表
最终显示结果应该包括
已安装的应用信息类下面的显示名称属性
已安装的应用信息类下面的版本属性
系统资源类下面的名称属性(计算机名)
系统资源下面的上一个登录用户名属性
SCCM2016定制软件资产报表

三,定义非办公软件,过滤只显示非办公软件的数据

听到这个需求的时候,我脑袋里第一时间想到的是通过软件标签来玩,定义一批软件标签,然后给一次性的给收集上来的软件按照标签打上,最终在按照标签统计报表。

但其实通过查询我们也可以实现完成这种需求,打开刚才的编辑查询语句,调出查询向导,编辑条件,这里有两种玩法,第一种条件是直接添加的方式,添加条件,条件类型为值列表,位置为已安装的应用程序,显示名称,基于显示名称作为判断条件,运算符选择属于,点击左下方的值,可以列出所有通过SCCM收集上来的客户端上面已经安装的软件,我们可以一个一个点击然后添加到右面。定义出一批非办公软件列表,然后点击确定保存。
SCCM2016定制软件资产报表
点击查询设计界面的显示查询语句,可以看到通过我们在向导编辑后,自动生成的WQL语言,可以拷贝出来,以后直接导入复用。
SCCM2016定制软件资产报表
SCCM2016定制软件资产报表
四,执行查询结果,可以看到输出在界面上的数据
SCCM2016定制软件资产报表

五,查询结果转换
到现在为止,我们所需要的数据已经拿到了,看到这里大家应该可以发现,查询的好处就是简单,方便,通过一个向导就可以直接帮我们生成想要的查询结果。这可能也就是一直保留WQL的一个原因,方便我们这些不能直接写SQL的itpro在图形界面执行查询,但是不完美的地方就是定义好的查询,只能在SCCM控制台点击运行这样查看,不能生成报表,所以看起来还是不太方便。

查询的语言还不能直接用来做出报表,原因就是SCCM报表使用的是SQL语言做的,而查询界面的查询结果是WQL语言

但是我们可以通过方法将WQL转成能用来做报表的SQL语言

SCCM有一个log叫smsprov.log,位于安装路径Program Files\Microsoft Configuration Manager\Logs里面,smsprov.log记录了我们在SCCM控制台执行的所有操作,以及背后的实际运作,例如我们推送软件的过程,界面上面执行WQL查询后台转换SQL的过程。

我们点击运行一次创建好的查询结果,然后通过cmtrace打开smsprov.log,可以看到后台实际上WQL转成SQL后的语句,语句可以直接拷贝交给开发,或者放到Report Builder制作报表。
SCCM2016定制软件资产报表

六,制作报表
在SCCM控制台监视报表中创建一个报表,会自动呼叫出Report Builder窗口
SCCM2016定制软件资产报表

添加数据源,使用共享连接或报表模型,浏览Reportserver目录下,找到SCCM报表目录中的数据源文件
SCCM2016定制软件资产报表
添加凭据后测试连接,确保成功创建连接,点击确定。
SCCM2016定制软件资产报表

添加数据集,选择使用嵌入的数据集,浏览已经添加的数据源,在查询窗口把从smsprov日志复制的转换后的sql语句粘贴进来
SCCM2016定制软件资产报表
添加之后,点击刷新字段,如果没有报错,会在字段界面显示我们在查询中定义的四个列,如果这一步报错不能正常刷新字段,说明语句中可能包含错误。
SCCM2016定制软件资产报表
可以改成更加直观的显示名
SCCM2016定制软件资产报表

返回Report Builder首页,点击添加表,选择我们定好的数据集
SCCM2016定制软件资产报表

将可用字段拖拽到值区域
SCCM2016定制软件资产报表

点击下一步,选择报表颜色样式
SCCM2016定制软件资产报表
点击完成,可以看见我们定制好的报表,可以通过插入图片,文字,进行编辑格式,编辑完成后,点击上方保存即可自动发布回SCCM
SCCM2016定制软件资产报表
打开SCCM Report网页,可以看见我们刚才发布的报表,数据是实时更新的,可以计划生成,也可以转成其他格式输出。
SCCM2016定制软件资产报表

至此我们通过第一种方法实现了需求,思路流程如下

1.通过自带查询功能曲线定义非办公软件
2.将查询获得的WQL语句转换为SQL语句
3.使用转换后的SQL语句创建Report报表

在通过查询定义条件时候,也可以在条件处,条件类型选择简单值,运算符选择类似于,可以通过模糊匹配出一类软件,如 所有名称%匹配游戏的软件,所有名称%匹配下载软件的,可以添加多个条件,多个条件之间会是or的关系,然后把WQL转换为SQL拿去使用。

select SMS_G_System_ADD_REMOVE_PROGRAMS.DisplayName, SMS_R_System.LastLogonUserName from SMS_R_System inner join SMS_G_System_ADD_REMOVE_PROGRAMS on SMS_G_System_ADD_REMOVE_PROGRAMS.ResourceID = SMS_R_System.ResourceId where SMS_G_System_ADD_REMOVE_PROGRAMS.DisplayName like "%游戏%" or SMS_G_System_ADD_REMOVE_PROGRAMS.DisplayName like "%下载%"


希望可以通过我的这篇文章为大家抛砖引玉,把SCCM的报表功能更好的在企业运用起来,下篇我讲为大家介绍,如何通过为软件定义标识的方式区分出不同类别软件。