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
.
每个禁用的项目都存储为一个随机命名的类型键REG_BINARY
。字节数组的格式为:
在 Excel 2016 中重新启用所有“禁用项目”的 BAT 脚本。
禁用项目位于 Excel->文件->选项->插件->管理->禁用项目。
:: Deletes all values under the key.
REG DELETE HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Excel\Resiliency\DisabledItems /va /f
参考参数:
/va 删除此键下的所有值。
/f 在没有提示的情况下强制删除。
PS。我有一堆使用任务计划程序运行宏的工作簿。Excel 会随机添加崩溃到禁用项目列表的工作簿。所以每天运行这个 BAT 脚本就可以解决它。
这是我拼凑起来的 Powershell 脚本,以解决我在 Win7 上使用 MS-Access 2013 时遇到的类似问题
#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”键下的值可能会奏效。
还有更多的东西吗?我不知道 - 还没有。
在 codeproject有一篇关于 Office 如何处理 COMAddins 的好文章。普通插件的处理方式相同,系统到目前为止保持不变(直到 Office 2013)。据我所知。随机命名的值包含由空字符串分隔的 unicode 字符的字节数组。我找不到空分隔值数组中的所有条目。然而,索引 (3) 包含 ADDIn 的文件名,索引 (4) 包含 ADDIn 的描述(如果可用)。
因此,正如 Luie 在 2009 年所写的那样,在删除注册表项之前,应该读取这些值并要求用户重新安装插件。