在ASP.NET中,如何在Word 2003或2007文件中检测密码?

Mat*_*tin 6 .net asp.net ms-word docx ms-office

我的用户喜欢将受密码保护的Word文档上传到我们的自定义文档管理系统中.我想添加验证来检查密码,如果有密码则拒绝上传.

自动化Word - 使用COM互操作 - 是不可能的,因为这是一个服务器端应用程序.

Jos*_*ola 5

我认为它将取决于Microsoft Word的版本.旧版本的Word(2007年之前)将需要一些COM互操作,因为它们不是以开放格式保存的.你无法做到这一点,我觉得你在Web服务器上安装任何Office都感到沮丧.另外,我认为检测密码保护的唯一方法是尝试打开/取消保护文件并捕获某个异常(您可能还需要进一步评估异常中的错误代码).不漂亮!

但是,对于以开放DOCX格式(标准ECMA-376)保存的较新版本的单词(2007+),您可以检查XML并检查DocumentProtection元素是否存在,并将w:enforcement属性设置为"on"...

<w:DocumentProtection
   w:edit="read-only"
   w:enforcement="on"
   w:unprotectPassword="1FC6CBEB"/>
Run Code Online (Sandbox Code Playgroud)

注意:这里看到的密码是加密的(显然); 我用密码"test"保存了这个特定文档.


Tod*_*ain 5

不幸的是,它不能直接从.NET或DSOFile.dll中获得,但您可以在.NET中创建一个包装器来读取任何Office文件的PIDSI_DOC_SECURITY属性,以便在不打开文档的情况下查明它是否受密码保护.有许多C++样本可以移植到定义iPropertyStorage.

一个包装的示例在TechTarget上,但包装似乎不可用.