Script PowerShell per ricerca della password di protezione di un file Word

Nel post Protezione file di Office con password e gestione della password dimenticata ho descritto come è possibile proteggere un file di Word tramite password e di quali siano gli approcci per gestire lo scenario di una password dimenticata.

Nel caso in cui il file di Word venga protetto tramite la funzionalità Crittografa con password il recupero di una password dimenticata può essere complesso e il ricorso a tool di terze parti cercare di rilevare la password può essere una strada non percorribile.

Ma vi sono casi in cui è possibile stilare un elenco di quali potrebbero essere le possibili password in quanto sebbene si sia dimenticata la password si ha comunque un’idea di come potrebbe essere strutturata.

Ovviamente tentare di aprire il file Word inserendo via via tutte le possibili varianti di quella che si presuppone essere la password di protezione può risultare piuttosto arduo, senza contare si potrebbe incorrere in errori di digitazione.

E’ però possibile scrivere uno script Powershell per automatizzare il processo provando ad aprire il file Word specificando le password contenute in un file di testo per trovare quella corretta.

E possibile trovare un esempio di uno script di questo tipo nel mio repository su GitHub PowerShell/Search-WordPassword at master · ermannog/PowerShell (github.com).

Lo script esegue la verifica che il file di word specificato sia effettivamente protetto da password tramite la seguente istruzione:

$documentHasPassword = [bool]((Get-Content $DocumentFile) -match “http://schemas.microsoft.com/office/2006/keyEncryptor/password” )

Quindi legge il file contenente l’elenco delle password e prova ad aprire il file tramite un loop sulle password lette, la password coretta sarà quella permetterà di aprite il file senza generare un’eccezzione

#Read passwords file
$passwordsFileContents = Get-Content -Path $PasswordsFile

Write-Host “‘$PasswordsFile’ file contains $($passwordsFileContents.Length) passwords.” -ForegroundColor Green

#Create Word instance
$word = New-Object -ComObject “Word.Application”

#Test Passwords
$i = 1
ForEach ($password in $passwordsFileContents) {
  Write-Progress -PercentComplete ($i*100/$passwordsFileContents.Length) -Status “Processing password $password” -Activity “Password $i of $($passwordsFileContents.Length)”

  Try {
    $document = $word.Documents.Open($DocumentFile, $false, $true, $false, $password)
    Write-Host “Password found: $password” -ForegroundColor Yellow
   Exit 0
  }
  Catch {
    $i++
  }
  Finally {
    If ($document -ne $null) {
      $document.Close()
      $document = $null
    }
  }

}

Write-Host “Password not found!” -ForegroundColor Yellow

Per informazioni sul metodo Documents.Open e sui parametri si veda Documents.Open method (Word) | Microsoft Learn.