MS14-025:群組原則喜好設定中的漏洞可能允許權限提高:2014 年 5 月 13 日

簡介

Microsoft 已經發行資訊安全佈告欄 MS14-025。如果要進一步瞭解此資訊安全佈告欄:

如何取得此安全性更新的說明及支援

安裝更新的說明:
修正 Microsoft Windows Update 問題

適用於 IT 專業人員的安全性解決方案:
安全性疑難排解與支援

協助保護您的 Windows 電腦免於受到病毒和惡意程式碼攻擊:
Microsoft Virus Protection 與 Windows Security 支援

根據您所在國家/地區的當地支援:
國際化支援

其他相關資訊

此安全性更新的已知問題和其他相關資訊

下列文件包含此安全性更新 (與個別產品版本相關) 的相關資訊。這些文章可能包含已知問題的資訊。在這種情況下,已知問題會列於每個文章連結下方。
  • 2928120



    MS14-025:說明已安裝更新 2919355 之系統的 Windows 遠端伺服器管理工具安全性更新:2014 年 5 月 13 日

  • 2961899

    MS14-025:說明未安裝更新 2919355 之系統的 Windows 遠端伺服器管理工具安全性更新:2014 年 5 月 13 日

群組原則喜好設定

概觀

某些群組原則喜好設定可儲存密碼。因為密碼並非以安全方式儲存,因此已移除此功能。本文將說明使用者介面的變更和任何可用的因應措施。

下列的群組原則喜好設定將不再允許儲存使用者名稱及密碼:
  • 磁碟機對應
  • 本機使用者和群組
  • 排定的工作
  • 服務
  • 資料來源
這會影響任何存在您環境中,依賴這些喜好設定所包含密碼的群組原則物件 (GPO) 行為。它也會防止使用這項功能來建立新的群組原則喜好設定。

對於 [對應的磁碟機]、[本機使用者和群組] 和 [服務],您可以在 Windows 內透過其他更安全的功能達到相同目標。

對於排程工作和資料來源,您將無法達成透過群組原則喜好設定密碼的非安全性功能所能達成的相同目標。

案例

這項變更會影響下列群組原則喜好設定。簡單地涵蓋每個喜好設定,以及更多詳細資料。此外,所提供的因應措施會讓您執行相同的工作。
受影響的喜好設定套用至使用者
套用至電腦
本機使用者管理
對應磁碟機
服務
排程工作 (高層級)
排程工作 (低層級)
立即工作 (高層級)
立即工作 (低層級)
資料來源

變更摘要

  • 密碼欄位在所有受影響的喜好設定中均會停用。系統管理員不能使用這些密碼欄位以建立新的喜好設定。
  • 使用者名稱欄位會在某些喜好設定中停用。
  • 無法更新包含密碼的現有喜好設定。為了適合特定的喜好設定,它們只能刪除或停用。
  • 「刪除」動作和「停用」動作的行為並未變更喜好設定。
  • 當系統管理員打開任何包含 CPassword 屬性的喜好設定,系統管理員會接收到以下的警告對話方塊以告知他或她最新的取代。嘗試將變更儲存至需要 CPassword 屬性的全新或現有喜好設定時,也會觸發相同的對話方塊。只有「刪除」和「停用」的動作不會觸發警告對話方塊。





案例 1:本機使用者管理

本機使用者管理喜好設定經常用於建立知道電腦上密碼的本機系統管理員。有鑑於群組原則喜好設定儲存密碼的方式,這項功能並不安全。因此,這項功能無法再使用。將影響下列喜好設定:
  • 電腦設定 -> 控制面板設定 -> 本機使用者和群組 -> 新增 -> 本機使用者
  • 使用者設定 -> 控制面板設定 -> 本機使用者和群組 -> 新增 -> 本機使用者

重要變更

