如何以编程方式重新启用 MS Office 禁用文件列表中的文档

Posted

技术标签:

【中文标题】如何以编程方式重新启用 MS Office 禁用文件列表中的文档【英文标题】:How to programatically re-enable documents in the MS Office list of disabled files 【发布时间】:2010-10-19 13:25:53 【问题描述】:

MS Office 程序会保留一份在之前打开时导致错误的已禁用文件的列表。用户可以通过程序菜单访问列表并选择要重新启用的文档来从该列表中删除文档。 (http://support.microsoft.com/kb/286017)

问题是:如何在不与 gui 交互的情况下以编程方式完成对文档的重新启用?

【问题讨论】:

【参考方案1】:

关于 MS Office XP (2002) MSWord,禁用文档的列表以随机命名的二进制值形式保存在键下: [HKEY_CURRENT_USER\Software\Microsoft\Office\10.0\Word\Resiliency\DisabledItems]

因此,为每个用户删除“DisabledItems”键下的值可能会奏效。

还有别的吗?我还不知道。

【讨论】:

就是这样 - 请注意,尽管 Microsoft 实现该功能是有原因的……如果文档/插件不稳定,用户不会感谢您一直重新启用所有功能。 是的 - 文档最终出现在此列表中通常是有充分理由的。我需要一个高度专业化的应用程序,它基于服务器运行,并且在出现问题时没有真正的用户来清理。【参考方案2】:

codeproject 上有一篇关于 Office 如何处理 COMAddins 的好文章。普通插件的处理方式相同,系统到目前为止保持不变(直到 Office 2013)。 据我所知。随机命名的值包含由空字符串分隔的 unicode 字符的字节数组。 我找不到空分隔值数组中的所有条目。但是索引 (3) 包含 ADDIn 的文件名,索引 (4) 包含 ADDIn 的描述(如果可用)。

因此,正如 Luie 在 2009 年写的那样,在删除注册表项之前,应该读取这些值并要求用户重新安装插件。

【讨论】:

【参考方案3】:

合并以前的答案并在此处进行阐述。

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 类型的随机命名键。字节数组的格式为:

字节 0-3 : ??? (可能是 32 位 uint 类型代码,1 = COM 插件) 字节 4-7:第一个字符串(路径)的 32 位 uint 长度(以字节为单位) 字节 8-11:第二个字符串(描述)的 32 位 uint 长度(以字节为单位) bytes 12-end : 两个 unicode 字符串,每个字符串的字节长度存储在上面的 uints 中

【讨论】:

【参考方案4】:

这是我拼凑起来的一个 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:X200" -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

【讨论】:

【参考方案5】:

BAT 脚本可重新启用 Excel 2016 中的所有“禁用项目”。 禁用项在 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 脚本就可以解决它。

【讨论】:

以上是关于如何以编程方式重新启用 MS Office 禁用文件列表中的文档的主要内容,如果未能解决你的问题,请参考以下文章

我能否以编程方式启用和禁用存储在 SharePoint 中并链接到 ms-access 的 xlsx 文件的 ms-excel 文件共享/共同创作?

以编程方式禁用/启用通知

以编程方式禁用 ScrollView?

如何在 iOS 中以编程方式禁用/启用睡眠模式?

如何在 Swift 中以编程方式启用/禁用菜单对象

如何以编程方式启用/禁用网络接口? (Windows XP)