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 更新支持

IT 专业人员安全解决方案:
TechNet 安全疑难解答与支持

帮助保护基于 Windows 的计算机 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
            
            
            
          

方案 1:本地用户管理

“本地用户管理”首选项通常用于创建计算机上具有已知密码的本地管理员。 此功能不安全,因为组策略首选项存储密码的方式。 因此,此功能不再可用。 以下首选项将受到影响:

  • 计算机配置 -> 控制面板设置 -> 本地用户和组 -> 新建 -> 本地用户
  • 用户配置 -> 控制面板设置 -> 本地用户和组 -> 新建本地>用户

重要更改

操作:创建或替换

  • 禁用 “用户名”、“ 密码”“确认密码” 字段。
  • 当管理员打开或尝试保存对包含密码的现有首选项所做的任何更改时,将显示警告对话框。

                
                 41da12b9-527c-80ac-986c-82de889869ab
                
操作:更新

  • 密码”“确认密码” 字段处于禁用状态。
  • 当管理员打开或尝试保存对包含密码的现有首选项所做的任何更改时,将显示警告对话框。

                
                 183f7c58-79e3-db1b-72e9-3144fcefc0e4
                
操作:删除

  • 行为无变化

解决方法

对于以前依赖 组策略 首选项来设置本地管理员密码的用户,以下脚本作为 CPassword 的安全替代方法提供。 将内容复制并保存到新的 Windows PowerShell 文件,然后按照其 中的指示运行脚本。示例部分。

Microsoft 的编程示例仅用于说明,不做任何明示或暗示的保证。 这包括但不限于特定用途的适销性或适用性的隐含保证。 本文假定你熟悉所演示的编程语言以及用于创建和调试过程的工具。 Microsoft 支持工程师可以帮助解释特定过程的功能。 但他们不会修改这些示例以提供附加功能或构造满足你的特定要求的过程。

