Windows
Windows 2012 R2 Server - 如何從 C:ProgramDataMicrosoftCryptoRSAMachineKeys 安全刪除文件
在帶有 IIS 的 Windows 2012 R2 伺服器上,我們有一個 Web 應用程序,它在 C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys 中生成證書並保存密鑰。我們已經解決了這個問題,但現在該文件夾中有超過 6,000,000 個文件。
我嘗試重命名文件夾並創建一個空的 MachineKeys 文件夾,但它破壞了作業系統處理 SSL 連接的能力。
我可以使用此腳本找到哪些 LocalMachine 儲存庫證書對應於哪些文件名:
Foreach ($MachineCert In Get-ChildItem Cert:\LocalMachine -Recurse | Where HasPrivateKey) { $array += $MachineCert | Select @{n='Subject'; e={ $MachineCert.Subject }}, @{n='Container'; e={ $MachineCert.PrivateKey.CspKeyContainerInfo.UniqueKeyContainerName }}, @{n='Store'; e={ $MachineCert.PSParentPath }} }
但是,我不知道如何處理這些資訊。有數以百萬計的文件,所以除了上面腳本報告的文件之外,我應該能夠安全地處理所有這些文件嗎?
我能夠弄清楚這一點。首先,我使用此腳本編譯需要保留的證書列表:
$array = @() Foreach ($MachineCert In Get-ChildItem Cert:\LocalMachine -Recurse | Where HasPrivateKey) { $array += $MachineCert | Select @{n='Subject'; e={ $MachineCert.Subject }}, @{n='Container'; e={ $MachineCert.PrivateKey.CspKeyContainerInfo.UniqueKeyContainerName }}, @{n='Store'; e={ $MachineCert.PSParentPath }} } $array | Export-CSV c:\temp\out.csv
然後我從輸出文件中取出所有容器名稱,並將它們輸入另一個腳本,該腳本將文件名從 MachineKeys 文件夾中復製到一個單獨的文件夾中:
$arr = @( "f686aace6942fb7f7ceb231212eef4a4_4cd8c04c-5245-4f49-962b-9e4388716e1f", "d1acbca52745e8cdc7796dc9283bb8fc_4cd8c04c-5245-4f49-962b-9e4388716e1f", "83ceb9ab426f3fa7efdf06154db8cd13_4cd8c04c-5245-4f49-962b-9e4388716e1f", "98d0bf53be581119e8ac290607289a64_4cd8c04c-5245-4f49-962b-9e4388716e1f", "e955cd99d4ab953714119f933c483fd5_4cd8c04c-5245-4f49-962b-9e4388716e1f", "1b1f4753df9704baf9d16743d0c9b3d1_4cd8c04c-5245-4f49-962b-9e4388716e1f", "a31b3a063eb59a2fe7801565c6aa3846_4cd8c04c-5245-4f49-962b-9e4388716e1f" ) gci -File -Recurse -Include $arr | % { copy-item $_.FullName "C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys_new" }
該腳本執行了幾乎一整天,因為它必須遍歷數百萬個文件。完成後,我將現有文件夾重命名為“MachineKeys_old”,並將上面腳本中的新文件夾重命名為“MachineKeys”。我重新啟動了伺服器以確保一切正常,並且確實如此。SQL,IIS,一切正常。
還有一件事需要注意 - 確保您為新的 MachineKeys 文件夾分配了適當的權限。對我來說,我必須授予“每個人”讀/寫/修改“訪問權限。