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

套用到
Windows RT 8.1 Windows 8.1 Windows 8.1 Enterprise Windows 8.1 Pro Windows Server 2012 R2 Datacenter Windows Server 2012 R2 Essentials Windows Server 2012 R2 Foundation Windows Server 2012 R2 Standard Windows 8 Windows 8 Enterprise Windows 8 Pro Windows Server 2012 Datacenter Windows Server 2012 Datacenter Windows Server 2012 Essentials Windows Server 2012 Foundation Windows Server 2012 Foundation Windows Server 2012 Standard Windows Server 2012 Standard Windows 7 Service Pack 1 Windows 7 Enterprise Windows 7 Professional Windows 7 Ultimate Windows 7 Home Premium Windows 7 Home Basic Windows Server 2008 R2 Service Pack 1 Windows Server 2008 R2 Standard Windows Server 2008 R2 Enterprise Windows Server 2008 R2 Datacenter Windows Server 2008 Service Pack 2 Windows Server 2008 for Itanium-Based Systems Windows Server 2008 Datacenter Windows Server 2008 Enterprise Windows Server 2008 Standard Windows Server 2008 Web Edition Windows Vista Service Pack 2 Windows Vista Business Windows Vista Enterprise Windows Vista Home Basic Windows Vista Home Premium Windows Vista Starter Windows Vista Ultimate Windows Vista Enterprise 64-bit Edition Windows Vista Home Basic 64-bit Edition Windows Vista Home Premium 64-bit Edition Windows Vista Ultimate 64-bit Edition Windows Vista Business 64-bit Edition

簡介

Microsoft 已發布安全公告 MS14-025。 欲了解更多關於本安全公告:

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

協助安裝更新:
Microsoft Update 支援

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

幫助保護你的 Windows 電腦免受病毒和惡意軟體侵害:
病毒解決方案與資訊安全中心

您所在國家/地區的當地支援:
國際支持

更多資訊

已知問題及更多關於本次安全更新的資訊

以下文章包含更多關於此安全更新的資訊,特別是針對各產品版本的相關資訊。 這些文章可能包含已知問題的資訊。 如果是這樣,已知問題會在每個文章連結下列出。

  • 2928120

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

  • 2961899

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

群組原則偏好設定

概觀

部分群組原則偏好設定可以儲存密碼。 這項功能正在被移除,因為密碼儲存不安全。 本文說明使用者介面變更及任何可用的變通方法。

以下群組原則偏好設定將不再允許儲存使用者名稱與密碼:

  • 行駛地圖
  • 本地使用者與群組
  • 排定的工作
  • 服務
  • 資料來源

這會影響你環境中任何依賴這些偏好設定密碼的現有群組原則物件 (GPO) 行為。 同時也會防止使用此功能建立新的群組原則偏好設定。

對於磁碟機地圖、本地使用者與群組,以及服務,你或許可以透過 Windows 中其他更安全的功能來達成類似目標。

對於排程任務與資料來源,您將無法透過群組原則偏好設定密碼的非安全功能達成相同的目標。

案例

以下群組原則偏好設定受此變更影響。 每個偏好都會簡要介紹,然後再詳細說明。 此外,遊戲還提供變通方法,讓你能執行相同的任務。

受影響的偏好 適用於使用者
適用於電腦
本地使用者管理
對應的磁碟機
服務
排程任務 (上層)
排程任務 (下層)
即時任務 (高層)
即時任務 (下層)
資料來源

變更摘要

  • 所有受影響偏好設定中的密碼欄位皆被停用。 管理員無法透過這些密碼欄位建立新的偏好設定。
  • 使用者名稱欄位在某些偏好設定中是被停用的。
  • 包含密碼的現有偏好設定無法更新。 這些功能只能依照個人偏好刪除或停用。
  • 偏好設定中刪除與停用動作的行為沒有改變。
  • 當管理員開啟包含 CPassword 屬性的任何偏好設定時,管理員會收到以下警告對話框,告知近期的棄用。 嘗試將需要 CPassword 屬性的新偏好設定或偏好設定的變更保存時,也會觸發相同的對話框。 只有刪除和停用動作不會觸發警告對話框。

             a0a4e39c-aa0a-936b-e086-593dfb035a8e
            
            
            
          

情境一:本地使用者管理

本地使用者管理偏好設定常用於建立擁有已知密碼的本地管理員。 此功能不安全,因為群組原則偏好設定儲存密碼的方式。 因此,這項功能現已無法使用。 以下偏好會受到影響:

  • 電腦設定 -> 控制台設定 -> 本地使用者與群組 -> 新 -> 本地使用者
  • 使用者設定 -> 控制台設定 -> 本地使用者與群組 -> 新 -> 本地使用者

重要變更

動作:創建或替換

  • 使用者名稱密碼確認密碼欄位都被停用了。
  • 當管理員開啟或嘗試儲存包含密碼的現有偏好設定的任何變更時,警告對話框會出現。

                
                 41da12b9-527c-80ac-986c-82de889869ab
                
行動:更新

  • 密碼確認密碼欄位皆被停用。
  • 當管理員開啟或嘗試儲存包含密碼的現有偏好設定的任何變更時,警告對話框會出現。

                
                 183F7C58-79e3-DB1B-72E9-3144FCcFC0E4
                
動作:刪除

  • 行為沒有改變

解決方法

對於先前依賴群組原則偏好設定本地管理員密碼的人,以下腳本作為 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 網域服務。