函数 Invoke-PasswordRoll
{
<#
.简介

此脚本可用于将远程计算机上的本地帐户密码设置为随机密码。 用户名/密码/服务器组合将保存在 CSV 文件中。
可以使用管理员选择的密码对存储在 CSV 文件中的帐户密码进行加密,以确保明文帐户密码不会写入磁盘。
可以使用此文件中的另一个函数解密加密的密码:ConvertTo-CleartextPassword

函数:Invoke-PasswordRoll
作者:Microsoft
版本:1.0

.描述

此脚本可用于将远程计算机上的本地帐户密码设置为随机密码。 用户名/密码/服务器组合将保存在 CSV 文件中。
可以使用管理员选择的密码对存储在 CSV 文件中的帐户密码进行加密,以确保明文帐户密码不会写入磁盘。
可以使用此文件中的另一个函数解密加密的密码:ConvertTo-CleartextPassword

.PARAMETER ComputerName

要针对使用 PowerShell 远程处理运行脚本的计算机数组。

.PARAMETER LocalAccounts

应更改其密码的本地帐户的数组。

.PARAMETER TsvFileName

要输出用户名/密码/服务器组合的文件。

.PARAMETER EncryptionKey

用于加密 TSV 文件的密码。 使用 AES 加密。 仅对存储在 TSV 文件中的密码进行加密,用户名和服务器名称为明文。

.PARAMETER PasswordLength

将为本地帐户随机生成的密码的长度。

.PARAMETER NoEncryption

不要加密 TSV 文件中存储的帐户密码。 这将导致明文密码写入磁盘。

.例子

. .\Invoke-PasswordRoll.ps1 #Loads 此脚本文件中的函数
Invoke-PasswordRoll -ComputerName (Get-Content computerlist.txt) -LocalAccounts @ (“administrator”,“CustomLocalAdmin”) -TsvFileName “LocalAdminCredentials.tsv” -EncryptionKey “Password1”

连接到存储在文件“computerlist.txt”中的所有计算机。 如果系统上存在本地帐户“administrator”和/或“CustomLocalAdmin”,则其密码将更改
到长度为 20 (默认) 的随机生成的密码。 用户名/密码/服务器组合存储在 LocalAdminCredentials.tsv 中,并且帐户密码使用密码“Password1”进行 AES 加密。

.例子

. .\Invoke-PasswordRoll.ps1 #Loads 此脚本文件中的函数
Invoke-PasswordRoll -ComputerName (Get-Content computerlist.txt) -LocalAccounts @ (“administrator”) -TsvFileName “LocalAdminCredentials.tsv” -NoEncryption -PasswordLength 40

连接到存储在文件“computerlist.txt”中的所有计算机。 如果系统上存在本地帐户“administrator”,则其密码将更改为随机生成的
长度为 40 的密码。 用户名/密码/服务器组合存储在 LocalAdminCredentials.tsv unencrypted 中。

.笔记
要求:
-PowerShellv2 或更高版本必须安装
-必须在将对其运行脚本的所有系统上启用 PowerShell 远程处理

脚本行为:
-如果系统上存在本地帐户,但未在 LocalAccounts 参数中指定,则脚本将向屏幕写入警告,以提醒你存在此本地帐户。 发生这种情况时,脚本将继续运行。
-如果在 LocalAccounts 参数中指定了本地帐户,但计算机上不存在该帐户,则不会发生任何操作, (不会) 创建帐户。
-此文件中包含的 ConvertTo-CleartextPassword 函数可用于解密存储在 TSV 文件中加密的密码。
-如果 ComputerName 中指定的服务器无法连接到,PowerShell 将输出错误消息。
-Microsoft 建议公司定期滚动所有本地和域帐户密码。

#>
    [CmdletBinding (DefaultParameterSetName=“Encryption”) ]
    参数 (
        [Parameter (Mandatory=$true) ]
        [String[]]
        $ComputerName,

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

        [Parameter (Mandatory=$true) ]
        [字符串]
        $TsvFileName,

        [Parameter (ParameterSetName=“Encryption”, Mandatory=$true) ]
        [字符串]
        $EncryptionKey,

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

        [Parameter (ParameterSetName=“NoEncryption”, Mandatory=$true) ]
        [切换]
        $NoEncryption
    )

    #Load 任何所需的 .net 类
    Add-Type -AssemblyName “System.Web” -ErrorAction Stop

    #This 是在 ComputerName 中指定的每台计算机上执行的脚本块
    $RemoteRollScript = {
        参数 (
            [Parameter (Mandatory=$true, Position=1) ]
            [String[]]
            $Passwords,

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

            #This 在这里,因此我可以记录脚本连接到的服务器名称,有时 DNS 记录被搞砸了,最好有这个。
            [Parameter (Mandatory=$true, Position=3) ]
            [字符串]
            $TargettedServerName
        )

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

        #Check 计算机是否有任何本地用户帐户,其密码不会由此脚本滚动
        $LocalUsers) 中的 foreach ($User
        {
            如果 ($LocalAccounts -inotcontains $User)
            {
                Write-Warning“服务器:'$ ($TargettedServerName) '具有本地帐户'$ ($User) ',此脚本不会更改其密码”
            }
        }

        #For 此服务器上指定的每个本地帐户,请更改密码
        $PasswordIndex = 0
        $LocalAccounts) 中的 foreach ($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 -Property $Properties
                    Write-Output $ReturnData
                }
                抓住
                {
                    Write-Error“更改 server:$ ($TargettedServerName) 上的 user:$ ($LocalAdmin) 的密码时出错”
                }
            }

            $PasswordIndex++
        }
    }

    在运行此脚本的客户端(而不是远程计算机上)上 #Generate 密码。 System.Web.Security 在 .NET 客户端配置文件中不可用。 进行此调用
    运行脚本的客户端上的 # 可确保只有 1 台计算机需要安装 (的完整 .NET 运行时,而不是每个系统都) 滚动密码。
    函数 Create-RandomPassword
    {
        参数 (
            [Parameter (Mandatory=$true) ]
            [ValidateRange (20,120) ]
            [Int]
            $PasswordLength
        )

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

        #This 不应该失败, 但我还是把理智检查在这里
        if ($Password.Length -ne $PasswordLength)
        {
            引发新的异常 (“GeneratePassword 返回的密码长度与所需长度不同。 所需长度:$ ($PasswordLength) 。 生成的长度:$ ($Password.Length) “)
        }

        返回$Password
    }

    #Main 功能 - 生成密码并远程登录到计算机以更改指定的本地帐户的密码
    如果 ($PsCmdlet.ParameterSetName -ieq “Encryption”)
    {
        试用
        {
            $Sha 256 = new-object System.Security.Cryptography.SHA256CryptoServiceProvider
            $SecureStringKey = $Sha 256.ComputeHash ([System.Text.UnicodeEncoding]::Unicode.GetBytes ($EncryptionKey) )
        }
        抓住
        {
            Write-Error“创建 TSV 加密密钥时出错”-ErrorAction Stop
        }
    }

    $ComputerName) 中的 foreach ($Computer
    {
        #Need 为每个可以更改的帐户生成 1 个密码
        $Passwords = @ ()
        对于 ($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)
        {
            如果 ($PsCmdlet.ParameterSetName -ieq “NoEncryption”)
            {
                $Result |Select-Object 用户名、密码、TargettedServerName、RealServerName |Export-Csv -Append -Path $TsvFileName -NoTypeInformation
            }
            else
            {
                #Filters$null返回的条目
                $Result = $Result |Select-Object 用户名、密码、TargettedServerName、RealServerName

                $Result) 中的 foreach ($Record
                {
                    $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 用户名,EncryptedPassword,TargettedServerName,RealServerName |Export-Csv -Append -Path $TsvFileName -NoTypeInformation
                }
            }
        }
    }
}

