Laden...

Abfangen der Schreibschutz-Abfrage bei Microsoft.Office.Interop.PowerPoint

Erstellt von Caesium vor 10 Jahren Letzter Beitrag vor 10 Jahren 5.112 Views
C
Caesium Themenstarter:in
19 Beiträge seit 2007
vor 10 Jahren
Abfangen der Schreibschutz-Abfrage bei Microsoft.Office.Interop.PowerPoint

Hallo zusammen,

ich schreibe eine Konsolen-Anwendung in welcher ich PowerPoint-Dateien öffne und diese bearbeite. Leider habe ich keinen Einfluss darauf, ob diese Dateien Passwort- und/oder Schreibgeschützt sind.

Wenn eine Datei Passwortgeschützt ist überprüfe ich dies mit folgendem Code und gebe aus, dass ich die Datei nicht bearbeiten kann.

try
            {                
                PowerPoint.Application application = null;
                PowerPoint.Presentation presentation = null;

                application = new PowerPoint.Application();
                application.DisplayAlerts = Microsoft.Office.Interop.PowerPoint.PpAlertLevel.ppAlertsNone;

                PowerPoint.ProtectedViewWindows protectedWindows = application.ProtectedViewWindows;
                PowerPoint.ProtectedViewWindow presentationOpen = protectedWindows.Open(sourcePath, "KeinPasswort", Microsoft.Office.Core.MsoTriState.msoTrue);
                presentation = presentationOpen.Presentation;
               
                application.ActiveProtectedViewWindow.Close();
                application.Quit();
            }
            catch (Exception exception)
            {
                return false;
            }
return true;

Leider funktioniert dies nicht für "nur" mit einem Passwort schreibgeschützte Dateien. Wenn ich diese öffne erscheint immer eine Passworteingabe.

Hier der Code zum öffnen der Datei:

PowerPoint.Application application = new PowerPoint.Application();
application.DisplayAlerts = Microsoft.Office.Interop.PowerPoint.PpAlertLevel.ppAlertsNone;
application.FileValidation = MsoFileValidationMode.msoFileValidationSkip;

PowerPoint.Presentation presentation = application.Presentations.Open2007(sourcePath, MsoTriState.msoTrue, MsoTriState.msoFalse, MsoTriState.msoFalse, MsoTriState.msoTrue);

Hat jemand einen Rat, wie ich dieses Passworteingabe verhindern kann?

Danke und viele Grüße
Caesium

C
2.121 Beiträge seit 2010
vor 10 Jahren

Weiß nicht ob ich richtig verstehe was du meinst, aber der Passwortschutz einer Datei dürfte nicht gemacht sein um umgangen zu werden. Sprich: wird wohl nicht möglich sein.

C
Caesium Themenstarter:in
19 Beiträge seit 2007
vor 10 Jahren

Ich will ihn ja nicht umgehen, sondern abfangen. Wenn eine passwortgeschützte Datei bearbeitet werden soll, soll er dies als Fehlermeldung ausgeben und die Datei überspringen.

P
660 Beiträge seit 2008
vor 10 Jahren

Morgen,

auch wenn ich nichts mit Office-Programmierung mache, so scheint es in Office 2010 eine Property "Password" zu geben. Vielleicht die dir ja weiter.

MfG
ProGamer*Der Sinn Des Lebens Ist Es, Den Sinn Des Lebens Zu Finden! *"Wenn Unrecht zu Recht wird dann wird Widerstand zur Pflicht." *"Ignorance simplifies ANY problem." *"Stoppt die Piraterie der Musikindustrie"

C
Caesium Themenstarter:in
19 Beiträge seit 2007
vor 10 Jahren

Soweit ich dies verstanden habe leider nicht. Hiermit kann ich bei einer bereits geöffneten Präsentation lediglich das Passwort auslesen und setzen.

P
660 Beiträge seit 2008
vor 10 Jahren

vielleicht hilft dir der Code weiter

public static bool IsPassworded(string file) {
        var bytes = File.ReadAllBytes(file);
        return IsPassworded(bytes);
        return false;
    }
    public static bool IsPassworded(byte[] bytes) {
        var prefix = Encoding.Default.GetString(bytes.Take(2).ToArray());
        if (prefix == "PK") {
            //ZIP and not password protected
            return false;
        }
        if (prefix == "ÐÏ") {
            //Office format.

            //Flagged with password
            if (bytes.Skip(0x20c).Take(1).ToArray()[0] == 0x2f) return true; //XLS 2003
            if (bytes.Skip(0x214).Take(1).ToArray()[0] == 0x2f) return true; //XLS 2005
            if (bytes.Skip(0x20B).Take(1).ToArray()[0] == 0x13) return true; //DOC 2005

            if (bytes.Length < 2000) return false; //Guessing false
            var start = Encoding.Default.GetString(bytes.Take(2000).ToArray()); //DOC/XLS 2007+
            start = start.Replace("\0", " ");
            if (start.Contains("E n c r y p t e d P a c k a g e")) return true;
            return false;
        }

        //Unknown.
        return false;
    }

