【问题标题】:Passing Powershell Securestring to 7zip, but archive cannot be unpacked afterwards将 Powershell Securestring 传递给 7zip,但之后无法解压缩存档
【发布时间】:2016-01-26 18:36:52
【问题描述】:

备份我的数据的 Powershell 脚本从命令行读取密码并将其传递给 7zip (7z):

....
$pw = Read-Host -assecurestring -Prompt 'Input Backup Master Passphrase: '
$pw = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($pw))
....
& 'C:\Program Files\7-Zip\7z.exe' a -v900M -t7z -mhe=on -mx=9 -p$pw $target/myarchive.7z $src

但是当我在 7zip (GUI) 中打开存档时,它会显示一个密码提示,输入密码后它会显示一个文件(还是一个 7zip 文件),该文件也是加密的,但不响应密码。

当我在另一个 Powershell 脚本中提取文件时,它工作正常。

# $pw is read again from commandline via Read-Host....&PtrToStringAuto
& 'C:\Program Files\7-Zip\7z.exe' x -p$pw $target/myarchive.7z

为什么提取只能在 CLI 上工作,而不是通过 GUI?

【问题讨论】:

  • 在GUI中你输入的是明文密码还是加密密码?
  • 我正在输入明文。第二行 (SecureStringToBSTR) 应该“解密”安全字符串。

标签: powershell password-protection 7zip


【解决方案1】:

经过大量实验(为了科学!),我发现 7z 线路没有按预期工作。在原始代码中,-p$pw 实际上将密码设置为文字$pw

快速而肮脏的方法是改用Invoke-Expression

$inpw = Read-Host -assecurestring -Prompt 'Input Backup Master Passphrase: '
$zpw = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($inpw))

$archive = "myarchive.7z"
$src = "testfile.txt"
# using a string formatter to avoid a mess of escaping characters 
Invoke-Expression ('& "{0}" a -v900M -t7z -mhe=on -mx=9 -p{1} {2} {3}' -f 'C:\Program Files\7-Zip\7z.exe', $zpw, $archive, $src)

但是,这会引起字符串插值和其他安全/数据问题的影响。您还可以查看Start-Process,或使用 .NET 的Process.Start 方法进行更多控制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-27
    • 2015-12-11
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    • 1970-01-01
    • 2015-08-23
    相关资源
    最近更新 更多