函数 ConvertTo-CleartextPassword
{
<#
.简介
此函数可用于解密由函数 Invoke-PasswordRoll 加密存储的密码。

函数:ConvertTo-CleartextPassword
作者:Microsoft
版本:1.0

.描述
此函数可用于解密由函数 Invoke-PasswordRoll 加密存储的密码。

.PARAMETER EncryptedPassword

存储在 TSV 文件中的加密密码。

.PARAMETER EncryptionKey

用于进行加密的密码。

.例子

. .\Invoke-PasswordRoll.ps1 #Loads 此脚本文件中的函数
ConvertTo-CleartextPassword -EncryptionKey “Password1” -EncryptedPassword 76492d116743f0423413b16050a5345MgB8AGcAZgBaAHUAaQBwADAAQgB2AGgAcABNADMASwBaAFoAQQBzADEAeABjAEEAPQA9AHwAZgBiAGYAMAA1ADYANgA2ADEANwBkADQAZgAwADMANABjAGUAZQAxAGIAMABiADkANgBiADkAMAA4ADcANwBhADMAYQA3AGYABkADcAMQA5ADQAMwBmAGYANQBhADEAYQBjADcANABkADIANgBhADUANwBlADgAMAAyADQANgA1ADIAOQA0AGMAZQA0ADEAMwAzADcANQAyADUANAAzADYAMAA1AGEANgAzADEAMQA5ADAAYwBmADQAZAA2AGQA”

解密存储在 TSV 文件中的加密密码。

#>
    参数 (
        [Parameter (Mandatory=$true) ]
        [字符串]
        $EncryptedPassword,

        [Parameter (Mandatory=$true) ]
        [字符串]
        $EncryptionKey
    )

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

    [SecureString]$SecureStringPassword = ConvertTo-SecureString -String $EncryptedPassword -Key $SecureStringKey
    Write-Output ([System.Runtime.InteropServices.Marshal]::P trToStringAuto ([System.Runtime.InteropServices.Marshal]::SecureStringToCoTaskMemUnicode ($SecureStringPassword) ) )
}
   管理员可以将本地管理员帐户添加到计算机,方法是创建 Active Directory 组,并通过组策略首选项 -> 本地组将其添加到本地管理员组。 此操作不会缓存凭据。 对话框如下所示。 当用户使用这些凭据登录时,此解决方法确实需要连接到 Active Directory 域服务。

