Question

Je dois ajouter la protection par mot de base à un document Open XML de traitement de texte. Je peux soit utiliser l'interface COM, qui est très lent quand j'ai un grand nombre de documents à traiter; ou je peux mettre les données directement dans le fichier .docx sous <w:settings> de <w:documentProtection> qui est très rapide. Cependant, en regardant les exigences pour chiffrer le mot de passe semble que cela va prendre des heures de programmation. Quelqu'un at-il déjà cet algorithme codé? Je codage en C #.

Était-ce utile?

La solution 2

J'ai eu quelque chose de semblable à @Brij et espérais obtenir l'algorithme de hachage de mot de passe. Je trouve ensuite un code incomplet sur le forum MSDN, et aussi découvert que la protection par mot de passe Word 2007 est très facilement se déplacer. Donc pour l'instant je suis juste mettre un hachage aléatoire et le sel dans afin que personne ne, y compris moi, connaît le mot de passe réel. C'est assez d'efforts pour éviter toute modification accidentelle; et étant donné qu'il est impossible d'empêcher le changement intentionnel, je ne vais pas en faire plus sûr.

Autres conseils

Voici un extrait de code complet. Il vous donne un utilitaire de ligne de commande pour verrouiller et déverrouiller des fichiers Word. (Déverrouillage le fichier est - je pense - également supprimer la protection par mot de passe, bien que je ne l'ai pas essayé cela)

Vous avez besoin OpenXML Format SDK 2.0 pour exécuter cette commande, disponible ici: http://www.microsoft.com/downloads/details.aspx?FamilyId=C6E744E5-36E9-45F5-8D8C-331DF206E0D0&displaylang=en , et une référence à DocumentFormat.OpenXml dans votre projet.

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();
        }
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top