IUpdateSearcher::GetTotalHistoryCount メソッドで不正な値が取得される

こんにちは、Visual Studio サポート チームです。

今回は、Windows Update Agent (WUA) API の IUpdateSearcher::GetTotalHistoryCount を Windows 10 上で実行した場合に発生する問題と対処方法についてご案内します。

なお、この問題は Windows 10 Creators Update では修正されています。

 

現象

Creators Update 適用前の Windows 10 で IUpdateSearcher::GetTotalHistoryCount メソッドを実行すると、実際よりも多い履歴数が取得される場合があります。

また、本メソッドで取得された値を使用して IUpdateSearcher::QueryHistory メソッドを実行すると、取得される更新履歴のコレクションに不正なエントリが含まれてしまい、この不正なエントリのプロパティを取得しようとした場合などにエラーが発生します。

 

原因

本現象は Windows 10 における Windows Update データの保存方法の不具合に依存して発生します。

本不具合は Windows 10 Creators Update で修正されています。

 

対処方法

IUpdateSearcher::QueryHistory メソッドで取得される IUpdateHistoryEntryCollection では、以下のように、正常なエントリに続く形で不正なエントリが格納されます。

[0] 正常な IUpdateHistoryEntry
[1] 正常な IUpdateHistoryEntry
[2] 正常な IUpdateHistoryEntry
...
[N-1] 正常な IUpdateHistoryEntry
[N]   不正な IUpdateHistoryEntry
[N+1] 不正な IUpdateHistoryEntry
...

このため、コレクションの先頭から走査して、最初に現れる不正なエントリの直前のエントリ (上記では N-1) までを正常なエントリとして扱うようにプログラミングすることで、エラーを回避することができます。

以下に、C# のコード例をご案内します。

 

UpdateSession updateSession = new UpdateSession();
IUpdateSearcher updateSearcher = updateSession.CreateUpdateSearcher();

// 履歴の総数を取得します。 // 不具合の影響で不正に大きな値が取得されます。
int totalHistoryCount = updateSearcher.GetTotalHistoryCount();

// 上記で取得した総数を指定して履歴の一覧を取得します。
// 取得されるコレクションには不正なエントリが含まれます。
IUpdateHistoryEntryCollection updateHistoryEntries = updateSearcher.QueryHistory(0, totalHistoryCount);

// コレクションを走査します。
for (int i = 0; i < totalHistoryCount; i++)
{

if (updateHistoryEntries[i] == null ||
updateHistoryEntries[i].Title == null)
{

// 不正なエントリを検出した時点で処理を終了します。
break; 

}
else
{

// 対象のエントリに対する任意の処理を記述します。
Console.WriteLine("{0} : {1} --- {2}", i, updateHistoryEntries[i].ResultCode, updateHistoryEntries[i].Title); 

}

}

 

製品の不具合でご迷惑をおかけしており誠に申し訳ありません。Windows 10 で Creators Update 以前のバージョンをご利用いただく必要がある場合には、上記のような対処策のご利用をご検討ください。