Error "Ya se ha agregado un elemento con la misma clave" al abrir una lista en VAMT 2.0 en un equipo basado en Windows 7

Este artículo ayuda a corregir un error (ya se ha agregado un elemento con la misma clave) que se produce al abrir una lista en Herramienta de administración de activación por volumen (VAMT) 2.0.

Se aplica a: Windows 7 Service Pack 1
Número de KB original: 2383895

Síntomas

Al abrir una lista (.cil) en VAMT 2.0 en un equipo basado en Windows 7, es posible que reciba el siguiente mensaje de error:

Ya se agregó un elemento con la misma clave.

Causa

Este problema puede producirse si hay varios adaptadores de red en el equipo y estos adaptadores de redes tienen la misma dirección MAC. Por ejemplo, este problema puede producirse si tiene dos adaptadores de red para una máquina virtual y configura estos adaptadores de red para que tengan la misma dirección MAC.

Si abre el archivo CIL en esta situación, verá una entrada similar a la siguiente:

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>

Solución

Para resolver este problema, elimine manualmente las entradas duplicadas de la CIL o para automatizar este proceso, use el siguiente código fuente para crear un script de PowerShell para automatizarlo.


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

A continuación, siga estos pasos en un equipo con Windows 7:

  1. Copie el archivo CIL guardado en c:\script. Por ejemplo, c:\script\saved.cil

  2. Copie el código fuente incluido de este artículo de KB en el Portapapeles.

  3. Haga clic en Inicio, Todos los programas, Accesorios, Windows PowerShell, "Windows PowerShell ise"

  4. En Windows PowerShell, haga clic en la ventana Untitled1.ps1.

  5. Pegue el contenido del script de este artículo.

  6. Haga clic en Archivo, guarde como c:\script\ScrubCil.ps1

  7. Haga clic en Iniciar > todos los accesorios > de programas > Windows PowerShell, haga clic con el botón derecho en "Windows PowerShell" y elija "Ejecutar como administrador"

  8. En el tipo de símbolo del sistema de PowerShell, los siguientes comandos

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

Recolección de datos

Si necesita ayuda del soporte técnico de Microsoft, le recomendamos que recopile la información siguiendo los pasos mencionados en Recopilación de información mediante TSS para problemas relacionados con la implementación.