動作:建立或取代
  • 已停用 [使用者名稱][密碼][確認密碼] 欄位。
  • 當系統管理員開啟或嘗試儲存任何變更至包含密碼的現有喜好設定,警告對話方塊將會顯示。




動作:更新
  • 已停用 [密碼][確認密碼] 欄位。
  • 當系統管理員開啟或嘗試儲存任何變更至包含密碼的現有喜好設定,警告對話方塊將會顯示。




動作:刪除
  • 行為沒有變更

因應措施

對於之前依賴群組原則喜好設定以設定本機系統管理員密碼的情形,以下提供的指令碼可作為 CPassword 的安全性替代方案。將內容複製並儲存至新增的 Windows PowerShell 檔案,然後在前述的 .EXAMPLE 區段執行該指令碼。

Microsoft 僅提供示範性的程式設計範例,不做任何明示或默示的擔保。其中包含 (但不限於) 其適售性或適合某特定用途之默示擔保。本文假設您已相當熟悉示範所用的程式設計語言,以及用於建立和偵錯程序的工具。Microsoft 技術支援工程師可以協助說明特定程序的功能,但無法修改這些範例以提供附加功能或建構程序以滿足您的特定需求。

 
function Invoke-PasswordRoll
{
<#
.SYNOPSIS

此指令碼可用來將遠端電腦上的本機帳戶密碼設定成隨機密碼。使用者名稱/密碼/伺服器組合將以 CSV 檔案格式儲存。
CSV 檔案中儲存的帳戶密碼可以使用系統管理員所選擇的密碼加密,以確保純文字密碼沒有寫入硬碟中。
使用這個檔案中的另一個函式可解密加密的密碼:ConvertTo CleartextPassword


功能: Invoke-PasswordRoll
作者:Microsoft
版本: 1.0

.DESCRIPTION

此指令碼可用來將遠端機器上的本機帳戶密碼設定成隨機密碼。使用者名稱/密碼/伺服器組合將以 CSV 檔案格式儲存。
CSV 檔案中儲存的帳戶密碼可以使用系統管理員所選擇的密碼加密,以確保純文字密碼沒有寫入硬碟中。
使用以下檔案中的另一個函式可解密加密的密碼:ConvertTo-CleartextPassword

.PARAMETER ComputerName

要針對使用 PowerShell 遠端執行指令碼的電腦陣列。

.PARAMETER LocalAccounts

應變更其密碼密碼的本機帳戶陣列。

.PARAMETER TsvFileName

要輸出至使用者名稱/密碼/伺服器組合的檔案。

.PARAMETER EncryptionKey

要加密 TSV 檔案的密碼。使用 AES 加密。只會儲存在 TSV 檔案中的密碼會加密,使用者名稱和伺服器名稱則是純文字格式。

.PARAMETER PasswordLength

將用於本機帳戶隨機產生的密碼長度。

.PARAMETER NoEncryption

請不要將儲存在 TSV 檔案中的帳戶密碼加密。這將會導致純文字密碼寫入至磁碟。

.EXAMPLE

. .\Invoke-PasswordRoll.ps1 #將函數載入指令碼檔中
Invoke-PasswordRoll -ComputerName (Get-Content computerlist.txt) -LocalAccounts @("administrator","CustomLocalAdmin") -TsvFileName "LocalAdminCredentials.tsv" -EncryptionKey "Password1"

連接到儲存在檔案「computerlist.txt」的所有電腦。如果本機帳戶「系統管理員」和/或「自訂本機系統管理員」出現在系統上,則其密碼已變更為隨機產生的密碼,長度為 20 個字元 (預設值)。
使用者名稱/密碼/伺服器組合會儲存在「LocalAdminCredentials.tsv」,而且帳戶密碼使用 AES 加密的「Password1」。

.EXAMPLE

. .\Invoke-PasswordRoll.ps1 #將函數載入指令碼檔中
Invoke-PasswordRoll -ComputerName (Get-Content computerlist.txt) -LocalAccounts @("administrator") -TsvFileName "LocalAdminCredentials.tsv" -NoEncryption -PasswordLength 40

連接到儲存在檔案「computerlist.txt」的所有電腦。如果本機帳戶「系統管理員」出現在系統上,則其密碼已變更為隨機產生的密碼,長度為 40 個字元。
使用者名稱/密碼/伺服器組合會儲存在未加密的 LocalAdminCredentials.tsv。

.NOTES
需求:
-必須安裝 PowerShellv2 或更新版本
-PowerShell 遠端電腦必須在所有執行指令碼的系統上啟用

指令碼行為:
-如果本機帳戶出現在系統上,但是未在 LocalAccounts 參數中指定,則指令碼會在螢幕上顯示警告,以警示您此主機帳戶的存在。在此情況下,指令碼會繼續執行。
-如果本機帳戶已在 LocalAccounts 參數中指定,但是帳戶卻不存在於電腦中,則不會出現任何反應 (將不會建立帳戶)。
-包含在此檔案中的 ConvertTo-CleartextPassword 函數,可用來解密儲存在 TSV 檔案中的密碼。
-如果 ComputerName 中指定的伺服器無法連線,PowerShell 將會輸出錯誤訊息。
-Microsoft 建議公司定期復原所有本機和網域的帳戶密碼。

#>
[CmdletBinding(DefaultParameterSetName="Encryption")]
Param(
[Parameter(Mandatory=$true)]
[String[]]
$ComputerName,

[Parameter(Mandatory=$true)]
[String[]]
$LocalAccounts,

[Parameter(Mandatory=$true)]
[String]
$TsvFileName,

[Parameter(ParameterSetName="Encryption", Mandatory=$true)]
[String]
$EncryptionKey,

[Parameter()]
[ValidateRange(20,120)]
[Int]
$PasswordLength = 20,

[Parameter(ParameterSetName="NoEncryption", Mandatory=$true)]
[Switch]
$NoEncryption
)


#載入任何需要的 .net 類別
Add-Type -AssemblyName "System.Web" -ErrorAction Stop


#這是在 ComputerName 中所指定的每一部電腦上均會執行的 scriptblock
$RemoteRollScript = {
Param(
[Parameter(Mandatory=$true, Position=1)]
[String[]]
$Passwords,

[Parameter(Mandatory=$true, Position=2)]
[String[]]
$LocalAccounts,

#這裡讓我可以記錄指令碼所連接的伺服器名稱,有時 DNS 記錄相當混亂,能有這個功能真的很不錯。
[Parameter(Mandatory=$true, Position=3)]
[String]
$TargettedServerName
)

$LocalUsers = Get-WmiObject Win32_UserAccount -Filter "LocalAccount=true" | Foreach {$_.Name}

#檢查電腦是否有任何其密碼不會因指令碼而還原的本機使用者帳戶。
foreach ($User in $LocalUsers)
{
if ($LocalAccounts -inotcontains $User)
{
Write-Warning "伺服器:「$($TargettedServerName)」有本機帳戶「$($User)」其密碼不會由此指令碼變更:"
}
}

#針對此伺服器上所指定的所有本機帳戶變更密碼
$PasswordIndex = 0
foreach ($LocalAdmin in $LocalAccounts)
{
$Password = $Passwords[$PasswordIndex]

if ($LocalUsers -icontains $LocalAdmin)
{
try
{
$objUser = [ADSI]"WinNT://localhost/$($LocalAdmin), user"
$objUser.psbase.Invoke("SetPassword", $Password)

$Properties = @{
TargettedServerName = $TargettedServerName
Username = $LocalAdmin
Password = $Password
RealServerName = $env:computername
}

$ReturnData = New-Object PSObject -Property $Properties
Write-Output $ReturnData
}
catch
{
Write-Error "變更使用者密碼錯誤:$($LocalAdmin) 於伺服器:$($TargettedServerName)"
}
}

$PasswordIndex++
}
}


#於執行此指令碼的用戶端產生密碼,而非遠端電腦。System.Web.Security 無法在 NET 用戶端設定檔中使用。以執行此指令碼的用戶端打這通電話 #,確保僅 1 台電腦需要完整的 NET 安裝執行階段 (相對於每個還原密碼的系統)。

function Create-RandomPassword
{
Param(
[Parameter(Mandatory=$true)]
[ValidateRange(20,120)]
[Int]
$PasswordLength
)

$Password = [System.Web.Security.Membership]::GeneratePassword($PasswordLength, $PasswordLength / 4)

#這不應該失敗,但我還是要進行例行性檢查。
if ($Password.Length -ne $PasswordLength)
{
throw new Exception("GeneratePassword 傳回的密碼與所要求的長度不同。要求長度:$($PasswordLength). 產生的長度: $($Password.Length)")
}

return $Password
}


#主要功能 - 在遠端電腦產生密碼,以變更主機帳戶指定的密碼。
if ($PsCmdlet.ParameterSetName -ieq "Encryption")
{
try
{
$Sha256 = new-object System.Security.Cryptography.SHA256CryptoServiceProvider
$SecureStringKey = $Sha256.ComputeHash([System.Text.UnicodeEncoding]::Unicode.GetBytes($EncryptionKey))
}
catch
{
Write-Error "建立 TSV 加密金鑰發生錯誤" -ErrorAction Stop
}
}

foreach ($Computer in $ComputerName)
{
#必須為每個可以變更的帳戶產生 1 個密碼
$Passwords = @()
for ($i = 0; $i -lt $LocalAccounts.Length; $i++)
{
$Passwords += Create-RandomPassword -PasswordLength $PasswordLength
}

Write-Output "正在連線到伺服器「$($Computer)」以轉動指定的本機系統管理員密碼"
$Result = Invoke-Command -ScriptBlock $RemoteRollScript -ArgumentList @($Passwords, $LocalAccounts, $Computer) -ComputerName $Computer
#如果使用加密功能,在寫入磁碟之前,運用使用者提供的金鑰加密
if ($Result -ne $null)
{
if ($PsCmdlet.ParameterSetName -ieq "NoEncryption")
{
$Result | Select-Object Username,Password,TargettedServerName,RealServerName | Export-Csv -Append -Path $TsvFileName -NoTypeInformation
}
else
{
#Filters out $null entries returned
$Result = $Result | Select-Object Username,Password,TargettedServerName,RealServerName

foreach ($Record in $Result)
{
$PasswordSecureString = ConvertTo-SecureString -AsPlainText -Force -String ($Record.Password)
$Record | Add-Member -MemberType NoteProperty -Name EncryptedPassword -Value (ConvertFrom-SecureString -Key $SecureStringKey -SecureString $PasswordSecureString)
$Record.PSObject.Properties.Remove("Password")
$Record | Select-Object Username,EncryptedPassword,TargettedServerName,RealServerName | Export-Csv -Append -Path $TsvFileName -NoTypeInformation
}
}
}
}
}


