Sign in to follow this  
Followers 0
aadams

Password Protected Word documents

2 posts in this topic

This is driving me nuts! I'm trying to write a script that opens up all the word documents in a set of folders and simply re-save them. This works great until I hit a password protected file, where the AutoIt script (using Word.au3) seems to go into an eternal loop and I have to end-task to kill WINWORD.

What I would like to do is detect if the word document is password protected, then skip it if it is. Unfortunately the only way to do that is to pass a bogus password and trap the error code Word returns. When I try this:

$file = "c:\myfile.doc"
$oWordApp = _WordCreate("", 0, 0)
$oDoc = _WordDocOpen($oWordApp, $file,0,0,0,0,0,"this is a bogus password that nobody would use")

AutoIt craps out saying:

C:\Program Files\AutoIt3\Include\Word.au3 (459) : ==> The requested action with this object has failed.: 
$o_doc = $o_object.Documents.Open ($s_FilePath, $f_ConfirmConversions, $f_ReadOnly, $f_AddToRecentFiles, $s_PasswordDocument, "", $f_Revert, $s_WritePasswordDocument, "", $i_Format) 
$o_doc = $o_object.Documents.Open ($s_FilePath, $f_ConfirmConversions, $f_ReadOnly, $f_AddToRecentFiles, $s_PasswordDocument, "", $f_Revert, $s_WritePasswordDocument, "", $i_Format)^ ERROR

Any ideas? I've also tried using:

$file = "c:\myfile.doc"
$word = ObjCreate("word.application")
If IsObj($word) Then
    $o_doc = $word.Documents.Open($file,False,False,False,"this is a bogus password that nobody would use")     
EndIf

Same results ("The requested.....has failed").

Share this post


Link to post
Share on other sites



Well I found a work-around, albeit not very graceful. I ended up writing a VB6 ActiveX dll that you pass the file path to and it will return true if the document is password protected and false if not. I don't much like this fix because now the DLL has to be registered/installed on any client that runs this script, but it will work.

For those interested here's what I did:

Autoit:

;First unregister then register the dll (makes sure it is registered)
; register the document checker dll 
Runwait(@SystemDir & '\regsvr32.exe  /s/u ' & @ScriptDir & '\documentChecker.dll',"",@SW_HIDE)
Runwait(@SystemDir & '\regsvr32.exe  /s ' & @ScriptDir & '\documentChecker.dll',"",@SW_HIDE)

$file="c:\myfile.doc"
If Not isPasswordProtected($file) Then                  
   ...process doc 
EndIf

Func isPasswordProtected($file)

    $obj = ObjCreate("documentChecker.checkDocument")
    If IsObj($obj) Then
        $ret = $obj.isPasswordProtected($file)
    Else
        ConsoleWrite("Error initializing object")
        Exit
    EndIf
    Return $ret         
EndFunc

Then the documentChecker.dll is a project named documentChecker with a single class (named checkDocument):

VB:

Public Function isPasswordProtected(ByVal strFile As String) As String  
    Dim oDoc As Document
    ' Set Error Handler
    On Error Resume Next
           
    ' Attempt to Open the Document
    Set oDoc = Documents.Open( _
               FileName:=strFile, _
               PasswordDocument:="?#nonsense@$")
    
    Select Case Err.Number
        Case 0
            ' Document was Successfully Opened
            Debug.Print strFileName & " was processed."
            isPasswordProtected = "False"
            
            
        Case 5408
            ' Document is Password-protected and was NOT Opened
            Debug.Print strFileName & " is password-protected " & _
                "and was NOT processed."
            isPasswordProtected = "True"
                        
        Case Else
            ' Another Error Occurred
            
            isPasswordProtected = "True"
    End Select
    
    ' Close Document
    oDoc.Close
    
    ' Clear Object Variable
    Set oDoc = Nothing
    
End Function

As long as the DLL is distributed in the @ScriptDir it works fine.

If anyone has a prettier way to do this I am all ears!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0