سؤال

أحتاج إلى إضافة حماية كلمة المرور الأساسية إلى مستند WordProcessing Open XML. يمكنني إما استخدام واجهة COM، والتي هي جدا بطيئة عندما يكون لدي عدد كبير من المستندات المعالجة؛ أو يمكنني وضع البيانات مباشرة في ملف Docx ضمن <w:settings> <w:documentProtection> وهو سريع جدا ومع ذلك، تبحث في متطلبات تشفير كلمة المرور تبدو وكأنها ستستغرق ساعات من البرمجة. هل لدى أي شخص هذه الخوارزمية مشفرة بالفعل؟ أنا الترميز في C #.

هل كانت مفيدة؟

المحلول 2

كان لدي شيء مماثل بثريا وكان يأمل في الحصول على خوارزمية لتجزئة كلمة المرور. لقد وجدت فيما بعد بعض التعليمات البرمجية غير المكتملة على منتدى MSDN، واكتشفت أيضا أن حماية كلمة المرور Word 2007 قد تحقق بسهولة. لذلك الآن أنا فقط أضع طعام عشوائي والملح في ذلك، لا أحد، بما في ذلك لي، يعرف كلمة المرور الفعلية. هذا جهد كاف لمنع التغيير العرضي؛ وبالنظر إلى أنه من المستحيل منع التغيير المتعمد، لن أجعله أكثر أمانا.

نصائح أخرى

إليك مقتطف كود كامل. يمنحك أداة مساعدة لسطر الأوامر لقفل وإلغاء قفل ملفات 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();
        }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top