function ConvertTo-CleartextPassword
{
<#
.SYNOPSIS
此函數可用來解密儲存函數用 PasswordRoll 所加密的密碼。

功能: ConvertTo-CleartextPassword
作者:Microsoft
版本: 1.0

.DESCRIPTION
此函數可用來解密儲存函數用 PasswordRoll 所加密的密碼。


.PARAMETER EncryptedPassword

加密的密碼已儲存在 TSV 檔案中。

.PARAMETER EncryptionKey

用來執行加密的密碼。


.EXAMPLE

. .\Invoke-PasswordRoll.ps1 #將函數載入指令碼檔中
ConvertTo-CleartextPassword -EncryptionKey "Password1" -EncryptedPassword 76492d1116743f0423413b16050a5345MgB8AGcAZgBaAHUAaQBwADAAQgB2AGgAcABNADMASwBaAFoAQQBzADEAeABjAEEAPQA9AHwAZgBiAGYAMAA1ADYANgA2ADEANwBkADQAZgAwADMANABjAGUAZQAxAGIAMABiADkANgBiADkAMAA4ADcANwBhADMAYQA3AGYAOABkADcAMQA5ADQAMwBmAGYANQBhADEAYQBjADcANABkADIANgBhADUANwBlADgAMAAyADQANgA1ADIAOQA0AGMAZQA0ADEAMwAzADcANQAyADUANAAzADYAMAA1AGEANgAzADEAMQA5ADAAYwBmADQAZAA2AGQA"

解密儲存在 TSV 檔案中加密的密碼。

#>
Param(
[Parameter(Mandatory=$true)]
[String]
$EncryptedPassword,

[Parameter(Mandatory=$true)]
[String]
$EncryptionKey
)

$Sha256 = new-object System.Security.Cryptography.SHA256CryptoServiceProvider
$SecureStringKey = $Sha256.ComputeHash([System.Text.UnicodeEncoding]::Unicode.GetBytes($EncryptionKey))

[SecureString]$SecureStringPassword = ConvertTo-SecureString -String $EncryptedPassword -Key $SecureStringKey
Write-Output ([System.Runtime.InteropServices.Marshal]::PtrToStringAuto([System.Runtime.InteropServices.Marshal]::SecureStringToCoTaskMemUnicode($SecureStringPassword)))
}
  系統管理員可以建立 Active Directory 群組並透過群組原則喜好設定將其加入主機系統管理員群組 -> 主機群組,以在電腦上加入主機系統管理員帳戶。這個動作不會認證快取。對話方塊類似下列項目。當使用者用這些認證登入時,此因應措施需要連結至 Active Directory 網域服務。





