Windows 7 tabanlı bir bilgisayarda VAMT 2.0'da liste açtığınızda "Aynı anahtara sahip bir öğe zaten eklendi" hatası

Bu makale, bir listeyi Toplu Etkinleştirme Yönetim Aracı (VAMT) 2.0'da açtığınızda oluşan bir hatayı (aynı anahtara sahip bir öğe zaten eklenmiş) düzeltmeye yardımcı olur.

Şunlar için geçerlidir: Windows 7 Service Pack 1
Özgün KB numarası: 2383895

Belirtiler

Bir listeyi (.cil) Windows 7 tabanlı bir bilgisayarda VAMT 2.0'da açtığınızda aşağıdaki hata iletisini alabilirsiniz:

Aynı anahtara sahip bir öğe zaten eklenmiş.

Neden

Bilgisayarda birden çok ağ bağdaştırıcısı varsa ve bu ağ bağdaştırıcıları aynı MAC adresine sahipse bu sorun oluşabilir. Örneğin, bir sanal makine için iki ağ bağdaştırıcınız varsa ve bu ağ bağdaştırıcılarını aynı MAC adresine sahip olacak şekilde yapılandırdıysanız bu sorun oluşabilir.

Bu durumda CIL dosyasını açarsanız, aşağıdakine benzer bir girdi görürsünüz:

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>

Çözüm

Bu sorunu çözmek için, yinelenen girdileri CIL'den el ile silin veya bu işlemi otomatikleştirmek için aşağıdaki kaynak kodu kullanarak otomatikleştirmek üzere bir PowerShell betiği oluşturun.


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

Ardından bir Windows 7 bilgisayarında şu adımları izleyin:

  1. Kaydedilen CIL dosyanızı c:\script dosyasına kopyalayın. Örneğin, c:\script\saved.cil

  2. Bu KB makalesindeki dahil edilen kaynak kodunu panoya kopyalayın

  3. Başlat, Tüm Programlar, Aksesuarlar, Windows PowerShell, "Windows PowerShell ise" seçeneğine tıklayın

  4. Windows PowerShell'da Untitled1.ps1 penceresine tıklayın

  5. Bu makaledeki betiğin içeriğini yapıştırın

  6. Dosya'ya tıklayın, farklı kaydet'e c:\script\ScrubCil.ps1

  7. Tüm Programlar Donatılarını >> Başlat'a > tıklayın Windows PowerShell, "Windows PowerShell" seçeneğine sağ tıklayın ve "Yönetici Olarak Çalıştır" seçeneğini belirleyin

  8. PowerShell komut istemi türünde aşağıdaki komutlar

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

Veri toplama

Microsoft destek ekibinden yardım almaya ihtiyacınız varsa Dağıtımla ilgili sorunlar için TSS kullanarak bilgi toplama bölümünde belirtilen adımları izleyerek bilgi toplamanızı öneririz.