删除重复的管理包别名

使用 System Center Operations Manager 2019 UR4 和 2022 RTM 时,System Center Operations Manager 管理包引用别名区分大小写,并且仅创建唯一的别名。 因此,System Center Operations Manager 更新汇总升级或版本升级将在存在重复管理包引用别名的环境中失败。

本文有助于删除重复的管理包引用别名(如果存在),以便 System Center Operations Manager 更新汇总升级或版本升级成功完成。

在升级到 System Center Operations Manager 2019 UR4 之前,请确保删除所有重复的管理包别名。

检测重复的管理包别名

若要检测具有重复管理包别名的管理包,请执行以下操作:

在管理服务器上启动 PowerShell ISE,或针对 System Center Operations Manager Operations Database 运行 T-SQL。

PowerShell 脚本

############################################
#Identify MPs imported with duplicate Aliases
Import-Module OperationsManager
$mps = Get-SCOMManagementPack
foreach ($mp in $mps)
{
  	$hashTable = @{}
 	 foreach ($ref in $mp.References)
  	{
   	 try {$hashTable.Add($ref.Key, $ref.Value)}
    	catch
    	{
     	 $MPName = $mp.Name
     	 $MPDisplayName = $mp.DisplayName
     	 $MPVersion = $mp.Version
        "MP contains duplicate aliases: Name=($MPName) DiplayName=($MPDisplayName) Version=($MPVersion)"
    	}
  	}
}
############################################ 

T-SQL

-- LIST ALL MPs that have a duplicate Alias reference
DECLARE @mpFriendlyName NVARCHAR(255),
        @mpName         NVARCHAR(255),
        @mpId           UNIQUEIDENTIFIER,
        @mpXml          AS XML

CREATE TABLE #badmptable
  (
     mpid           UNIQUEIDENTIFIER,
     mpname         NVARCHAR(255),
     mpfriendlyname NVARCHAR(255)
  )

DECLARE mp_cursor CURSOR local forward_only read_only FOR
  SELECT mpfriendlyname,
         mpname,
         managementpackid,
         CONVERT(XML, mpxml)
  FROM   managementpack

OPEN mp_cursor

FETCH next FROM mp_cursor INTO @mpFriendlyName, @mpName, @mpId, @mpXml

WHILE @@FETCH_STATUS = 0
  BEGIN
      SELECT n.value('@Alias', 'nvarchar(255)') AS mpRef
      INTO   #temprefs
      FROM   @mpXml.nodes('/ManagementPack/Manifest/References/Reference') AS a(
             n)

      IF EXISTS (SELECT Count(*)
                 FROM   #temprefs
                 GROUP  BY mpref
                 HAVING Count(*) > 1)
        BEGIN
            INSERT INTO #badmptable
                        (mpid,
                         mpname,
                         mpfriendlyname)
            VALUES      ( @mpId,
                          @mpName,
                          @mpFriendlyName )
        END

      DROP TABLE #temprefs

      FETCH next FROM mp_cursor INTO @mpFriendlyName, @mpName, @mpId, @mpXml
  END

CLOSE mp_cursor

DEALLOCATE mp_cursor

SELECT *
FROM   #badmptable

DROP TABLE #badmptable
--End

方案 1

如果 PowerShell 或 T-SQL 脚本的输出不返回任何值,则没有重复的管理包别名。 继续执行 UR4 升级。

方案 2

如果输出返回一行或多行,请执行以下操作:

  1. 如果管理包未密封

    1. 从控制台导出管理包。

    2. 使用文本编辑器打开管理包 XML。

    3. 标识重复的别名。

    4. 在“引用”下重命名其中一个别名,并在 XML 正文中使用别名的所有其他位置。
      在此示例中,我们有两个别名,它们被视为 System Center Operations Manager 2019 UR4 中的重复项。

      显示别名示例的屏幕截图。

      若要检测使用别名的位置,请使用 AliasName 搜索 XML。 在这种情况下,它是 BADALIAS。 请注意使用引用的位置。

      将其中一个别名重命名为引用的唯一名称,并将旧名称的所有匹配项替换为上述步骤中检测到的新名称。

    5. 重命名重复别名后,将管理包重新导入 System Center Operations Manager。

  2. 如果已密封管理包

    1. 根据首选项工具打开密封的管理包。
    2. 标识重复的别名。
    3. 在“引用”下重命名其中一个别名,并在 XML 正文中使用别名的所有其他位置。
    4. 在 System Center Operations Manager 中重新生成管理包并重新导入。
    5. 可以通过编辑 XML - 密封管理包重新导入管理包来完成相同的步骤。

在所有管理包上完成缓解后,请重新运行 PowerShell 脚本或 T-SQL 脚本,以确保它不返回任何输出。

针对作为输出返回的每个管理包,请遵循上述步骤。