6d3013b5-df8c-898a-0a22-33a829d3755f

方案 2:映射的驱动器

管理员使用驱动器映射向用户分配网络位置。 密码保护功能用于确保对驱动器进行授权访问。 以下首选项将受到影响:

  • 用户配置 -> Windows 设置 -> 驱动器映射 -> 新建 -> 映射驱动器

重要更改

操作:创建、更新或替换

  • 禁用 “用户名”、“ 密码”“确认密码 ”字段。

                 78e7a904-5d9c-8655-e4b6-2d7c8dc3c3f9
                
操作:删除

  • 行为无变化

解决方法

可以使用 Windows 资源管理器管理共享权限并向用户分配权限,而不是使用密码方法进行身份验证。 可以使用 Active Directory 对象来控制对文件夹的权限。

方案 3:服务

可以使用“服务”首选项更改服务属性,使其在原始安全上下文以外的上下文中运行。 以下首选项将受到影响:

  • 计算机配置 -> 控制面板设置 -> 服务 -> 新建 -> 服务

重要更改

启动:无更改、自动或手动

  • 密码”“确认密码 ”字段处于禁用状态。
  • 管理员只能使用内置帐户。

                 bd4e263c-d8e6-e20f-b57a-9c1c5caca355
                
启动:禁用

  • 行为无变化

“新建”对话框

  • 尝试对此帐户使用非内置用户的管理员会收到以下警告:

                 975f73f7-e950-ad09-d46b-b68ac9a5e4cb
                
                
              

解决方法

                
                
服务仍然可以作为本地系统帐户运行。 可以按Microsoft知识库中的以下文章中所述更改服务权限:

256345如何配置组策略设置以设置系统服务的安全性

注意 如果要配置的服务不存在,则必须在运行该服务的计算机上配置设置。 

方案 4:计划任务和即时任务 (高级)

这些用于在特定安全上下文中运行计划任务。 存储计划任务凭据的功能不再可用,以便在该用户未登录时以任意用户身份运行。 以下首选项将受到影响。 (请注意,在某些平台上,“至少 Windows 7”将替换为“Windows Vista 及更高版本”。)

  • 计算机配置 -> 控制面板设置 -> 计划任务 -> 新建 -> 计划任务 (至少 Windows 7)
  • 计算机配置 -> 控制面板设置 -> 计划任务 -> 新建 -> 即时任务 (至少 Windows 7)
  • 用户配置 -> 控制面板设置 -> 计划任务 -> 新建 -> 计划任务 (至少 Windows 7)
  • 用户配置 -> 控制面板设置 -> 计划任务 -> 新建 -> 即时任务 (至少 Windows 7)

重要更改

操作:创建、更新或替换

  • 选择“ 无论用户是否登录都运行 ”选项时,对话框不再提示管理员输入凭据。
  • 禁用“不存储密码检查”框。 默认情况下,还会选中该框。

                 60ff2409-1c24-a2aa-466d-89afaadaf0a0
                
操作:删除

行为无变化

解决方法