6d3013b5-DF8C-898A-0A22-33A829D3755f

情境二:映射磁碟

管理員會使用磁碟地圖來分配網路位置給使用者。 密碼保護功能是用來確保硬碟有授權存取權限。 以下偏好會受到影響:

  • 使用者設定 -> Windows 設定 -> 磁碟機映射 -> 新設 -> 映射磁碟

重要變更

操作:建立、更新或替換

  • 使用者名稱密碼確認密碼欄位都被停用了。

                 78e7a904-5d9c-8655-e4b6-2d7c8dc3c3f9
                
動作:刪除

  • 行為沒有改變

解決方法

你可以不用密碼方法來驗證,而是用 Windows 檔案總管來管理分享權限並分配使用者權限。 你可以使用 Active Directory 物件來控制該資料夾的權限。

情境三:服務

你可以利用服務偏好設定,將服務屬性變更為在非原始安全情境中執行的情境。 以下偏好會受到影響:

  • 電腦設定 -> 控制台設定 -> 服務 -> 新 -> 服務

重要變更

啟動:無變更、自動或手動

  • 密碼確認密碼欄位已停用。
  • 管理員只能使用內建帳號。

                 BD4E263C-D8E6-E20F-B57A-9C1C5CACA355
                
啟動:停用

  • 行為沒有改變

新增對話框

  • 試圖使用非內建使用者的管理員「本帳號」將收到以下警告:

                 975f73f7-e950-ad09-d46b-b68ac9a5e4cb
                
                
              

解決方法

                
                
服務仍可作為本地系統帳號執行。 服務權限可依據 Microsoft 知識庫以下文章所述進行更改:

256345 如何設定群組原則設定以設定系統服務的安全

注意:如果你想設定的服務不存在,必須在運行該服務的電腦上設定。 

情境四:排程與即時任務 (高層)

這些工具用於在特定安全情境下執行排程任務。 無法在未登入時,將排程任務的憑證儲存在任意使用者的狀態下執行。 以下偏好會受到影響。 (請注意,在某些平台上,「至少 Windows 7」會被「Windows Vista 及以後版本」取代。)

  • 電腦設定 -> 控制台設定 -> 排程任務 -> 新 -> 排程任務 (至少是 Windows 7)
  • 電腦設定 -> 控制台設定 -> 排程任務 -> 新 -> 立即任務 (至少是 Windows 7)
  • 使用者設定 -> 控制台設定 -> 排程任務 -> 新 -> 排程任務 (至少是 Windows 7)
  • 使用者設定 -> 控制台設定 -> 排程任務 -> 新 -> 立即任務 (至少是 Windows 7)

重要變更

操作:建立、更新或替換

  • 當你選擇「 執行使用者是否登入 」選項時,對話框不再提示管理員輸入憑證。
  • 不儲存密碼 」勾選框已被關閉。 預設情況下,該方框也會被勾選。

                 60ff2409-1c24-a2aa-466d-89afaadaf0a0
                
動作:刪除

行為沒有改變

解決方法

對於「排程任務 (至少 Windows 7) 」和「立即任務 (至少 Windows 7) 」任務,管理員可在該使用者登入時使用特定使用者帳號。 或者,他們只能以該使用者身份存取本地資源。 這些任務仍可在本地服務的情境中執行。

            
情境五:排程與即時任務 (下層) 這是用於特定安全情境下執行排程任務的下層偏好設定。 無法在未登入時,將排程任務的憑證儲存在任意使用者的狀態下執行。 以下偏好會受到影響:

  • 電腦設定 -> 控制台設定 -> 排程任務 -> 新任務 -> 排程任務
  • 電腦設定 -> 控制台設定 -> 排程任務 -> 新任務 -> 立即任務 (Windows XP)
  • 使用者設定 -> 控制台設定 -> 排程任務 -> 新 -> 排程任務
  • 使用者設定 -> 控制台設定 -> 排程任務 -> 新 -> 立即任務 (Windows XP)

重要變更

操作:建立、更新或替換

  • 執行為」 的勾選框已被停用。 因此, 使用者名稱密碼確認密碼 欄位都被停用了。

                 2baacb70-2e5a-e72d-7fd6-3e358608d76c
                
動作:刪除

 行為沒有改變

解決方法

對於「排程任務」和「Windows XP) 立即任務」項目,排程任務 (會依據本地服務目前可用的權限執行。 

情境六:資料來源

資料來源偏好用於將資料來源與電腦或使用者關聯。 此功能不再儲存憑證,無法存取受密碼保護的資料來源。 以下偏好會受到影響:

  • 電腦設定 -> 控制台設定 -> 資料來源
  • 使用者設定 -> 控制台設定 -> 資料來源

重要變更

操作:建立、更新或替換

  • 使用者名稱密碼確認密碼欄位皆被停用:

                 92beb16c-1b15-8903-a694-f471212d4a45
                
動作:刪除

  • 行為沒有改變

解決方法

沒有可用的因應措施。 此偏好不再儲存憑證以允許存取受密碼保護的資料來源。 

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 鎖定為 路徑 ,而非網域。

偵測腳本會產生一個類似以下的清單:

F9C1582E-A8D3-6F33-FFDD-7C143530043D

對於較長的清單,建議將輸出儲存為一個檔案:

.\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,清潔整個環境。 當偵測腳本回傳零結果時,你就完了。
檔案雜湊資訊
檔案名稱 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