案例 2:對應磁碟機

系統管理員使用磁碟機對應來為使用者配置網路位置。密碼保護功能用來確保授權存取磁碟機。將影響下列喜好設定:
  • 使用者設定 -> Windows 設定 -> 磁碟機對應 -> 新增 -> 對應的磁碟機

重要變更

動作:建立、更新或取代
  • 已停用 [使用者名稱][密碼][確認密碼] 欄位。



動作:刪除
  • 行為沒有變更

因應措施

除了使用密碼的驗證方法,您可以使用 Windows Explorer 管理共用權限並為使用者配置權限。您可以使用 Active Directory 物件來控制權限的資料夾。


案例 3:服務

您可以用喜好設定服務來變更服務屬性,以此方法使其得以在原始安全性內容之外執行。將影響下列喜好設定:
  • 電腦設定 -> 控制面板設定 -> 服務 -> 新增 -> 服務

重要變更

啟動:沒有變更、自動或手動
  • 已停用 [密碼][確認密碼] 欄位。
  • 系統管理員僅能使用內建的帳戶。



啟動:停用
  • 行為沒有變更
新增對話方塊
  • 嘗試為此帳戶使用非內建使用者的系統管理員將會收到下列警告:




因應措施


服務仍可做為主機系統帳戶執行。可以變更的服務權限,如下列「Microsoft 知識庫」中的文件中所述:
256345 如何設定群組原則設定來設定系統服務的安全性 (機器翻譯)

