

使用 PowerShell 批次設定 Excel 保護密碼
source link: https://blog.darkthread.net/blog/pretect-excel-with-ps/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

專案遇到為 Excel (.xlsx) 設定讀取密碼的需求。OpenXML SDK 提供的工作表保護功能,只僅限於防止內容被修改,無法做到輸入密碼才能開啟。有不少 Excel 商業元件可以彌補這個缺口,授權費用約三五百塊美金,並不算貴。但由於其他的需求我用 ClosedXML 或 OpenXML SDK 都可滿足,不值得單為這個功能採購元件,加上預計作業會在使用者的個人電腦執行,肯定有安裝 Excel,而且桌面環境,不像在網站或跑排程呼叫 Excel 有遇到一堆妖怪。 (延伸閱讀:呼叫Excel的程式無法以排程方式執行、「以排程方式呼叫Word/Excel注意事項」補充包) 評估後決定這次就用 PowerShell 實做批次加密 Excel 檔。
PowerShell 可以建立 COM+ 物件,加上是弱型別語言,操作起來比 C# 還容易,程式碼比預期簡單很多,用到一則之前介紹過的技巧 - Read-Host -AsSecureString 輸入密碼字串(參考:淺談 PowerShell 中的密碼字串加密處理)。這類與權限管控有關的密碼,我偏好請使用者現場輸入,不使用設定檔或批次參數,如此可做到只有當事人一個人知道,全程沒在畫面出現也不會留下軌跡。
還有個小眉角是我設定 $excel.Visible = $true,讓使用者看到 Excel 逐一開檔處理的過程,讓進度更透明一些,這還有另一項好處,若 .xlsx 原本有設讀取密碼,Excel 會彈出對話框等使用者輸入密碼再繼續。
完整程式範例如下:
Param(
[parameter(Mandatory=$true)][string]
$excelPath
)
$ErrorActionPreference = "STOP"
$excelPaths = @()
if ($excelPath.EndsWith(".xlsx")) {
if (Test-Path $excelPath) {
$excelPath += $excelPath
}
}
else {
$excelPaths += @((Get-ChildItem -Path $excelPath -Filter "*.xlsx").FullName)
}
if ($excelPaths.Length -eq 0) {
Write-Error "未找到 Excel 檔案 - $excelPath"
Exit
}
function decodeSecureString($secString) {
$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($secString)
return [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)
}
$pwdSecStr = Read-Host "請輸入 Excel 加密密碼" -AsSecureString
$pwdConfirmSecStr = Read-Host "請再輸一次密碼" -AsSecureString
$passwd = decodeSecureString($pwdSecStr)
if ($passwd -ne (decodeSecureString($pwdConfirmSecStr))) {
Write-Error "密碼不符"
Exit
}
try
{
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $true # 顯示 UI,若原本就有密碼會提示使用者輸入
$excelPaths | ForEach-Object {
Write-Host "加密 $_..."
$excel.WorkBooks.Open($_) | Out-Null
$excel.ActiveWorkbook.Password = $passwd
$excel.ActiveWorkbook.Save()
$excel.ActiveWorkBook.Close()
}
}
finally
{
$excel.Quit()
}
執行畫面:
產生的 Excel 檔開啟時會彈出密碼輸入視窗,成功!
Recommend
-
7
最近看到有人在影片中利用 PowerShell 產生亂數密碼,但是為了簡單產生個密碼,都要打長長的命令也不太實用了吧。所以我打算整理幾個密碼產生器的 PS1 函式,並加入到 $PROFILE 設定檔中,如此一來,日後產生密碼就方便多了! 👍 使用自訂...
-
5
更新于 2021/07/30 | 创建于 2021/07/30 世界最强的mRNA疫苗保護力降到 39% 由于疫苗对Delta 变种病毒保护力下降,以色列总...
-
15
12 行 PowerShell 搞定批次下載 Podcast MP3-黑暗執行緒 最近慢跑聽膩 MP3 耳機裡現存的百年歌單,加上近幾個月都跑六分半配速,聽快節奏歌曲蠻不搭的,想抓些 Podcast 來聽解悶。 把 Podcast 抓成 MP3 的事兩年前
-
6
XLS 轉 XLSX 批次轉換-黑暗執行緒 Excel 2007 起開始推 XLSX 格式取代傳統 XLS,距今快 15 年了,XLS 大軍仍野火燒不盡,春風吹又生。一般使用者不太會知道二者差別,但也不至於刻意選 XLS 檔,現在仍在流傳的 XLS 檔很多是代代相傳,後人開啟更新後按儲存...
-
10
批次更換 Microsoft 365 授權的 PowerShell 腳本範例這幾天公司的 Office 365 授權要到期了,必須全員更換到 Microsoft 365 授權,由於現在人比較多,連在 Microsoft 365 admin center 想全選並
-
5
先前整理過用 PowerShell 設定 IIS 的技巧,將原本 GUI 操作轉成指令檔,可以減少人為操作失誤的風險,並能實現自動化部署的理想。 最近又遇到類似需求,多學會一些安...
-
4
PowerShell 小品 - 變更 AD 密碼 2022-...
-
18
使用 IISCrypto 與 PowerShell-黑暗執行緒 資安標準愈來愈嚴格,行之有年的做法現在可能被視為不夠安全。以 TLS 加密為例,加密協定中有所謂的 Cipher Suite (密碼套件),像 SSL...
-
6
使用 PowerShell 設定使用者權限(User Right)-黑暗執行緒 前篇文章提到手動賦與 Power Users 群組 Debug Program 使用者權限(User Right)以識別 II...
-
5
プライバシー サンドボックスが目指すもの プライバシー サンドボックスは以下のような目的で、現在も業界関係者の皆さんと共に、開発を続けてい...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK