4

我需要为 Open XML Wordprocessing 文档添加基本密码保护。我可以使用COM接口,当我有大量文档要处理时,它会很慢;或者我可以将数据直接放在docx文件<w:settings> <w:documentProtection>中,速度非常快。但是,查看加密密码的要求似乎需要数小时的编程时间。有没有人已经编码了这个算法?我正在用 C# 编码。

4

2 回答 2

6

这是一个完整的代码片段。它为您提供了一个命令行实用程序来锁定和解锁 Word 文件(解锁文件将 - 我认为 - 也会删除密码保护,尽管我没有尝试过)。

您需要 OpenXML 格式 SDK 2.0 来运行它,可在此处获得:http ://www.microsoft.com/downloads/details.aspx?FamilyId=C6E744E5-36E9-45F5-8D8C-331DF206E0D0&displaylang=en以及对 DocumentFormat.OpenXml 的引用在你的项目中。

using System;
using System.Xml.Linq;

using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;

namespace LockDoc
{
    /// <summary>
    /// Manipulates modification permissions of an OpenXML document.
    /// </summary>
    class Program
    {
        /// <summary>
        /// Locks/Unlocks an OpenXML document.
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            if (args.Length != 2)
            {
                Console.WriteLine("Usage: lockdoc lock|unlock filename.docx");
                return;
            }

            bool isLock = false;
            if (args[0].Equals("lock", StringComparison.OrdinalIgnoreCase))
            {
                isLock = true;
            }
            else if (!args[0].Equals("unlock", StringComparison.OrdinalIgnoreCase))
            {
                Console.Error.WriteLine("Wrong action!");
                return;
            }

            WordprocessingDocument doc = WordprocessingDocument.Open(args[1], true);
            doc.ExtendedFilePropertiesPart.Properties.DocumentSecurity =
                new DocumentFormat.OpenXml.ExtendedProperties.DocumentSecurity
                (isLock ? "8" : "0");
            doc.ExtendedFilePropertiesPart.Properties.Save();

            DocumentProtection dp =
                doc.MainDocumentPart.DocumentSettingsPart
                .Settings.ChildElements.First<DocumentProtection>();
            if (dp != null)
            {
                dp.Remove();
            }

            if (isLock)
            {
                dp = new DocumentProtection();
                dp.Edit = DocumentProtectionValues.Comments;
                dp.Enforcement = DocumentFormat.OpenXml.Wordprocessing.BooleanValues.One;

                doc.MainDocumentPart.DocumentSettingsPart.Settings.AppendChild(dp);
            }

            doc.MainDocumentPart.DocumentSettingsPart.Settings.Save();

            doc.Close();
        }
    }
}
于 2009-11-11T09:41:43.967 回答
2

我有类似于@Brij 的东西,并希望获得密码哈希的算法。后来我在 MSDN 论坛上发现了一些不完整的代码,还发现 Word 2007 的密码保护很容易搞定。所以现在我只是在里面放一个随机的哈希和盐,所以包括我在内的任何人都不知道实际的密码。这足以防止意外更改;并且鉴于无法防止故意更改,我不会让它变得更安全。

于 2011-05-17T02:28:26.317 回答