今天碰到一个关于WSUS控制台无法查看和刷新计算机组的问题,用户只要在计算机组里面刷新计算,选择“任何”类型的计算机,WSUS控制台会马上崩溃,如下图:

WSUS控制台由于程序异常崩溃_第1张图片

转到计算机应用程序日志,会发现如下日志记录:

WSUS 管理控制台遇到意外错误。这可能是暂时错误;请尝试重新启动该管理控制台。如果此错误仍然存在,

请尝试通过删除 %appdata%\Microsoft\MMC\ 下的 wsus 文件来删除该控制台的永久性首选项。


WSUS 管理控制台遇到意外错误。这可能是暂时错误;请尝试重新启动该管理控制台。如果此错误仍然存在,

请尝试通过删除 %appdata%\Microsoft\MMC\ 下的 wsus 文件来删除该控制台的永久性首选项。


System.Xml.XmlException – “口”(十六进制值 0x16)是无效的字符。 第 1 行,位置 7363841。

Source
System.Xml

Stack Trace:
    在 System.Xml.XmlTextReaderImpl.Throw(String res, String[] args)
    在 System.Xml.XmlTextReaderImpl.ParseNumericCharRefInline(Int32 startPos, Boolean expand, StringBuilder internalSubsetBuilder, Int32& charCount, EntityType& entityType)
    在 System.Xml.XmlTextReaderImpl.ParseCharRefInline(Int32 startPos, Int32& charCount, EntityType& entityType)
    在 System.Xml.XmlTextReaderImpl.ParseText(Int32& startPos, Int32& endPos, Int32& outOrChars)
    在 System.Xml.XmlTextReaderImpl.ParseText()
    在 System.Xml.XmlTextReaderImpl.ParseElementContent()
    在 System.Xml.XmlReader.ReadStartElement()
    在 System.Xml.Serialization.XmlSerializationReader.ReadStringValue()
    在 System.Xml.Serialization.XmlSerializationReader.ReadTypedPrimitive(XmlQualifiedName type, Boolean elementCanBeType)
    在 Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderApiRemotingCompressionProxy.Read1_Object(Boolean isNullable, Boolean checkType)
    在 Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderApiRemotingCompressionProxy.Read2_GenericReadableRow(Boolean isNullable, Boolean checkType)
    在 Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderApiRemotingCompressionProxy.Read339_Item()
    在 Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer623.Deserialize(XmlSerializationReader reader)
    在 System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
** this exception was nested inside of the following exception **


System.InvalidOperationException -- XML 文档(1, 7363841)中有错误。

Source
System.Xml

Stack Trace:
    在 System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
    在 System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle)
    在 System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall)
    在 System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
    在 Microsoft.UpdateServices.Internal.ApiRemoting.ExecuteSPSearchComputers(String computerTargetScopeXml)
    在 Microsoft.UpdateServices.Internal.DatabaseAccess.AdminDataAccessProxy.ExecuteSPSearchComputers(String computerTargetScopeXml)
    在 Microsoft.UpdateServices.Internal.BaseApi.ComputerTarget.SearchComputerTargets(ComputerTargetScope searchScope, UpdateServer updateServer)
    在 Microsoft.UpdateServices.UI.AdminApiAccess.BulkComputerPropertiesCache.GetAndCacheComputers(ExtendedUpdateScope updateScope, ComputerTargetScope computerTargetScope)
    在 Microsoft.UpdateServices.UI.SnapIn.Pages.ComputersListPage.GetListRows()

仔细查看上面的错误,请注意

image

image

说明控制台在获取数据库数据的时候,数据库中包含了非法字符,导致WSUS在呈现数据的时候出现的错误,无法解释非法字符。控制台直接崩溃。这种情况,在SCCM中也可能 会出现,主要的原因是由于,客户端计算机中的某些信息,这些信息中包含了非法字符。

解决办法:通过SQL管理工具,打开WSUS数据库中的dbo.tbComputerTargetDetail 表,编辑所有行(如何编辑所有行自行百度);返回结果如下,点击左上角全选数据,Ctrl+C复制所有数据,通过Notdpad++打开,复制到Notepad++中去

WSUS控制台由于程序异常崩溃_第2张图片

搜索

image

中显示的那个方框字符,搜索方法就是,在日志中复制这个字符,然后在Notepad++中粘贴,搜索。

image

找到这个字符后,有个对应的TargetID,根据ID,在数据库中找到对应的行,然后修改非法字符,填入一个合法字符,必须DELL或者HP。关闭SQL管理工具。打开控制台,故障修复。