Errore "Un elemento con la stessa chiave è già stato aggiunto" quando si apre un elenco in VAMT 2.0 in un computer basato su Windows 7

Questo articolo consente di correggere un errore (è già stato aggiunto un elemento con la stessa chiave) che si verifica quando si apre un elenco in Strumento di gestione dell'attivazione dei contratti multilicenza (VAMT) 2.0.

Si applica a: Windows 7 Service Pack 1
Numero KB originale: 2383895

Sintomi

Quando si apre un elenco (.cil) in VAMT 2.0 in un computer basato su Windows 7, è possibile che venga visualizzato il messaggio di errore seguente:

È già stato aggiunto un elemento con la stessa chiave

Causa

Questo problema può verificarsi se nel computer sono presenti più schede di rete e queste schede di rete hanno lo stesso indirizzo MAC. Ad esempio, questo problema può verificarsi se si dispone di due schede di rete per una macchina virtuale e si configurano queste schede di rete in modo che abbiano lo stesso indirizzo MAC.

Se si apre il file CIL in questa situazione, viene visualizzata una voce simile alla seguente:

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>

Risoluzione

Per risolvere il problema, eliminare manualmente le voci duplicate dal CIL o automatizzare questo processo, usare il codice sorgente seguente per creare uno script di PowerShell per automatizzare.


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

Seguire quindi questa procedura in un computer Windows 7:

  1. Copiare il file CIL salvato in c:\script. Ad esempio, c:\script\saved.cil

  2. Copiare il codice sorgente incluso da questo articolo della Knowledge Base negli Appunti

  3. Fare clic su Start, Tutti i programmi, Accessori, Windows PowerShell, "Windows PowerShell ise"

  4. In Windows PowerShell fare clic nella finestra Untitled1.ps1

  5. Incollare il contenuto dello script da questo articolo

  6. Fare clic su File, salva con nome c:\script\ScrubCil.ps1

  7. Fare clic su Avvia > tutti i programmi > accessori > Windows PowerShell, fare clic con il pulsante destro del mouse su "Windows PowerShell" e scegliere "Esegui come amministratore"

  8. Al prompt di PowerShell digitare i comandi seguenti

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

Raccolta dei dati

Se è necessaria l'assistenza del supporto tecnico Microsoft, si consiglia di raccogliere le informazioni seguendo i passaggi indicati in Raccogliere informazioni utilizzando TSS per le questioni relative alla distribuzione.