簡介
Microsoft 已發布安全公告 MS14-025。 欲了解更多關於本安全公告:
家庭使用者:
https://www.microsoft.com/security/pc-security/updates.aspx 跳過細節:立即從 Microsoft Update 官網下載家用電腦或筆電的更新:
IT 專業人員 (英文):
如何取得此安全性更新的說明及支援
協助安裝更新:
Microsoft Update 支援
適用於 IT 專業人員的安全性解決方案:
TechNet 安全性疑難排解與支援
幫助保護你的 Windows 電腦免受病毒和惡意軟體侵害:
病毒解決方案與資訊安全中心
您所在國家/地區的當地支援:
國際支持
更多資訊
已知問題及更多關於本次安全更新的資訊
以下文章包含更多關於此安全更新的資訊,特別是針對各產品版本的相關資訊。 這些文章可能包含已知問題的資訊。 如果是這樣,已知問題會在每個文章連結下列出。
-
MS14-025:針對已安裝更新2919355系統的 Windows 遠端伺服器管理工具安全更新說明:2014 年 5 月 13 日
-
MS14-025:針對未安裝更新2919355系統的 Windows 遠端伺服器管理工具安全更新說明:2014 年 5 月 13 日
群組原則偏好設定
概觀
部分群組原則偏好設定可以儲存密碼。 這項功能正在被移除,因為密碼儲存不安全。 本文說明使用者介面變更及任何可用的變通方法。
以下群組原則偏好設定將不再允許儲存使用者名稱與密碼:
- 行駛地圖
- 本地使用者與群組
- 排定的工作
- 服務
- 資料來源
這會影響你環境中任何依賴這些偏好設定密碼的現有群組原則物件 (GPO) 行為。 同時也會防止使用此功能建立新的群組原則偏好設定。
對於磁碟機地圖、本地使用者與群組,以及服務,你或許可以透過 Windows 中其他更安全的功能來達成類似目標。
對於排程任務與資料來源,您將無法透過群組原則偏好設定密碼的非安全功能達成相同的目標。
案例
以下群組原則偏好設定受此變更影響。 每個偏好都會簡要介紹,然後再詳細說明。 此外,遊戲還提供變通方法,讓你能執行相同的任務。
| 受影響的偏好 | 適用於使用者 |
適用於電腦 |
|---|---|---|
| 本地使用者管理 | 是 | 是 |
| 對應的磁碟機 | 是 | 否 |
| 服務 | 否 | 是 |
| 排程任務 (上層) | 是 | 是 |
| 排程任務 (下層) | 是 | 是 |
| 即時任務 (高層) | 是 | 是 |
| 即時任務 (下層) | 是 | 是 |
| 資料來源 | 是 | 是 |
變更摘要
- 所有受影響偏好設定中的密碼欄位皆被停用。 管理員無法透過這些密碼欄位建立新的偏好設定。
- 使用者名稱欄位在某些偏好設定中是被停用的。
- 包含密碼的現有偏好設定無法更新。 這些功能只能依照個人偏好刪除或停用。
- 偏好設定中刪除與停用動作的行為沒有改變。
- 當管理員開啟包含 CPassword 屬性的任何偏好設定時,管理員會收到以下警告對話框,告知近期的棄用。 嘗試將需要 CPassword 屬性的新偏好設定或偏好設定的變更保存時,也會觸發相同的對話框。 只有刪除和停用動作不會觸發警告對話框。
情境一:本地使用者管理
本地使用者管理偏好設定常用於建立擁有已知密碼的本地管理員。 此功能不安全,因為群組原則偏好設定儲存密碼的方式。 因此,這項功能現已無法使用。 以下偏好會受到影響:
- 電腦設定 -> 控制台設定 -> 本地使用者與群組 -> 新 -> 本地使用者
- 使用者設定 -> 控制台設定 -> 本地使用者與群組 -> 新 -> 本地使用者
重要變更
動作:創建或替換
- 使用者名稱、密碼和確認密碼欄位都被停用了。
- 當管理員開啟或嘗試儲存包含密碼的現有偏好設定的任何變更時,警告對話框會出現。
行動:更新
- 密碼與確認密碼欄位皆被停用。
- 當管理員開啟或嘗試儲存包含密碼的現有偏好設定的任何變更時,警告對話框會出現。
動作:刪除
- 行為沒有改變
解決方法
對於先前依賴群組原則偏好設定本地管理員密碼的人,以下腳本作為 CPassword 的安全替代方案提供。 將內容複製並儲存到新的 Windows PowerShell 檔案,然後依照 .範例章節。
Microsoft 僅提供圖例的程式設計範例,不含明示或暗示的擔保。 這包括 (但不限於) 適用于特定目的之可操作性或適用性的暗示擔保。 本文假設您熟悉正在示範的程式設計語言,以及用來建立和進行程式偵錯工具的工具。 Microsoft 支援工程師可以協助說明特定程式的功能。 不過,他們將不會修改這些範例以提供新增功能或建構符合您特定需求的程式。
功能 Invoke-PasswordRoll
{
<#
.劇情簡介
此腳本可用於遠端機器的本地帳號密碼設定為隨機密碼。 使用者名稱、密碼和伺服器組合會儲存在 CSV 檔案中。
CSV 檔案中儲存的帳號密碼可以用管理員選擇的密碼加密,以確保帳號密碼不會寫入磁碟。
加密密碼可用檔案中的另一個函式解密:ConvertTo-CleartextPassword
功能:Invoke-PasswordRoll
作者:Microsoft
版本:1.0
.描述
此腳本可用於遠端機器的本地帳號密碼設定為隨機密碼。 使用者名稱、密碼和伺服器組合會儲存在 CSV 檔案中。
CSV 檔案中儲存的帳號密碼可以用管理員選擇的密碼加密,以確保帳號密碼不會寫入磁碟。
加密密碼可用檔案中的另一個函式解密:ConvertTo-CleartextPassword
.參數 電腦名稱
一組電腦陣列用來執行腳本,使用 PowerShell 遠端管理。
.參數 LocalAccounts
一組本地帳號,密碼應該被更改。
.參數 TsvFileName
輸出使用者名稱/密碼/伺服器組合的檔案。
.參數加密金鑰
用來加密 TSV 檔案的密碼。 使用 AES 加密。 只有儲存在 TSV 檔案中的密碼會被加密,使用者名稱和伺服器名稱則是明文。
.參數 密碼長度
密碼長度會隨機產生,針對本地帳號。
.參數 NoEncryption
不要加密儲存在 TSV 檔案中的帳號密碼。 這將導致寫入明文密碼的磁碟。
.範例
. .\Invoke-PasswordRoll.ps1 #Loads 這個腳本檔案中的函式
Invoke-PasswordRoll -ComputerName (Get-Content computerlist.txt) -LocalAccounts @ (“administrator”,“CustomLocalAdmin”) -tsvFileName “LocalAdminCredentials.tsv” -EncryptionKey “password1”
連接檔案「computerlist.txt」中儲存的所有電腦。 如果系統上有本地帳號「管理員」和/或「CustomLocalAdmin」,他們的密碼會被更改
隨機生成的密碼長度為 20 (預設) 。 使用者名稱/密碼/伺服器組合儲存在 LocalAdminCredentials.tsv,帳號密碼則以 AES 加密,密碼為「Password1」。
.範例
. .\Invoke-PasswordRoll.ps1 #Loads 這個腳本檔案中的函式
Invoke-PasswordRoll -ComputerName (Get-Content computerlist.txt) -LocalAccounts @ (“administrator”) -tsvFileName “LocalAdminCredentials.tsv” -noEncryption -PasswordLength 40
連接檔案「computerlist.txt」中儲存的所有電腦。 如果系統上有本地帳號「管理員」,其密碼會被改成隨機產生的
密碼長度為40。 使用者名稱、密碼和伺服器組合會以未加密的方式儲存在 LocalAdminCredentials.tsv 中。
.註釋
需求:
-必須安裝PowerShellv2或以上版本
- PowerShell 遠端處理必須在所有將執行該腳本的系統上啟用
腳本行為:
- 如果系統上有本地帳號,但 LocalAccounts 參數中未指定,腳本會在螢幕上寫警告,提醒你該帳號的存在。 當這種情況發生時,腳本會繼續執行。
- 如果 LocalAccounts 參數中指定了本地帳號,但該帳號不存在於電腦上,則不會有任何反應 (帳號不會被建立) 。
- 此檔案中包含的函式 ConvertTo-CleartextPassword,可用來解密儲存在 TSV 檔案中加密的密碼。
- 如果無法連接到 ComputerName 指定的伺服器,PowerShell 會輸出錯誤訊息。
-Microsoft 建議企業定期啟動所有本地及網域帳號密碼。
#>
[CmdletBinding (DefaultParameterSetName=“Encryption”) ]
Param (
[參數 (強制=$true) ]
[弦[]]
$ComputerName,
[參數 (強制=$true) ]
[弦[]]
$LocalAccounts,
[參數 (強制=$true) ]
[弦樂]
$TsvFileName,
[參數 (ParameterSetName=“加密”,mandatory=$true) ]
[弦樂]
$EncryptionKey,
[參數 () ]
[驗證範圍 (20,120) ]
[內語]
$PasswordLength = 20,
[參數 (ParameterSetName=“NoEncryption”,mandatory=$true) ]
[切換]
$NoEncryption
)
#Load 任何需要的 .NET 課程
Add-Type -assemblyName “System.Web” -ErrorAction 停止
#This 是會在 ComputerName 指定每台電腦上執行的腳本區塊
$RemoteRollScript = {
Param (
[參數 (強制=$true,位置=1) ]
[弦[]]
$Passwords,
[參數 (強制=$true,位置=2) ]
[弦[]]
$LocalAccounts,
#This 在這裡是為了讓我記錄腳本連接的伺服器名稱,有時候 DNS 紀錄會出錯,有這個功能會很方便。
[參數 (強制=$true,位置=3) ]
[弦樂]
$TargettedServerName
)
$LocalUsers = Get-WmiObject Win32_UserAccount -filter “LocalAccount=true” |每人 {$_.名稱}
#Check 電腦是否有本地使用者帳號,密碼不會被這個腳本觸發
每個 ($User 在$LocalUsers)
{
如果 ($LocalAccounts -inot包含$User)
{
Write-Warning 「伺服器:『$ ($TargettedServerName) 』有一個本地帳號『$ ($User) 』,密碼並未被這個腳本更改」
}
}
#For 該伺服器上所有指定的本地帳號,請更改密碼
$PasswordIndex = 0
$LocalAccounts) 中 ($LocalAdmin
{
$Password = $Passwords[$PasswordIndex]
如果 ($LocalUsers -icontains $LocalAdmin)
{
嘗試
{
$objUser = [ADSI]“WinNT://localhost/$ ($LocalAdmin) ,使用者”
$objUser.psbase.Invoke (“SetPassword”, $Password)
$Properties = @{
TargettedServerName = $TargettedServerName
用戶名 = $LocalAdmin
密碼 = $Password
RealServerName = $env:computername
}
$ReturnData = New-Object PSObject -性質$Properties
Write-Output $ReturnData
}
接住
{
Write-Error 「伺服器:$ ($TargettedServerName) 用戶:$ ($LocalAdmin) 密碼更改錯誤」
}
}
$PasswordIndex++
}
}
#Generate 執行此腳本的用戶端密碼,而非遠端機器。 System.Web.Security 不存在於 .NET 用戶端設定檔中。 打這個電話
# 在執行腳本的用戶端上,確保只有一台電腦需要安裝完整的 .NET 執行時 (而不是每台系統都) 。
功能 Create-RandomPassword
{
Param (
[參數 (強制=$true) ]
[驗證範圍 (20,120) ]
[內語]
$PasswordLength
)
$Password = [System.Web.Security.Membership]::GeneratePassword ($PasswordLength,$PasswordLength / 4)
#This 絕不該失敗,但我還是想先做個理智檢查
如果 ($Password.長度 -ne $PasswordLength)
{
throw new Exception (“由 GeneratePassword 回傳的密碼長度與所需不符。 所需長度:$ ($PasswordLength) 。 產生長度:$ ($Password.長度) “)
}
返回$Password
}
#Main 功能 - 產生密碼並遠端連線到機器,更改指定本地帳號的密碼
如果 ($PsCmdlet.ParameterSetName -ieq 「加密」)
{
嘗試
{
$Sha 256 = new-object System.Security.Cryptography.SHA256CryptoServiceProvider
$SecureStringKey = $Sha 256.ComputeHash ([System.Text.UnicodeEncoding]::Unicode.GetBytes ($EncryptionKey) )
}
接住
{
Write-Error 「錯誤建立 TSV 加密金鑰」-ErrorAction 停止
}
}
每個 ($Computer 在$ComputerName)
{
#Need 為每個可更改的帳號產生一個密碼
$Passwords = @ ()
當 ($i = 0;$i -$LocalAccounts長度;$i++)
{
$Passwords += Create-RandomPassword -密碼長度 $PasswordLength
}
Write-Output 「連接伺服器 '$ ($Computer) ' 以擲出指定的本地管理員密碼」
$Result = Invoke-Command -ScriptBlock $RemoteRollScript -ArgumentList @ ($Passwords, $LocalAccounts, $Computer) -ComputerName $Computer
#If 加密時,寫入磁碟前請用使用者提供的金鑰加密密碼
如果 ($Result -ne $null)
{
如果 ($PsCmdlet.ParameterSetName -ieq “NoEncryption”)
{
$Result |Select-Object 使用者名稱、密碼、TargettedServerName、RealServerName |Export-Csv -Append -Path $TsvFileName -NoTypeInformation
}
否則
{
#Filters 回$null條目
$Result = $Result |Select-Object 使用者名稱、密碼、目標伺服器名稱、RealServerName
每個 ($Record 在$Result)
{
$PasswordSecureString = ConvertTo-SecureString -AsPlainText -強制 -字串 ($Record.Password)
$Record |Add-Member -MemberType NoteProperty -Name EncryptedPassword -value (ConvertFrom-SecureString -key $SecureStringKey -SecureString $PasswordSecureString)
$Record.PSObject.Properties.移除 (「密碼」)
$Record |Select-Object 使用者名稱、加密密碼、目標伺服器名稱、RealServerName |Export-Csv -Append -Path $TsvFileName -NoTypeInformation
}
}
}
}
}
功能 ConvertTo-CleartextPassword
{
<#
.劇情簡介
此函式可用來解密由 Invoke-PasswordRoll 函式加密儲存的密碼。
功能:ConvertTo-CleartextPassword
作者:Microsoft
版本:1.0
.描述
此函式可用來解密由 Invoke-PasswordRoll 函式加密儲存的密碼。
.參數加密密碼
儲存在 TSV 檔案中的加密密碼。
.參數加密金鑰
密碼是用來加密的。
.範例
. .\Invoke-PasswordRoll.ps1 #Loads 這個腳本檔案中的函式
ConvertTo-CleartextPassword -EncryptionKey “Password1” -EncryptedPassword 76492d1116743f0423413b16050a5345MgB8AGcAZgBaAHUAaQBwADAAQgB2AGgAcABNADMASwBaAFoAQQBzADEAeABjAEEAPQA9AHwAZgBiAGYAMAA1ADYANgA2ADEANwBkADQAZgAwADMANABjAGUAZQAxAGIAMAB iADkANgBiADkAMAA4ADcANwBhADMAYQA3AGYAOABkADcAMQA5ADQAMwBmAGYANQBhADEAYQBjADcANABkADIANgBhADUANwBlADgAMAAyADQANgADAA1ADIAOQA0AGMAZQA0ADEAMwAzADcANQAyADUANAAzADYAMAA1AGEANgAzADEAMQA5ADAAYwBmADQAZAA2AGQA」
解密儲存在 TSV 檔案中的加密密碼。
#>
Param (
[參數 (強制=$true) ]
[弦樂]
$EncryptedPassword,
[參數 (強制=$true) ]
[弦樂]
$EncryptionKey
)
$Sha 256 = new-object System.Security.Cryptography.SHA256CryptoServiceProvider
$SecureStringKey = $Sha 256.ComputeHash ([System.Text.UnicodeEncoding]::Unicode.GetBytes ($EncryptionKey) )
[SecureString]$SecureStringPassword = ConvertTo-SecureString -字串 $EncryptedPassword -鍵$SecureStringKey
Write-Output ([System.Runtime.InteropServices.Marshal]::P trToStringAuto ([System.Runtime.InteropServices.Marshal]::SecureStringToCoTaskMemUnicode ($SecureStringPassword) ) )
}
管理員可以透過建立 Active Directory 群組,並透過群組原則偏好設定 -> 本地群組加入本地管理員群組,將本地管理員帳號加入電腦。 此動作不會快取憑證。 對話框大致如下。 此解決方法需要使用者登入時必須連接 Active Directory 網域服務。
情境二:映射磁碟
管理員會使用磁碟地圖來分配網路位置給使用者。 密碼保護功能是用來確保硬碟有授權存取權限。 以下偏好會受到影響:
- 使用者設定 -> Windows 設定 -> 磁碟機映射 -> 新設 -> 映射磁碟
重要變更
操作:建立、更新或替換
- 使用者名稱、密碼和確認密碼欄位都被停用了。
動作:刪除
- 行為沒有改變
解決方法
你可以不用密碼方法來驗證,而是用 Windows 檔案總管來管理分享權限並分配使用者權限。 你可以使用 Active Directory 物件來控制該資料夾的權限。
情境三:服務
你可以利用服務偏好設定,將服務屬性變更為在非原始安全情境中執行的情境。 以下偏好會受到影響:
- 電腦設定 -> 控制台設定 -> 服務 -> 新 -> 服務
重要變更
啟動:無變更、自動或手動
- 密碼與確認密碼欄位已停用。
- 管理員只能使用內建帳號。
啟動:停用
- 行為沒有改變
新增對話框
- 試圖使用非內建使用者的管理員「本帳號」將收到以下警告:
解決方法
服務仍可作為本地系統帳號執行。 服務權限可依據 Microsoft 知識庫以下文章所述進行更改:
256345 如何設定群組原則設定以設定系統服務的安全
注意:如果你想設定的服務不存在,必須在運行該服務的電腦上設定。
情境四:排程與即時任務 (高層)
這些工具用於在特定安全情境下執行排程任務。 無法在未登入時,將排程任務的憑證儲存在任意使用者的狀態下執行。 以下偏好會受到影響。 (請注意,在某些平台上,「至少 Windows 7」會被「Windows Vista 及以後版本」取代。)
- 電腦設定 -> 控制台設定 -> 排程任務 -> 新 -> 排程任務 (至少是 Windows 7)
- 電腦設定 -> 控制台設定 -> 排程任務 -> 新 -> 立即任務 (至少是 Windows 7)
- 使用者設定 -> 控制台設定 -> 排程任務 -> 新 -> 排程任務 (至少是 Windows 7)
- 使用者設定 -> 控制台設定 -> 排程任務 -> 新 -> 立即任務 (至少是 Windows 7)
重要變更
操作:建立、更新或替換
- 當你選擇「 執行使用者是否登入 」選項時,對話框不再提示管理員輸入憑證。
- 「 不儲存密碼 」勾選框已被關閉。 預設情況下,該方框也會被勾選。
動作:刪除
行為沒有改變
解決方法
對於「排程任務 (至少 Windows 7) 」和「立即任務 (至少 Windows 7) 」任務,管理員可在該使用者登入時使用特定使用者帳號。 或者,他們只能以該使用者身份存取本地資源。 這些任務仍可在本地服務的情境中執行。
情境五:排程與即時任務 (下層) 這是用於特定安全情境下執行排程任務的下層偏好設定。 無法在未登入時,將排程任務的憑證儲存在任意使用者的狀態下執行。 以下偏好會受到影響:
- 電腦設定 -> 控制台設定 -> 排程任務 -> 新任務 -> 排程任務
- 電腦設定 -> 控制台設定 -> 排程任務 -> 新任務 -> 立即任務 (Windows XP)
- 使用者設定 -> 控制台設定 -> 排程任務 -> 新 -> 排程任務
- 使用者設定 -> 控制台設定 -> 排程任務 -> 新 -> 立即任務 (Windows XP)
重要變更
操作:建立、更新或替換
- 「 執行為」 的勾選框已被停用。 因此, 使用者名稱、 密碼和 確認密碼 欄位都被停用了。
動作:刪除
行為沒有改變
解決方法
對於「排程任務」和「Windows XP) 立即任務」項目,排程任務 (會依據本地服務目前可用的權限執行。
情境六:資料來源
資料來源偏好用於將資料來源與電腦或使用者關聯。 此功能不再儲存憑證,無法存取受密碼保護的資料來源。 以下偏好會受到影響:
- 電腦設定 -> 控制台設定 -> 資料來源
- 使用者設定 -> 控制台設定 -> 資料來源
重要變更
操作:建立、更新或替換
- 使用者名稱、密碼及確認密碼欄位皆被停用:
動作:刪除
- 行為沒有改變
解決方法
沒有可用的因應措施。 此偏好不再儲存憑證以允許存取受密碼保護的資料來源。
CPassword 的淘汰
移除 CPassword
本 Microsoft 知識庫文章中包含的Windows PowerShell腳本,用來偵測網域是否包含任何可能使用 CPassword 的群組原則偏好設定。 若在特定偏好中偵測到 CPassword XML,則會顯示在此列表中。
偵測 CPassword 偏好
這個腳本必須從你想要清理的網域控制器的本地目錄執行。 將內容複製並儲存到新的 Windows PowerShell 檔案,找出你的系統磁碟機,然後依照以下用法執行腳本。
<#
.劇情簡介
你網域中的群組原則物件可以有偏好設定,儲存不同任務的密碼,例如以下幾項:
1. 資料來源
2. 行駛地圖
3. 本地用戶
4. 排程任務 (XP與更高階)
5。 服務
這些密碼作為 GP 偏好設定的一部分儲存在 SYSVOL 中,且因 32 位元組 AES) (加密較弱而不安全。
因此,我們建議您不要在您的網域環境中部署此類偏好,並移除任何現有的偏好設定
偏好。 此腳本是為了幫助管理員在其網域的 SYSVOL 中尋找包含密碼的 GP 偏好設定。
.描述
此腳本應在安裝有 RSAT 的 DC 或用戶端電腦上執行,以列印包含以下所有偏好設定
密碼內含 GPO、偏好設定名稱、GPEdit 路徑等資訊,這些路徑定義了此偏好。
當您擁有受影響偏好清單後,可以透過群組原則管理主控台中的編輯器移除這些偏好設定。
.語法
Get-SettingsWithCPassword.ps1 [-路徑 <弦>]
.範例
Get-SettingsWithCPassword.ps1 -Path %WinDir%\SYSVOL\domain
Get-SettingsWithCPassword.ps1 -路徑 <GPO 備份資料夾路徑>
.註釋
若找不到群組原則 PS 模組,輸出將包含 GPO GUID,而非 GPO 名稱。 你可以選擇逃跑
在網域控制器上執行這個腳本,或是在安裝 RSAT 後在用戶端重新執行該腳本,
啟用群組原則模組。
或者,你也可以使用 GPO GUID,透過 Get-GPO 指令檔來取得 GPO 名稱。
.連結
http://go.microsoft.com/fwlink/?LinkID=390507
#>
#----------------------------------------------------------------------------------------------------------------
輸入參數
#--------------------------------------------------------------------------------------------------------------
參數 (
[string]$Path = $ (擲「-路徑需要」。) # GPP 所在的目錄路徑。
)
#---------------------------------------------------------------------------------------------------------------
$isGPModuleAvailable = $false
$impactedPrefs = { 「Groups.xml」、「ScheduledTasks.xml」、「Services.xml」、「DataSources.xml」、「Drives.xml」}
#----------------------------------------------------------------------------------------------------------------
若有,匯入 Group Olicy 模組
#----------------------------------------------------------------------------------------------------------------
如果 (-not (Get-Module -名稱為「GroupPolicy」) )
{
如果 (Get-Module -ListAvailable |
Where-Object { $_。Name -ieq “GroupPolicy” })
{
$isGPModuleAvailable = $true
Import-Module 「群組政策」
}
否則
{
Write-Warning「無法匯入 PowerShell 群組原則模組。 因此,GPO 指南會被回報。
在 DC 執行此腳本以取得 GPO 名稱,或使用 DC) 上的 Get-GPO 指令 (從 GPO guid 取得 GPO 名稱。」
}
}
否則
{
$isGPModuleAvailable = $true
}
函數 Enum-SettingsWithCpassword ( [字串]$sysvolLocation )
{
# GPMC 樹木路徑
$commonPath = “ -> 偏好設定 -> 控制台設定 -> ”
$driveMapPath = “ -> 偏好設定 -> Windows 設定 -> ”
# 遞迴取得 SYVOL 位置內的所有 XML 檔案
$impactedXmls = Get-ChildItem $sysvolLocation -遞迴 -過濾器「*.xml」 |Where-Object { $impactedPrefs -cmatch $_。姓名 }
# 每個 XML 檔案包含多個偏好設定。 反覆檢查每個偏好設定是否符合
# 包含 cpassword 屬性並顯示。
$impactedXmls ) 中 ( $file
{
$fileFullPath = $file。全名
# 設定GPP類別。 如果檔案位於 SYSVOL 的 Machine 資料夾下,
# 設定在電腦配置下定義,否則
# 設定是 a 對使用者設定
如果 ( $fileFullPath.包含 (「機器」) )
{
$category = 「電腦配置」
}
elseif ( $fileFullPath.包含 (「使用者」) )
{
$category = 「使用者設定」
}
否則
{
$category = 「未知」
}
# 以 XML 格式取得檔案內容
嘗試
{
[xml]$xmlFile = get-content $fileFullPath -ErrorAction 繼續
}
catch [Exception]{
Write-Host $_。例外。訊息
}
如果 ($xmlFile -eq $null)
{
繼續
}
換 ( $file。基地名稱 )
{
群組
{
$gppWithCpassword = $xmlFile.SelectNodes (“Groups/User”) |where-Object { [字串]::IsNullOrEmpty ($_。Properties.cpassword) -eq $false }
$preferenceType = 「本地使用者」
}
排程任務
{
$gppWithCpassword = $xmlFile.SelectNodes (“ScheduledTasks/*”) |where-Object { [字串]::IsNullOrEmpty ($_。Properties.cpassword) -eq $false }
$preferenceType = 「排程任務」
}
資料來源
{
$gppWithCpassword = $xmlFile.SelectNodes (“DataSources/DataSource”) |where-Object { [字串]::IsNullOrEmpty ($_。Properties.cpassword) -eq $false }
$preferenceType = 「資料來源」
}
駕駛
{
$gppWithCpassword = $xmlFile.SelectNodes (“Drives/Drive”) |where-Object { [字串]::IsNullOrEmpty ($_。Properties.cpassword) -eq $false }
$preferenceType = 「駕駛地圖」
}
服務
{
$gppWithCpassword = $xmlFile.SelectNodes (“NTServices/NTService”) |where-Object { [字串]::IsNullOrEmpty ($_。Properties.cpassword) -eq $false }
$preferenceType = 「服務」
}
預設
{ # 清除 gppWithCpassword 和 preferenceType,準備下一個項目。
嘗試
{
Clear-Variable -name gppWithCpassword -錯誤動作 靜默繼續
Clear-Variable -名稱偏好類型 -錯誤動作靜默繼續
}
捕捉 [例外]{}
}
}
如果 ($gppWithCpassword -ne $null)
{
# 從 filePath 擷取的 GUID 建立 GPO 名稱
$guidRegex = [正則表達式]“\{ (.*) \}”
$match = $guidRegex場 ($fileFullPath)
如果 ($match。成功)
{
$gpoGuid = $match.groups[1].value
$gpoName = $gpoGuid
}
否則
{
$gpoName = 「未知」
}
如果 ($isGPModuleAvailable -EQ $true)
{
嘗試
{
$gpoInfo = Get-GPO -Guid $gpoGuid -ErrorAction 繼續
$gpoName = $gpoInfo.DisplayName
}
捕捉 [例外] {
Write-Host $_。例外。訊息
}
}
# 顯示包含 cpassword 的前置
每個 ( $gpp 在$gppWithCpassword )
{
如果 ( $preferenceType -eq,則「Drive Maps」)
{
$prefLocation = $category + $driveMapPath + $preferenceType
}
否則
{
$prefLocation = $category + $commonPath + $preferenceType
}
$obj = New-Object -typeName PSObject
$obj |Add-Member –membertype NoteProperty –名稱 GPOName –value ($gpoName) –passthru |
Add-Member -MemberType NoteProperty -name 偏好 -value ($gpp。名稱) -passthru |
Add-Member -MemberType NoteProperty -name 路徑 -value ($prefLocation)
Write-Output $obj
}
} # 結束如果$gppWithCpassword
} # 結束每個$file
} # 終結函數 Enum-PoliciesWithCpassword
#-----------------------------------------------------------------------------------
檢查路徑是否有效。 列舉所有包含 cpassword 的設定。
#-----------------------------------------------------------------------------------
若 (測試路徑$Path )
{
Enum-SettingsWithCpassword $Path
}
否則
{
Write-Warning 「沒有這樣的目錄:$Path」
}
範例用法 (假設系統磁碟機為 C)
.\Get-SettingsWithCPassword.ps1 –path “C:\Windows\SYSVOL\domain” |Format-List
注意,你也可以將任何備用 GPO 鎖定為 路徑 ,而非網域。
偵測腳本會產生一個類似以下的清單:
對於較長的清單,建議將輸出儲存為一個檔案:
.\Get-SettingsWithCPassword.ps1 –path “C:\Windows\SYSVOL\domain” |ConvertTo-Html > gpps.html
移除 CPassword 偏好
為了移除包含 CPassword 資料的偏好設定,我們建議你使用 群組原則 管理主控台 (網域控制器上的 GPMC) ,或是安裝了遠端伺服器管理工具的用戶端。 在這些主機上,你可以在五個步驟內移除任何偏好。 若要這麼做,請按照下列步驟進行:
- 在 GPMC 中,開啟包含 CPassword 資料的偏好設定。
- 將動作改為 刪除 或 停用,視偏好設定而定。
- 按一下 [確定] 儲存變更。
- 等待一到兩次群組原則刷新週期,讓變更能傳播到用戶端。
- 在所有客戶端套用變更後,刪除偏好設定。
- 依需要重複步驟1到5,清潔整個環境。 當偵測腳本回傳零結果時,你就完了。
檔案雜湊資訊
| 檔案名稱 | SHA1 雜湊 | SHA256 雜湊 |
|---|---|---|
| Windows6.0-KB2928120-ia64.msu | B2A74305CB56191774BFCF9FCDEAA983B26DC9A6 | DCE8C0F9CEB97DBF1F7B9BAF76458B3770EF01C0EDC581621BC8C3B2C7FD14E7 |
| Windows6.0-KB2928120-x64.msu | 386457497682A2FB80BC93346D85A9C1BC38FBF7 | 1AF67EB12614F37F4AC327E7B5767AFA085FE676F6E81F0CED95D20393A1D38D |
| Windows6.0-KB2928120-x86.msu | 42FF283781CEC9CE34EBF459CA1EFE011D5132C3 | 016D7E9DBBC5E487E397BE0147B590CFBBB5E83795B997894870EC10171E16D4 |
| Windows6.1-KB2928120-ia64.msu | 5C2196832EC94B99AAF9B074D3938525B7219690 | 9958FA58134F55487521243AD9740BEE0AC210AC290D45C8322E424B3E5EBF16 |
| Windows6.1-KB2928120-x64.msu | EA5332F4E289DC799611EAB8E3EE2E86B7880A4B | 417A2BA34F8FD367556812197E2395ED40D8B394F9224CDCBE8AB3939795EC2A |
| Windows6.1-KB2928120-x86.msu | 7B7B6EE24CD8BE1AB3479F9E1CF9C98982C8BAB1 | 603206D44815EF2DC262016ED13D6569BE13D06E2C6029FB22621027788B8095 |
| Windows8-RT-KB2928120-x64.msu | E18FC05B4CCA0E195E62FF0AE534BA39511A8593 | FCAED97BF1D61F60802D397350380FADED71AED64435D3E9EAA4C0468D80141E |
| Windows8-RT-KB2928120-x86.msu | A5DFB34F3B9EAD9FA78C67DFC7ACACFA2FBEAC0B | 7F00A72D8A15EB2CA70F7146A8014E39A71CFF5E39596F379ACD883239DABD41 |
| Windows8.1-KB2928120-x64.msu | A07FF14EED24F3241D508C50E869540915134BB4 | 6641B1A9C95A7E4F0D5A247B9F488887AC94550B7F1D7B1198D5BCBA92F7A753 |
| Windows8.1-KB2928120-x86.msu | DE84667EC79CBA2006892452660EB99580D27306 | 468EE4FA3A22DDE61D85FD3A9D0583F504105DF2F8256539051BC0B1EB713E9C |
| Windows8.1-KB2961899-x64.msu | 10BAE807DB158978BCD5D8A7862BC6B3EF20038B | EC26618E23D9278FC1F02CA1F13BB289E1C6C4E0C8DA5D22E1D9CDA0DA8AFF51 |
| Windows8.1-KB2961899-x86.msu | 230C64447CC6E4AB3AD7B4D4655B8D8CEFBFBE98 | E3FAD567AB6CA616E42873D3623A777185BE061232B952938A8846A974FFA7AF |