注意
 如果您想要設定的服務不存在,你必須在執行此服務的電腦上的配置設定。


案例 4:排程及立即工作 (高層級)

用來在特定的安全性內容中執行排程的工作。當使用者不登入時將無法使用以任意的使用者來儲存排程工作的權限。將影響下列喜好設定。(請注意,在某些平台上,「至少須為 Windows 7」已取代「Windows Vista 以及更新的版本。」)
  • 電腦設定 -> 控制台面板設定 -> 排程工作 -> 新增 -> 排程工作 (至少須為 Windows 7)
  • 電腦設定 -> 控制台面板設定 -> 排程工作 -> 新增 -> 即時工作 (至少須為 Windows 7)
  • 使用者設定 -> 控制台面板設定 -> 排程工作 -> 新增 -> 排程工作 (至少須為 Windows 7)
  • 使用者設定 -> 控制台面板設定 -> 排程工作 -> 新增 -> 即時工作 (至少須為 Windows 7)

重要變更

動作:建立或取代
  • 當你選取 [不論有無登入都執行] 選項時,對話方塊不再提示系統管理員給予授權。
  • 已停用 [不要儲存密碼] 核取方塊。此方塊已根據預設核取。



動作:刪除

行為沒有變更

因應措施

就「排程工作 (至少須為 Windows 7)」和「立即工作 (至少須為 Windows 7)」而言,當指定的使用者登入時,系統管理員可以使用特定的使用者帳戶。或者僅能以該使用者存取主機資源。這些工作仍然可以在本機服務的內容中執行。



