【问题标题】:How to check if a word file has a password?如何检查word文件是否有密码?
【发布时间】:2013-06-30 10:42:23
【问题描述】:

我构建了一个将.doc 文件转换为.docx 的脚本。

我有一个问题,当.doc 文件受密码保护时,我无法访问它,然后脚本挂起。

我正在寻找一种在打开文件之前检查文件是否有密码的方法。

我使用Documents.Open方法打开文件。

【问题讨论】:

    标签: powershell ms-word passwords docx doc


    【解决方案1】:

    如果您的脚本在打开文档时挂起,this question 中概述的方法可能会有所帮助,只是在 PowerShell 中您将使用 try..catch 块而不是 On Error Resume Next

    $filename = "C:\path\to\your.doc"
    
    $wd = New-Object -COM "Word.Application"
    
    try {
      $doc = $wd.Documents.Open($filename, $null, $null, $null, "")
    } catch {
      Write-Host "$filename is password-protected!"
    }
    

    如果可以打开文件,但内容受到保护,可以这样判断:

    if ( $doc.ProtectionType -ne -1 ) {
      Write-Host ($doc.Name + " is password-protected.")
      $doc.Close()
    }
    

    如果这些都不起作用,您可能不得不求助于this answer 中描述的方法。粗略翻译为 PowerShell(检测加密文档的那些部分):

    $bytes  = [System.IO.File]::ReadAllBytes($filename)
    $prefix = [System.Text.Encoding]::Default.GetString($bytes[1..2]);
    
    if ($prefix -eq "ÐÏ") {
      # DOC 2005
      if ($bytes[0x20c] -eq 0x13) { $encrypted = $true }
    
      # DOC/XLS 2007+
      $start = [System.Text.Encoding]::Default.GetString($bytes[0..2000]).Replace("\0", " ")
      if ($start -like "*E n c r y p t e d P a c k a g e") { $encrypted = $true }
    }
    

    【讨论】:

    • 您好 Ansgar Wiechers,感谢您的推荐,但在两个选项中,当脚本尝试打开文件时我卡住了。如果我让他输错密码,他会一次又一次地要求输入密码,直到我点击关闭按钮。 (当我写错密码时没有错误,所以我不能使用 catch 选项)。
    • 谢谢,在 PHP 中也解决了 2007 格式的问题,但不太了解 2005 格式发生了什么:if ($bytes[0x20c] == 0x13) { $encrypted = $true }.doc 支持呢?
    • @Rvanlaak 请发布一个新问题。
    • 在我看来,这条线。 $prefix = [System.Text.Encoding]::Default.GetString($bytes[1..2]);应该有 [0..1] 而不是 [1..2] 因为我们要查找的字符串从位置零开始。
    【解决方案2】:

    here 概述了一种技术。本质上,您提供了一个假密码,没有密码的文件将被忽略;然后你错误地捕获那些需要密码的,并且可以跳过它们。

    【讨论】:

    • 您好 Andy G,我之前尝试过这样做,但是当我使用 powershell 尝试这样做时,我得到的是第二次编写密码的机会。直到我在继续询问我密码的密码向导上单击关闭。
    • @user2536300 查看 Ansgar 的帖子,其中包含 PowerShell 代码。
    猜你喜欢
    • 2020-05-13
    • 2023-03-03
    • 1970-01-01
    • 2023-03-14
    • 2021-06-16
    • 2017-11-01
    • 2022-11-22
    • 2015-08-24
    • 2013-02-05
    相关资源
    最近更新 更多