对于“计划任务至少 (Windows 7) ”和“立即任务 (至少 Windows 7) ”任务,管理员可以在给定用户登录时使用特定用户帐户。 或者,他们只能以该用户的身份访问本地资源。 这些任务仍然可以在本地服务的上下文中运行。

            
方案 5:计划任务和即时任务 (下层) 这是用于在特定安全上下文中运行计划任务的首选项的下层版本。 存储计划任务凭据的功能不再可用,以便在该用户未登录时以任意用户身份运行。 以下首选项将受到影响:

  • 计算机配置 -> 控制面板设置 -> 计划任务 -> 新建 -> 计划任务
  • 计算机配置 -> 控制面板设置 -> 计划任务 -> 新建 -> Windows XP) (即时任务
  • 用户配置 -> 控制面板设置 -> 计划任务 -> 新建 -> 计划任务
  • 用户配置 -> 控制面板设置 -> 计划任务 -> 新建 -> 即时任务 (Windows XP)

重要更改

操作:创建、更新或替换

  • 运行方式检查”框处于禁用状态。 因此,“ 用户名”、“ 密码”“确认密码” 字段均处于禁用状态。

                 2baacb70-2e5a-e72d-7fd6-3e358608d76c
                
操作:删除

 行为无变化

解决方法

对于“计划任务”和“Windows XP) 的即时任务 (”项,计划任务使用本地服务当前可用的权限运行。 

方案 6:数据源

数据源首选项用于将数据源与计算机或用户相关联。 此功能不再存储凭据以允许访问受密码保护的数据源。 以下首选项将受到影响:

  • 计算机配置 -> 控制面板设置 -> 数据源
  • 用户配置 -> 控制面板设置 -> 数据源

重要更改

操作:创建、更新或替换

  • 禁用 “用户名”、“ 密码”“确认密码” 字段:

                 92beb16c-1b15-8903-a694-f471212d4a45
                
操作:删除

  • 行为无变化

解决方法

没有任何解决方法。 此首选项不再存储凭据以允许访问受密码保护的数据源。 

弃用 CPassword

删除 CPassword

此Microsoft知识库文章中包含的Windows PowerShell脚本检测域是否包含任何可能使用 CPassword 的组策略首选项。 如果在给定的首选项中检测到 CPassword XML,则会在此列表中显示该 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 -path <GPO 备份文件夹路径>

.笔记
如果未找到组策略 PS 模块,则输出将包含 GPO GUID,而不是 GPO 名称。 可以运行
此脚本在域控制器上或在安装 RSAT 和 后在客户端上重新运行脚本
已启用 组策略 模块。
或者,可以使用 GPO GUID 通过 Get-GPO cmdlet 获取 GPO 名称。

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

#>
#----------------------------------------------------------------------------------------------------------------

输入参数

#--------------------------------------------------------------------------------------------------------------
param (
    [string]$Path = $ (引发“-Path 是必需的”。) # GP 所在的目录路径。
 )
#---------------------------------------------------------------------------------------------------------------
$isGPModuleAvailable = $false
$impactedPrefs = { “Groups.xml”, “ScheduledTasks.xml”,“Services.xml”, “DataSources.xml”, “Drives.xml” }
#----------------------------------------------------------------------------------------------------------------

导入组 olicy 模块(如果可用)

#----------------------------------------------------------------------------------------------------------------
如果 (-not (Get-Module -name “GroupPolicy”) )
{
   如果 (Get-Module -ListAvailable |
         Where-Object { $_。Name -ieq “GroupPolicy” })
    {
        $isGPModuleAvailable = $true
        Import-Module“GroupPolicy”
    }
    else
    {
        Write-Warning“无法导入 PowerShell 组策略 模块。 因此,将报告 GPO guid。
                       在 DC 上运行此脚本以获取 GPO 名称,或使用 DC) 上的 Get-GPO cmdlet (从 GPO guid 获取 GPO 名称。”
    }
}
else
{
    $isGPModuleAvailable = $true
}
函数 Enum-SettingsWithCpassword ( [string]$sysvolLocation )
{
    # GPMC 树路径
    $commonPath = “ -> 首选项 -> 控制面板 设置 -> ”
    $driveMapPath = “ -> 首选项 -> Windows 设置 -> ”

    # 递归获取 SYVOL 位置中的所有 xml 文件
    $impactedXmls = Get-ChildItem $sysvolLocation -Recurse -Filter “*.xml” |Where-Object { $impactedPrefs -cmatch $_.Name }

    # 每个 xml 文件包含多个首选项。 循环访问每个首选项,以检查它是否
    # 包含 cpassword 属性并显示它。
    $impactedXmls ) 中的 foreach ( $file
    {
        $fileFullPath = $file。FullName

        # 设置 GPP 类别。 如果文件位于 SYSVOL 中的“计算机”文件夹下
        # 设置是在计算机配置下定义的,否则为
        # 设置是用户配置的
        if ( $fileFullPath.Contains (“Machine”) )
        {
            $category = “计算机配置”
        }
        elseif ( $fileFullPath.Contains (“User”) )
        {
            $category = “用户配置”
        }
        else
        {
            $category = “Unknown”
        }
        # 获取 XML 格式的文件内容
        试用
        {
            [xml]$xmlFile = get-content $fileFullPath -ErrorAction Continue
        }
        catch [异常]{
            Write-Host $_。Exception.Message
        }
        如果 ($xmlFile -eq $null)
        {
            继续
        }
        switch ( $file。BaseName )
        {
            组
            {
                $gppWithCpassword = $xmlFile.SelectNodes (“Groups/User”) |where-Object { [String]::IsNullOrEmpty ($_。Properties.cpassword) -eq $false }
                $preferenceType = “本地用户”
            }
            ScheduledTasks
            {
                $gppWithCpassword = $xmlFile.SelectNodes (“ScheduledTasks/*”) |where-Object { [String]::IsNullOrEmpty ($_。Properties.cpassword) -eq $false }
                $preferenceType = “计划任务”
            }
            DataSources
            {
                $gppWithCpassword = $xmlFile.SelectNodes (“DataSources/DataSource”) |where-Object { [String]::IsNullOrEmpty ($_。Properties.cpassword) -eq $false }
                $preferenceType = “数据源”
            }
            驱动器
            {
                $gppWithCpassword = $xmlFile.SelectNodes (“驱动器/驱动器”) |where-Object { [String]::IsNullOrEmpty ($_。Properties.cpassword) -eq $false }
                $preferenceType = “驱动器映射”
            }
            服务
            {
                $gppWithCpassword = $xmlFile.SelectNodes (“NTServices/NTService”) |where-Object { [String]::IsNullOrEmpty ($_。Properties.cpassword) -eq $false }
                $preferenceType = “Services”
            }
            默认
            { # clear gppWithCpassword 和 preferenceType for next item.
                试用
                {
                    Clear-Variable -Name gppWithCpassword -ErrorAction SilentlyContinue
                    Clear-Variable -Name preferenceType -ErrorAction SilentlyContinue
                }
                catch [异常]{}
            }
        }
        如果 ($gppWithCpassword -ne $null)
        {
            # 从 filePath 提取的 GUID 生成 GPO 名称
            $guidRegex = [regex]“\{ (.*) \}”
            $match = $guidRegex.match ($fileFullPath)
            如果为 ($match,则为 。成功)
            {
               $gpoGuid = $match.groups[1].value
               $gpoName = $gpoGuid
            }
            else
            {
               $gpoName = “Unknown”
            }
            如果 ($isGPModuleAvailable -eq $true)
            {
                试用
                {
                    $gpoInfo = Get-GPO -Guid $gpoGuid -ErrorAction Continue
                    $gpoName = $gpoInfo.DisplayName
                }
                catch [异常] {
                    Write-Host $_。Exception.Message
                }
            }
            # 显示包含 cpassword 的预频数
            $gppWithCpassword ) 中的 foreach ( $gpp
            {
                如果 ( $preferenceType -eq “驱动器映射” )
                {
                    $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。名称) -passthru |
                       Add-Member -MemberType NoteProperty -name Path -value ($prefLocation)
                Write-Output $obj
            }
        } # 如果$gppWithCpassword,则结束
    } # end foreach $file
} # end functions Enum-PoliciesWithCpassword
#-----------------------------------------------------------------------------------

检查 Path 是否有效。 枚举包含 cpassword 的所有设置。

#-----------------------------------------------------------------------------------
如果 (Test-Path $Path )
{
    Enum-SettingsWithCpassword $Path
}
else
{
    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