Quelle: Detecting a password-protected document

MfG
ProGamer*Der Sinn Des Lebens Ist Es, Den Sinn Des Lebens Zu Finden! *"Wenn Unrecht zu Recht wird dann wird Widerstand zur Pflicht." *"Ignorance simplifies ANY problem." *"Stoppt die Piraterie der Musikindustrie"

C
Caesium Themenstarter:in
19 Beiträge seit 2007
vor 10 Jahren

Hi, danke für den Tipp.

Leider geht es hierbei um komplett passwortgeschützte Dateien (bis Office 2007). Diese fange ich mit meinem Code bereits ab. Mir geht es um mit einem Passwort schreibgeschützte Dateien. Sobald ich eine solche öffne erscheint eine Passworteingabe wie im Anhang. Dies ist bei eine Automatisierung natürlich ungünstig 😉

P
660 Beiträge seit 2008
vor 10 Jahren

Bist du eigentlich den Links in der Quelle gefolgt? Weil eines der links führt dich zu folgendem Code:

using DocumentFormat.OpenXml.Packaging;

using DocumentFormat.OpenXml.Wordprocessing;

 

using (WordprocessingDocument wd = WordprocessingDocument.Open(filename, false))

{

    DocumentProtection dp = wd.MainDocumentPart.DocumentSettingsPart.Settings.GetFirstChild<DocumentProtection>();

    if(dp != null && dp.Enforcement == BooleanValues.One && dp.Edit == DocumentProtectionValues.ReadOnly)

    {

        // Document is password protected for read only.

    }

}

und nach dem Comment

// Document is password protected for read only. zu urteilen ist es das was du suchst.

Quelle: how to find the document is password protected without opening it

MfG
ProGamer*Der Sinn Des Lebens Ist Es, Den Sinn Des Lebens Zu Finden! *"Wenn Unrecht zu Recht wird dann wird Widerstand zur Pflicht." *"Ignorance simplifies ANY problem." *"Stoppt die Piraterie der Musikindustrie"

C
Caesium Themenstarter:in
19 Beiträge seit 2007
vor 10 Jahren

Vielen Dank, das hilft mir für docx-Dateien schon mal weiter.

Leider bin ich nicht in der Lage dies für xlsx und pptx umzusetzen.

if (file.EndsWith("xlsx"))
{
    using (SpreadsheetDocument wd = SpreadsheetDocument.Open(file, false))
    {
		WorkbookProtection dp = wd.WorkbookPart.WorkbookSettingsPart.Settings.GetFirstChild<WorkbookProtection>(); // <-- Hierfür finde ich keine korrekt Version

		Console.WriteLine("Enforcement: " + dp.E.Enforcement.ToString());

		if (dp != null && dp.Enforcement == DocumentFormat.OpenXml.OnOffValue.FromBoolean(true) && dp.Edit == DocumentProtectionValues.ReadOnly)
		{
			Console.WriteLine("Datei " + fileInfo.Name + " ist Passwort geschützt oder nur lesbar");
			// Document is password protected for read only.
		}
	}
}

if (file.EndsWith("pptx"))
{
	using (PresentationDocument wd = PresentationDocument.Open(file, false))
	{
		DocumentProtection dp = wd.PresentationPart.PresentationPropertiesPart.PresentationProperties.GetFirstChild<DocumentProtection>(); //<-- Object reference not set to an instance of an object.

		Console.WriteLine("Enforcement: " + dp.Enforcement.ToString());

		if (dp != null && dp.Enforcement == DocumentFormat.OpenXml.OnOffValue.FromBoolean(true) && dp.Edit == DocumentProtectionValues.ReadOnly)
		{
			Console.WriteLine("Datei " + fileInfo.Name + " ist Passwort geschützt oder nur lesbar");
			// Document is password protected for read only.
		}
	}
}

Bei pptx erhalte ich (wie im Kommentar bschrieben) eine Nullpointer-Exception. Bei xlsx finde ich schon die passenden Attribute nicht. Hast du irgendwelche Hinweise?

Für ppt, xls und doc-Dateien werde ich den anderen Code einmal versuchen anzupassen...