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
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.
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.
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"
Soweit ich dies verstanden habe leider nicht. Hiermit kann ich bei einer bereits geöffneten Präsentation lediglich das Passwort auslesen und setzen.
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;
}
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"
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 😉
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"
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...