检查Word文档是否受密码保护而不打开它

时间:2016-05-12 14:53:07

标签: c# ms-word ms-office office-interop password-protection

我使用Microsoft Office Interop命名空间来密码保护Word文档。 我首先创建一个Word实例作为后台进程,并收集我想要保护的Word文档列表。我遇到的问题是,当应用程序到达已经安全的文档时,它会打开并提示设置密码。在解雇之后,它会运行其余文档,而Word的实例现在位于前台。

我想跳过以前受保护的文件。我的代码目前如下:

    private void Protect_Word(FileInfo file)
    {
            Word.Document doc = wrd.Documents.Open(file.FullName);
            if (!doc.HasPassword)
            { 
                doc.Password = this.passwordBox.Text;
                doc.Save();

            }
            ((Microsoft.Office.Interop.Word._Document)doc).Close(0);
    }

此设置的问题是在我可以调用HasPassword之前,正在询问文档的密码。有没有办法在实际打开密码之前以编程方式检查文档的密码?

3 个答案:

答案 0 :(得分:2)

也遇到此问题... 我想出了“肮脏的解决方案”-为“ Word”(或Excel)传递无效的密码,如果文档中包含密码,则WINWORD.EXE将处理此选项,它将尝试应用于文档,密码不匹配,将生成一个COM异常,我们捕获该异常并使用密码理解该文档!否则,如果文档没有密码,则字处理器本身将忽略传输的密码(经过实验性检查后,我理解了这一点……)

        Word.Application app = null;
        Word.Documents docs = null;
        try
        {
            app = new Word.Application();
            app.Visible = false;
            docs = app.Documents;
            // перебираем список файлов
            for (int i = 0; i < listFilesWord.Count; i++)
            {
                Word.Document doc = null;
                try
                {
                    doc = docs.Open(
                        listFilesWord[i].FullName,
                        Word.WdSaveFormat.wdFormatDocument,
                        (object)false,
                        Type.Missing,
                        " ",
                        Type.Missing,
                        Type.Missing,
                        Type.Missing,
                        Type.Missing,
                        Type.Missing,
                        Type.Missing,
                        (object)false,
                        Type.Missing,
                        Type.Missing,
                        (object)true,
                        Type.Missing);
                    doc.Save();
                    doc.Close();
                }
                catch (COMException ex)
                {
                    Console.WriteLine(ex.Message);
                }
                finally
                {
                    if (doc != null) Marshal.ReleaseComObject(doc);
                }
            }
            app.Quit();
        }
        finally
        {
            if (docs != null) Marshal.ReleaseComObject(docs);
            if (app != null) Marshal.ReleaseComObject(app);
        }

答案 1 :(得分:1)

如果您说“不打开它”,则必须表示“不打开它在Word中 ”(因为您必须检查文件内容,这需要在文件级别上打开它。 strong>)

看起来docx文件格式和其他格式一样,在开头都有标识签名,即zip文件签名select * from (select t.*, count(1) over () as cnt from employees t WHERE department_id = 204 and class_id = 162) where cnt = 1 。 (是否存在字节序问题?我使用的是Little-endian Intel。)这可能反映了MS做出的选择,即将Office文档作为XML文件集合存储在标准zip文件中。

当文件加密后,尽管第一个字节更改为其他内容(在我的情况下为File Signature Database出于某种原因而被标识为Access项目文件的50 4b 03 04)。

这仅仅是 足以说明加密的Word文档中的“正常”情况,但是您可能想通过分析相关文档和交叉检查一组典型文档来首先进行更多研究从您要使用的来源。

答案 2 :(得分:0)

我一直在寻找类似的信息,但找不到直接的答案。 我设法使用vb .net找到了解决两个问题的好方法:

  1. 检测docx是否受密码保护以打开文件: msgbox(documentName.haspassword.tostring) 密码保护设置为true或false

  2. 将受密码保护的文档另存为无密码的文档: documentName.password(“已知密码”)=“” 这将保存打开的文档的副本,而无需输入密码