Ошибка "Элемент с тем же ключом уже добавлен" при открытии списка в VAMT 2.0 на компьютере под управлением Windows 7

Эта статья поможет устранить ошибку (элемент с тем же ключом уже добавлен), которая возникает при открытии списка в средство управления активацией корпоративных лицензий (VAMT) 2.0.

Применяется к: Windows 7 с пакетом обновления 1 (SP1)
Исходный номер базы знаний: 2383895

Симптомы

При открытии списка (.cil) в VAMT 2.0 на компьютере под управлением Windows 7 может появилось следующее сообщение об ошибке:

Элемент с тем же ключом уже был добавлен

Причина

Эта проблема может возникнуть, если на компьютере есть несколько сетевых адаптеров и эти сетевые адаптеры имеют одинаковый MAC-адрес. Например, эта проблема может возникнуть, если у вас есть два сетевых адаптера для виртуальной машины и вы настроили эти сетевые адаптеры на один и тот же MAC-адрес.

Если открыть CIL-файл в этой ситуации, появится запись, похожая на следующую:

NetworkName="contoso.com" Id="e3f3f83c-f050-4d81-9117-xx">
<MacAddresses>
<MacAddress>00:11:11:CF:FC:xx</MacAddress>
<MacAddress>00:11:11:CF:FC:xx</MacAddress>
</MacAddresses>

Разрешение

Чтобы устранить эту проблему, вручную удалите повторяющиеся записи из CIL или, чтобы автоматизировать этот процесс, используйте следующий исходный код для создания скрипта PowerShell для автоматизации.


param($inputFilePath, $vamtDirPath)

$cilFilePath = Resolve-Path $inputFilePath;

if (!$cilFilePath)

{

Write-Error "Expected input file name of target CIL";

exit 1;

}

if ($vamtDirPath)

{

$vamtDirPath = Resolve-Path $vamtDirPath;

}

else

{

$prograPath = [environment]::GetEnvironmentVariable("ProgramFiles(x86)");

if (!$prograPath -or $prograPath -eq "")

{

$prograPath = [environment]::GetEnvironmentVariable("ProgramFiles");

}

$vamtDirPath = $prograPath + "\VAMT 2.0"

}

try

{

$assembly = [System.Reflection.Assembly]::LoadFile($vamtDirPath + "\Vamtrt.dll");

}

catch

{

Write-Error "Error while attempting to load VAMT assembly. Provide the correct path to your VAMT installation if VAMT is not installed to the default directory.";

exit 1;

}

$fileSerializer = new-object Microsoft.SoftwareLicensing.Vamt.FileSerializer($cilFilePath);

$softwareLicensingData = $fileSerializer.Deserialize();

for ($i = 0; $i -lt $softwareLicensingData.Machines.Length; $i++)

{

$machine = $softwareLicensingData.Machines[$i];

if ($machine.MacAddresses.Count -gt 0)

{

$distinctMacAddrs = new-object System.Collections.ObjectModel.Collection[string];

foreach ($mac in $machine.MacAddresses)

{

if (!$distinctMacAddrs.Contains($mac))

{

$distinctMacAddrs.Add($mac);

}

}

$machine.MacAddresses.Clear();

foreach ($distinctMac in $distinctMacAddrs)

{

$machine.MacAddresses.Add($distinctMac);

}

}

}

$fileSerializer.Serialize($softwareLicensingData);

Затем выполните следующие действия на компьютере с Windows 7:

  1. Скопируйте сохраненный CIL-файл в c:\script. Например, c:\script\saved.cil

  2. Скопируйте включенный исходный код из этой статьи базы знаний в буфер обмена

  3. Щелкните Пуск, Все программы, Стандартные, Windows PowerShell, "Windows PowerShell ise"

  4. В Windows PowerShell щелкните в окне Untitled1.ps1

  5. Вставка содержимого скрипта из этой статьи

  6. Щелкните Файл, сохранить как, c:\script\ScrubCil.ps1

  7. Щелкните Запустить > все программы > Стандартные > Windows PowerShell, щелкните правой кнопкой мыши "Windows PowerShell" и выберите "Запуск от имени администратора".

  8. В командной строке PowerShell введите следующие команды.

    cd\script
    set-executionpolicy unrestricted
    .\ScrubCil.ps1 saved.cil
    

Сбор данных

Если вам нужна помощь службы поддержки Microsoft, мы рекомендуем собирать информацию путем выполнения действий, описанных в разделе Сбор информации с помощью TSS для решения проблем, связанных с развертыванием.