检测密码用于打开或关闭的Excel工作簿

时间:2016-06-16 10:16:10

标签: excel excel-vba passwords openxml vba

我需要在VBA内部修改Excel工作簿,用户将在其中指出要修改的工作簿,之后将修改工作簿的副本并以新名称保存。这可以是已打开的工作簿,也可以是磁盘上的封闭工作簿,我需要支持2000年以后的所有工作簿类型(2000-2016,二进制文件,加载项,模板等)。我需要修改工作簿的内容以及其中的任何自定义UI(功能区xml)。这一切都必须通过不受我控制的随机Excel安装来完成。

我面临的问题是处理受密码保护的工作簿 - 加密的工作簿,即打开的密码。我的代码需要能够处理这些代码,并且理想地将任何使用过的密码应用于已保存的更新副本。

代码流程如下:

  1. 让用户选择要修改的工作簿(通过表单)
  2. 如果工作簿是开放的:
    1. .SaveCopy与临时文件夹相同
    2. 指向已保存的副本以进行进一步处理
  3. 在第二个Excel实例(不可见)中打开用户选择的文件
  4. 更新已打开的临时副本的内容
  5. 。保存临时副本到没有密码的临时文件夹并关闭它
  6. 更新已关闭的临时副本的自定义用户界面
  7. 重新打开更新后的临时副本,并使用原始工作簿上的任何密码再次保存。
  8. 使用上面的步骤2.1,.SaveCopyAs将保存打开的工作簿并将任何密码应用于副本,这导致步骤3在所有情况下都要求输入密码。我无法使用.SaveAs删除步骤2.1中的传递,因为这将导致打开的工作簿最终不再打开。这也只是一个半措施,因为它不会阻止关闭文件发生同样的事情。

    在这种情况下,当Excel要求用户输入密码时(至少在Excel 2010中),密码提示只显示文件的文件名,并带有通行证的编辑框,所有这些都带有弹出的空白的第二个Excel它下面的窗户打开了,这是一个丑陋的景象。并且它也不允许我捕获输入的密码以及第7步。

    我能做的最好的事情就是检测磁盘上的已关闭工作簿是否已加密,并在尝试打开它之前显示我自己的密码提示。但是怎么做呢?这些是我可以提出的选择;

    1. 当我使用Workbooks.Open(Filename:=...)时,Excel会显示密码提示,我想通过事先询问任何通行证来逃避。
    2. 当我使用Workbooks.Open(Filename:=..., Password:="notthepassword")时,至少Excel不再显示密码提示,没有密码的工作簿打开正常,带有通行证的工具现在会产生错误1004.但是,我可以'行动起来推断需要密码,因为1004是Excel的全部错误编号,我无法检查Err.Description是否有错误的密码"或者这样,因为我不知道客户端上运行的Excel GUI语言。然后还有Check whether Excel file is Password protected;当加密文件也具有工作簿结构保护时,显然Excel不再以这种方式打开它们 - 我测试了它并且它与我的2010 Excel一起工作,但听起来并不是很令人鼓舞。
    3. 忽略Excel要求通行证的丑陋,事后阅读任何Workbook.PasswordXxx财产并不能透露任何内容;它们总是在所有情况下返回相同的值(在工作簿上有或没有密码)。
    4. 对于OOXML文件(.xlsm / .xlsx等)我可以事先检查文件的zip内容是否存在两个文件" EncryptionInfo"和#34; EncryptedPackage",表示文件已加密,但2000-2003(.xls)文件怎么办?这些文件中使用的BIFF文件结构有Microsoft's documentation,用于检查工作簿流中的FilePass记录;虽然我知道我可以实现那个逻辑(例如现在不支持的Koogra project),但我只是不是:)(侧面问题:因为微软何时公布这些细节没有先签署NDA并跳过他们的合法箍?!
    5. 有没有人能够深入了解我如何才能使代码步骤7.上面的工作,只是生活在Excel的提示下并向我的应用添加一个键记录器? :)

0 个答案:

没有答案