ahstax
Goto Top

Abfrage ob Word-Dokument passwortgeschützt ist (vb.net, VB2010Express)

Hallo,

gibt es in vb.net eine Möglichkeit zu prüfen, ob ein zu öffnendes Word-Dokument passwortgeschützt ist?

Neugierige Grüße,
Andreas

Content-Key: 246750

Url: https://administrator.de/contentid/246750

Printed on: April 18, 2024 at 23:04 o'clock

Member: emeriks
emeriks Aug 18, 2014 at 12:38:16 (UTC)
Goto Top
Member: colinardo
Solution colinardo Aug 18, 2014, updated at Aug 20, 2014 at 10:12:41 (UTC)
Goto Top
Hallo Andreas,
wenn es um ein Passwort geht das zum Öffnen des Dokumentes benötigt wird, könntest du es über einen Umweg so machen: Das "Dummypassword" kannst du bei jedem Öffnen eines Dokumentes mit übergeben, nicht passwortgeschützte Dokumente ignorieren den Parameter.
Function isProtected(ByVal path As String) As Boolean
    Dim objWord As New Word.Application
    Try
        Dim doc As Document = objWord.Documents.Open(path, , , , "dummypassword")  
    Catch ex As System.Runtime.InteropServices.COMException
        If ex.ErrorCode = "-2146822880" Then  
            'Dokument ist Passwortgeschützt  
            Return True
        End If
    End Try
    objWord.Quit()
    Return False
End Function
Eine einfache Methode zu erkennen ob ein File geschützt ist oder nicht, ohne das File zu öffnen, ist mir persönlich nicht bekannt. Du müsstest das dann anhand der RAW-Struktur der Word-Dokumente analysieren. Beim OpenXML Format wäre das kein Problem, da ungeschützte Files die "ZIP-Signatur" besitzen, geschützte nicht. Um auch Office 97-2003 Dokumente zu berücksichtigen wäre dies vermutlich aufwändiger.

Grüße Uwe
Member: ahstax
ahstax Aug 20, 2014 at 10:12:32 (UTC)
Goto Top
Hallo,

vielen Dank für die Hinweise!!!
Aus irgendeinem Grund hat es mit dem Code von Uwe leider nicht funktioniert.
Ich habe noch etwas anderes gefunden, s.u., womit es für meine Zwecke soweit ganz gut klappt. Ich verwende den Code zwar nur für Word-Dokumente, wenn ich es richtig verstehe, soll aber wohl für alle Dateiformate funktionieren.
Quelle
Public Function AnyFileIsPassworded(ByVal file__1 As String) As Boolean
  Dim bytes = File.ReadAllBytes(file__1)
  Return AnyFileIsPassworded(bytes)
  Return False
End Function

Public Function AnyFileIsPassworded(ByVal bytes As Byte()) As Boolean
  Dim prefix = System.Text.Encoding.Default.GetString(bytes.Take(2).ToArray())
  If prefix = "PK" Then  
    'ZIP and not password protected  
    Return False
  End If
  If prefix = "ÐÏ" Then  
    'Office format.  
    'Flagged with password  
    If bytes.Skip(&H20C).Take(1).ToArray()(0) = &H2F Then
      Return True
    End If
    'XLS 2003  
    If bytes.Skip(&H214).Take(1).ToArray()(0) = &H2F Then
      Return True
    End If
    'XLS 2005  
    If bytes.Skip(&H20B).Take(1).ToArray()(0) = &H13 Then
      Return True
    End If
    'DOC 2005  
    If bytes.Length < 2000 Then
      Return False
    End If
    'Guessing false  
    Dim start = System.Text.Encoding.Default.GetString(bytes.Take(2000).ToArray())
    'DOC/XLS 2007+  
    start = start.Replace(vbNullChar, " ")  
    If start.Contains("E n c r y p t e d P a c k a g e") Then  
      Return True
    End If
    Return False
  End If

  'Unknown.  
  Return False
End Function

Grüße,
Andreas