Erro "Um item com a mesma chave já foi adicionado" ao abrir uma lista no VAMT 2.0 em um computador baseado no Windows 7

Este artigo ajuda a corrigir um erro (um item com a mesma chave já foi adicionado) que ocorre quando você abre uma lista no Ferramenta de Gerenciamento de Ativação de Volume (VAMT) 2.0.

Aplica-se a: Windows 7 Service Pack 1
Número de KB original: 2383895

Sintomas

Ao abrir uma lista (.cil) no VAMT 2.0 em um computador baseado no Windows 7, você poderá receber a seguinte mensagem de erro:

Um item com a mesma chave já foi adicionado.

Motivo

Esse problema poderá ocorrer se houver vários adaptadores de rede no computador e esses adaptadores de redes tiverem o mesmo endereço MAC. Por exemplo, esse problema pode ocorrer se você tiver dois adaptadores de rede para uma máquina virtual e configurar esses adaptadores de rede para ter o mesmo endereço MAC.

Se você abrir o arquivo CIL nesta situação, verá uma entrada que se assemelha ao seguinte:

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>

Resolução

Para resolve esse problema, exclua manualmente as entradas duplicadas do CIL ou para automatizar esse processo, use o código-fonte a seguir para criar um script do PowerShell para automatizar.


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);

Em seguida, siga estas etapas em um computador Windows 7:

  1. Copie o arquivo CIL salvo para c:\script. Por exemplo, c:\script\saved.cil

  2. Copie o código-fonte incluído deste artigo KB na área de transferência

  3. Clique em Iniciar, Todos os Programas, Acessórios, Windows PowerShell, "Windows PowerShell ise"

  4. Em Windows PowerShell, clique na janela Untitled1.ps1

  5. Cole o conteúdo do script deste artigo

  6. Clique em Arquivo, salvar como, c:\script\ScrubCil.ps1

  7. Clique em Iniciar > Todos os Programas acessórios >> Windows PowerShell, clique com o botão direito do mouse em "Windows PowerShell" e escolha "Executar como Administrador"

  8. No tipo de prompt do PowerShell, os comandos a seguir

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

Coleta de dados

Se você precisar de ajuda do suporte da Microsoft, recomendamos coletar as informações seguindo as etapas mencionadas em Coletar informações usando o TSS para problemas relacionados à implantação.