MS Office プログラムは、以前に開いたときにエラーの原因となった無効なファイルのリストを保持しています。ユーザーは、プログラム メニューからリストにアクセスし、再度有効にするドキュメントを選択することで、このリストからドキュメントを削除できます。( http://support.microsoft.com/kb/286017 )
問題は、GUI を操作せずに、このドキュメントの再有効化をプログラムでどのように行うことができるかということです。
MS Office プログラムは、以前に開いたときにエラーの原因となった無効なファイルのリストを保持しています。ユーザーは、プログラム メニューからリストにアクセスし、再度有効にするドキュメントを選択することで、このリストからドキュメントを削除できます。( http://support.microsoft.com/kb/286017 )
問題は、GUI を操作せずに、このドキュメントの再有効化をプログラムでどのように行うことができるかということです。
以前の回答を統合し、ここで説明します。
Office 製品は、無効化された項目を という名前のキーの下にレジストリに保存しますHKEY_CURRENT_USER\Software\Microsoft\Office\<version>\<product>\Resiliency\DisabledItems
。たとえば、Excel 2010 の無効リストは の下にありHKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Excel\Resiliency\DisabledItems
ます。
無効化された各アイテムは、ランダムに名前が付けられた type のキーとして保存されますREG_BINARY
。バイト配列の形式は次のとおりです。
これは、Win7 上の MS-Access 2013 で発生していた同様の問題に合わせてまとめた Powershell スクリプトです。
#RemoveOfficeDisabledItem.ps1
#command line:
# powershell -executionpolicy unrestricted -file ".\RemoveOfficeDisabledItem.ps1"
#Update these variables to suit your situation
$OfficeVersion="15.0"
$OfficeApp="Access"
$FileName="My Blocked File.mdb"
#Converts the File Name string to UTF16 Hex
$FileName_UniHex=""
[System.Text.Encoding]::ASCII.GetBytes($FileName.ToLower()) | %{$FileName_UniHex+="{0:X2}00" -f $_}
#Tests to see if the Disabled items registry key exists
$RegKey=(gi "HKCU:\Software\Microsoft\Office\${OfficeVersion}\${OfficeApp}\Resiliency\DisabledItems\")
if($RegKey -eq $NULL){exit}
#Cycles through all the properties and deletes it if it contains the file name.
foreach ($prop in $RegKey.Property) {
$Val=""
($RegKey|gp).$prop | %{$Val+="{0:X2}" -f $_}
if($Val.Contains($FileName_UniHex)){$RegKey|Remove-ItemProperty -name $prop}
}
MS Office XP(2002)MSWordに関して、無効化されたドキュメントのリストは、キーの下にランダムな名前のバイナリ値として保持されます:[HKEY_CURRENT_USER \ Software \ Microsoft \ Office \ 10.0 \ Word \ Resiliency \ DisabledItems]
したがって、すべてのユーザーの「DisabledItems」キーの下の値を削除すると、おそらくうまくいくでしょう。
それ以上のものはありますか?私にはまだ分かりません。
Office が COMAddins を処理する方法についての良い記事が codeproject にあります。通常のアドインは同等に処理され、システムはこれまで変更されていません (Office 2013 まで)。私が知った限りでは。ランダムに名前が付けられた値には、null 文字列で区切られた Unicode 文字のバイト配列が含まれています。null で区切られた値の配列内のすべてのエントリを見つけることができませんでした。ただし、インデックス (3) には ADDIn のファイル名が含まれており、インデックス (4) には ADDIn の説明 (利用可能な場合) が含まれています。
Luie が 2009 年に書いたように、レジストリ キーを削除する前に値を読み、アドインを再インストールするようユーザーに依頼する必要があります。