HI,早上好,cantgis又和大家見面了。
今天我們聊聊關於證書這塊的事情,我們使用了很多網站驗證證書,其中 銀行、娛樂網站等等,他們每年都會到期一次。
在Internet Explorer中的證書列表,過期的證書的集合,不規則的存在著,我們如何查詢獲得和處理呢?下面cantgis 帶給大家這套解決方案。

想要獲得和找到這些證書,我們要使用x.509證書提供商(Microsoft.PowerShell.SecurityCertificate
在powershell2.0中,需要我們通過手動來清理這些,
X509store類物件,並且使用get-item:

$myCerts = Get-Item Cert:CurrentUserMy

緊接下來,我們想要刪除證書,必須通過列舉:openflags開啟這個x509證書儲存物件。這個open()方法:你可以建立一個新的儲存或者設定訪問指定儲存(當然基於openflags)
預設情況下這個store是隻讀的,我們不要開啟它,當然也不能刪除掉。

成員名稱 說明
IncludeArchived 開啟 X.509 證書儲存區並新增存檔證書。
MaxAllowed 以允許最高階訪問的方式開啟 X.509 證書儲存區。
OpenExistingOnly 僅開啟現有儲存區。如果不存在任何儲存區,Open 方法不會建立新的儲存區。
ReadOnly 以只讀方式開啟 X.509 證書儲存區。
ReadWrite 以讀寫方式開啟 X.509 證書儲存區。

OK 我們使用

$myCerts.Open([System.Security.Cryptography.X509Certificates.OpenFlags]::ReadWrite)

通過下面的cmdlet過濾那些在昨天就過期的證書,$mycerts 已經指向的路徑,我們可以拿它來做一個參考,並不是讓大家去重複的編碼形成無用的字串。

$today = Get-Date
$ExpiredList = Get-ChildItem $myCerts.PSPath | Where-Object { $_.NotAfter -lt $today }

我們不想每次都呼叫管道:where-object  的cmdlet指令,因為我們不需要這樣
刪除麼個證書的x.509證書儲存區,然後我們執行查詢

ForEach ($Cert in $ExpiredList) {
   $myCerts.Remove($Cert)
}
                                                                         
$myCerts.Close() # We opened it, so we need to close it.

在powershell 3.0 中我們可以整合在一起來執行

$today = Get-Date
Get-ChildItem Cert:CurrentUserMy |
Where-Object NotAfter -lt $today |
Remove-Item
                           
#或者
                           
Get-ChildItem Cert:CurrentUserMy |
ForEach-Object -begin { $now = get-date } -process { if ($PSItem.NotAfter -lt $now )
Remove-Item