案例 5:排程及立即工作 (低層級)

這是喜好設定的低層級版本,用於執行於特定安全性內容的排程工作。當使用者不登入時將無法使用以任意的使用者來儲存排程工作的權限。下列喜好設定將受到影響:
  • 電腦設定 -> 控制面板設定 -> 排程工作 -> 新增 -> 排程工作
  • 電腦設定 -> 控制面板設定 -> 排程工作 -> 新增 -> 排程工作 (Windows XP)
  • 使用者設定 -> 控制面板設定 -> 排程工作 -> 新增 -> 排程工作
  • 使用者設定 -> 控制面板設定 -> 排程工作 -> 新增 -> 立即工作 (Windows XP)

重要變更

動作:建立、更新或取代
  • 已停用 [執行] 對話方塊。因此,已停用 [使用者名稱][密碼][確認密碼] 欄位。



動作:刪除

行為沒有變更

因應措施

對於「排程工作」和「即時工作 (Windows XP)」物件,使用主機服務目前可用的權限執行排程工作的項目。


案例 6:資料來源

資料來源喜好設定用於在資料來源和電腦或使用者間建立關聯。為能啟用由密碼保護的資料來源的存取,此功能已不再儲存認證。將影響下列喜好設定:
  • 電腦設定 -> 控制面板設定 -> 資料來源
  • 使用者設定 -> 控制面板設定 -> 資料來源

重要變更

動作:建立、更新或取代
  • 已停用 [使用者名稱][密碼][確認密碼] 欄位:



動作:刪除
  • 行為沒有變更

因應措施

沒有可用的因應措施。為能允許存取由密碼保護的資料來源,此喜好設定已不再儲存認證。


取代 CPassword

移除 CPassword

在 Microsoft 知識庫文章中的 Windows PowerShell 指令碼能夠偵測網域中是否包含任何可能使用 CPassword 的群組原則喜好設定。如果在指定的喜好設定中偵測到 CPassword XML,便會顯示此清單中。


偵測 CPassword 喜好設定

此指令碼必須在您想要清理的網域控制站的本機目錄中執行。將內容複製並儲存至新的 Windows PowerShell 檔案,判斷您的系統磁碟機,然後按照以下指示用法執行指令碼。

 <#
.SYNOPSIS
在您的網域中的群組原則物件能根據不同工作所儲存的密碼而具有不同的喜好設定,如下所示:
1. 資料來源
2. 磁碟機對應
3. 本機使用者
4. 排程工作 (XP 與高層級)
5. 服務
這些密碼儲存於 SYSVOL、屬於 GP 喜好設定的一部分,且由於低度加密所以並非安全 (32-byte AES)。
因此,我們建議您不要在您的網域環境中部署此喜好設定,並且移除任何此種喜好設定。
此指令碼旨在協助尋找 GP 喜好設定中包含密碼在其網域 SYSVOL 的系統管理員。

