aadams Posted January 4, 2008 Share Posted January 4, 2008 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"). Link to comment Share on other sites More sharing options...
aadams Posted January 5, 2008 Author Share Posted January 5, 2008 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 EndFuncThen 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 FunctionAs 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! Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now