在运行某些报告时提示如下格式的错误

Error in XML document. Hexadecimal value 0x0C, is an invalid character


Manager

SCCMR2 Version 5.0.7958.1203

SQL Version 2012R2 11.0.3000.0

Operating System6.3.9600




故障现象:

     在SCCM控制台(monitoring\Overview\Reporting\Reports\*)运行某些报告时会出现下面截图中的错误:

查看详细信息,内容如下:









原因:

      正如字面意思,出现这个错误是由于你当前运行的这个报告,在做数据库查询时,遇到表中某些值包含非法字符。而字符值就是上面***标记中,开头""包含部分,转换为16进制后的值是0x0C。这些值无发被正确的识别,所以出现报告无法继续运行的错误。

     造成这种错误的情况,在SCCM上主要是"资产智能"这个功能导致,出现最多的是在软件数据的收集上,由于某些软件设计不规范导致的,至于微软为什么让这些字符写入到数据库,我就无法解释了,而且这样还会导致安全隐患。

解决方案:

     虽然知道了问题的原因,我该如何解决?

首先,我们知道是表中的值出现非法字符,那么一定找出这个值,修改或者删除它即可,思路如下:找出报告中涉及的表à找出表中出问题的值à修改或者删除非法的值

A   找出报告涉及的表格

可以通过ReportBuilder工具,查看报告的数据源,找出对应的视图,然后通过视图找出涉及的表。

     通过WEB方式,访问SCCM的报表点,这个报告点取决于你的部署。我的报告点就是我的SCCM服务器。

打开Report Builder(如过你打开后不能看到上图中的内容,那么请你先解决这个问题再继续),在ReportBuilder里面打开出现错误的报告。我这里是Software 01A

我们会看到DataSets,这里面配置了这个报告所需要的所有查询语句,我们可以通过查看DataSets的配置,找出报告引用的视图。打开每个DataSet的属性。

打开Query Designer

把Query中间的语句复制到记事本中,注意下图中标黄的语句,这些语句就是这个报告所涉及的视图,根据报告的不同可以会涉及很多个视图。如过有多个DataSet那么可以分析那个是最有可能的,例如我现在用的这个报告,是根据指定的集合和指定的发布者显示安装数量和版本信息。那么DataSet0根据名称判断就是已经安装软件的视图。而Dataset1主要是集合ID的查询,如过集合ID出现问题,那么方式要用到集合的报告都会出问题,根据排除法集合ID的表格是没有问题的,而且集合信息本身是在SCCM中生成,肯定是符合规范的。对于Dataset2是用户SID这个就更不用去查了。

那么我将注意力集中到v_GS_INSTALLED_SOFTWARE 这个视图上。

通过SQL Management Studio打开SCCM数据库,找到这个视图:

点击右键,选择Design

通过Design我们可以看到这个视图引用了哪些表

注意黄线部分就是这个视图引用的数据库中的表。

B 查询出问题的数据

找到表了,我们的工作已经完成一半了,找到对应的表,查询错误的值:

通过如下语句:

SelectPublisher00,*

from [CM_TTY].[dbo].INSTALLED_SOFTWARE_DATA

WHERECONVERT(varchar(max),convert(varbinary(max),Publisher00),2)LIKE'%0C%'


注意%0C%就是错误中出现的值,以16进制形式表示,查询出来的值拷贝到Excel中如下图,会出现很多乱码,这些都是错误的数据。

C 删除错误数据

SQL 语句:

delete from [CM_TTY].[dbo].INSTALLED_SOFTWARE_DATA where InstanceKey='86'  and MachineID='16777774'

根据表的主键,我们将错误的数据删除,建议大家将查询出来的数据都删除,即使看起来正常。



PS:

我的版本是SCCM 2012R2 ,论坛上有说升级到R2 SP1可以解决这个问题,有可能这个是SCCM的一个Bug。