Windows 7 ベースのコンピューターで VAMT 2.0 で一覧を開くと、"同じキーを持つ項目が既に追加されました" というエラーが表示される

この記事では、ボリューム ライセンス認証管理ツール (VAMT) 2.0 でリストを開いたときに発生するエラー (同じキーを持つ項目が既に追加されています) を修正するのに役立ちます。

適用対象: Windows 7 Service Pack 1
元の KB 番号: 2383895

現象

Windows 7 ベースのコンピューターで VAMT 2.0 でリスト (.cil) を開くと、次のエラー メッセージが表示される場合があります。

同じキーを持つ項目が既に追加されています。

原因

この問題は、コンピューターに複数のネットワーク アダプターがあり、これらのネットワーク アダプターの MAC アドレスが同じである場合に発生する可能性があります。 たとえば、この問題は、仮想マシン用の 2 つのネットワーク アダプターがあり、これらのネットワーク アダプターが同じ 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. この KB 記事に含まれているソース コードをクリップボードにコピーします

  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 を使用して情報を収集する」に記載している手順に従って情報を収集することをお勧めします。