删除重复的管理包别名

使用 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。 记下使用引用的位置。

      将这些别名之一重命名为 Reference 下的唯一名称,并将旧名称的所有匹配项替换为上述步骤中检测到的新名称。

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

  2. 如果管理包已密封

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

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

对作为输出返回的每个管理包执行上述步骤。