4

OpenXMLWordprocessingドキュメントに基本的なパスワード保護を追加する必要があります。処理するドキュメントが多数ある場合は非常に遅いCOMインターフェイスを使用することもできます。<w:settings> <w:documentProtection>または、非常に高速なdocxファイルにデータを直接配置することもできます。ただし、パスワードを暗号化するための要件を見ると、プログラミングに数時間かかるようです。誰かがこのアルゴリズムをすでにコーディングしていますか?私はC#でコーディングしています。

4

2 に答える 2

6

これが完全なコードスニペットです。これは、Wordファイルをロックおよびロック解除するためのコマンドラインユーティリティを提供します(ファイルのロックを解除すると、パスワード保護も削除されますが、これは試していません)。

これを実行するには、OpenXML Format 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フォーラムで不完全なコードを見つけました。また、Word2007のパスワード保護が非常に簡単に回避できることも発見しました。だから今のところ私はランダムなハッシュとソルトを入れているだけなので、私を含め誰も実際のパスワードを知りません。これは、偶発的な変更を防ぐのに十分な努力です。意図的な変更を防ぐことは不可能なので、これ以上安全にするつもりはありません。

于 2011-05-17T02:28:26.317 に答える