.DESCRIPTION
此指令碼必須在 DC 上執行,或是在安裝 RSAT 的用戶端電腦中執行,以列印所有包含像是 GPO、喜好設定名稱、此喜好設定已定義的 GPEdit 路徑之密碼資訊的喜好設定。

在您擁有受影響的喜好設定清單後,便能使用群組原則管理主控台中的編輯器來移除這些喜好設定。

.SYNTAX
Get-SettingsWithCPassword.ps1 [-Path <String>]
.EXAMPLE
Get-SettingsWithCPassword.ps1 -Path %WinDir%\SYSVOL\domain
Get-SettingsWithCPassword.ps1 -Path <GPO 備份資料夾路徑>

.NOTES
如果找不到群組原則 PS 模組,輸出會包含 GPO GUID,而不是 GPO 名稱。您可以在網域控制站執行此指令碼或是在您已安裝 RSAT 並且啟用群組原則模組的用戶端上重新執行此指令碼。

或者,您可以使用 GPO GUID 來使用 Get GPO cmdlet 以取得 GPO 名稱。

.LINK
http://go.microsoft.com/fwlink/?LinkID=390507

#>
#----------------------------------------------------------------------------------------------------------------
# 輸入參數值
#--------------------------------------------------------------------------------------------------------------
param(
[string]$Path = $(throw "-Path is required.") # GPP 位在的目錄路徑。
)
#---------------------------------------------------------------------------------------------------------------
$isGPModuleAvailable = $false
$impactedPrefs = { "Groups.xml", "ScheduledTasks.xml","Services.xml", "DataSources.xml", "Drives.xml" }
#----------------------------------------------------------------------------------------------------------------
# 匯入可用的群組原則模組
#----------------------------------------------------------------------------------------------------------------
if (-not (Get-Module -name "GroupPolicy"))
{
if (Get-Module -ListAvailable |
Where-Object { $_.Name -ieq "GroupPolicy" })
{
$isGPModuleAvailable = $true
Import-Module "GroupPolicy"
}
else
{
Write-Warning "無法匯入適用於 PowerShell 的群組原則模組。因此,系統將提報 GPO GUID。
在 DC 上執行此指令碼以取得 GPO 名稱,或使用 Get-GPO Cmdlet (於 DC 上) 從 GPO GUID 取得 GPO 名稱。"
}
}
else
{
$isGPModuleAvailable = $true
}
Function Enum-SettingsWithCpassword ( [string]$sysvolLocation )
{
# GPMC tree paths
$commonPath = " -> Preferences -> Control Panel Settings -> "
$driveMapPath = " -> Preferences -> Windows Settings -> "

# 以遞迴方式取得 SYVOL 位置內的所有 xml 檔案
$impactedXmls = Get-ChildItem $sysvolLocation -Recurse -Filter "*.xml" | Where-Object { $impactedPrefs -cmatch $_.Name }


# 各 xml 檔案均包含多個喜好設定。逐一查看每個喜好設定來檢查它是否
# 包含 cpassword 屬性並加以顯示。
foreach ( $file in $impactedXmls )
{
$fileFullPath = $file.FullName

# 設定 GPP 類別。如果檔案位於 SYSVOL 的機器資料夾下
# 則設定會由電腦設定所定義,如果不是的話
# 則由使用者設定所定義
if ( $fileFullPath.Contains("Machine") )
{
$category = "Computer Configuration"
}
elseif ( $fileFullPath.Contains("User") )
{
$category = "User Configuration"
}
else
{
$category = "Unknown"
}
# 取得檔案內容為 XML
try
{
[xml]$xmlFile = get-content $fileFullPath -ErrorAction Continue
}
catch [Exception]{
Write-Host $_.Exception.Message
}
if ($xmlFile -eq $null)
{
continue
}
switch ( $file.BaseName )
{
Groups
{
$gppWithCpassword = $xmlFile.SelectNodes("Groups/User") | where-Object { [String]::IsNullOrEmpty($_.Properties.cpassword) -eq $false }
$preferenceType = "Local Users"
}
ScheduledTasks
{
$gppWithCpassword = $xmlFile.SelectNodes("ScheduledTasks/*") | where-Object { [String]::IsNullOrEmpty($_.Properties.cpassword) -eq $false }
$preferenceType = "Scheduled Tasks"
}
DataSources
{
$gppWithCpassword = $xmlFile.SelectNodes("DataSources/DataSource") | where-Object { [String]::IsNullOrEmpty($_.Properties.cpassword) -eq $false }
$preferenceType = "Data sources"
}
Drives
{
$gppWithCpassword = $xmlFile.SelectNodes("Drives/Drive") | where-Object { [String]::IsNullOrEmpty($_.Properties.cpassword) -eq $false }
$preferenceType = "Drive Maps"
}
Services
{
$gppWithCpassword = $xmlFile.SelectNodes("NTServices/NTService") | where-Object { [String]::IsNullOrEmpty($_.Properties.cpassword) -eq $false }
$preferenceType = "Services"
}
default
{ # 清除下一個項目的 gppWithCpassword 和 preferenceType。
try
{
Clear-Variable -Name gppWithCpassword -ErrorAction SilentlyContinue
Clear-Variable -Name preferenceType -ErrorAction SilentlyContinue
}
catch [Exception]{}
}
}
if ($gppWithCpassword -ne $null)
{
# 從 filePath 解壓縮的 GUID 建立 GPO 名稱
$guidRegex = [regex]"\{(.*)\}"
$match = $guidRegex.match($fileFullPath)
if ($match.Success)
{
$gpoGuid = $match.groups[1].value
$gpoName = $gpoGuid
}
else
{
$gpoName = "Unknown"
}
if($isGPModuleAvailable -eq $true)
{
try
{
$gpoInfo = Get-GPO -Guid $gpoGuid -ErrorAction Continue
$gpoName = $gpoInfo.DisplayName
}
catch [Exception] {
Write-Host $_.Exception.Message
}
}
# 顯示包含 cpassword 的喜好設定
foreach ( $gpp in $gppWithCpassword )
{
if ( $preferenceType -eq "Drive Maps" )
{
$prefLocation = $category + $driveMapPath + $preferenceType
}
else
{
$prefLocation = $category + $commonPath + $preferenceType
}
$obj = New-Object -typeName PSObject
$obj | Add-Member –membertype NoteProperty –name GPOName –value ($gpoName) –passthru |
Add-Member -MemberType NoteProperty -name Preference -value ($gpp.Name) -passthru |
Add-Member -MemberType NoteProperty -name Path -value ($prefLocation)
Write-Output $obj
}
} # 結束如果 $gppWithCpassword
} # 結束 foreach $file
} # 結束函數 Enum-PoliciesWithCpassword
#-----------------------------------------------------------------------------------
# 檢查路徑是否有效。列舉包含 cpassword 的所有設定。
#-----------------------------------------------------------------------------------
if (Test-Path $Path )
{
Enum-SettingsWithCpassword $Path
}
else
{
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) 或是已安裝遠端伺服器管理工具的用戶端。您可以在這些主控台的五個步驟中移除任何喜好設定。如果要執行這項操作,請依照下列步驟執行:
  1. 在 GPMC中,開啟包含 CPassword 資料的喜好設定。
  2. 變更所要的動作 [刪除][停用],為套用至喜好設定。
  3. 按一下 [確定] 以儲存變更。
  4. 等候一或兩個群組原則重新整理週期,從而為用戶端允許變更傳播。
  5. 在所有用戶端均套用變更後,刪除喜好設定。
  6. 視需要重複步驟 1 到 5,從而清理全部環境。當偵測指令碼傳回零筆結果時,表示已完成。
檔案雜湊資訊
內容

文章識別碼:2962486 - 最後檢閱時間:2015年10月2日 - 修訂: 1

意見反應