使用 Microsoft 登录
登录或创建帐户。
你好,
使用其他帐户。
你有多个帐户
选择要登录的帐户。

简介

Microsoft 已发布安全公告 MS14-025。若要了解有关此安全公告的更多信息:

如何获取此安全更新程序的帮助和支持


有关安装更新的帮助:
Microsoft 更新支持

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

帮助保护您基于 Windows 的计算机不受病毒和恶意软件危害:
病毒解决方案和安全中心

基于国家/地区的本地支持:
国际支持

更多信息

有关此安全更新的已知问题和其他信息

下列文章包含此安全更新针对具体产品版本的其他信息。文章可能包含已知问题信息。如果是这样,已知问题会在每个文章链接的下方列出。

  • 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 文件中的帐户密码进行加密,以确保不会将明文帐户密码写入磁盘中。
可以使用此文件中的另一个函数对加密密码进行解密:

.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”中的所有计算机。如果系统中存在本地帐户“administrator”和/或“CustomLocalAdmin”,它们的密码将更改
为长度为 20(默认值)的随机生成密码。用户名/密码/服务器组合存储在 LocalAdminCredentials.tsv 中,且使用密码“Password1”对帐户密码进行 AES 加密。

.EXAMPLE

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

连接到存储在文件“computerlist.txt”中的所有计算机。如果系统中存在本地帐户“administrator”,则其密码将更改为
长度为 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 中指定的每台计算机上执行
$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++
}
}


#在运行此脚本的客户端上生成密码,而非在远程计算机上。.NET 客户端配置文件中不提供 System.Web.Security。在运行此脚本的
客户端上进行此调用可确保只有 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
此函数可用于对通过函数 Invoke-PasswordRoll 实现加密存储的密码进行解密。

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

.DESCRIPTION
此函数可用于对通过函数 Invoke-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 字节 AES)。
因此,我们建议您不要在域环境中部署此类首选项,并删除任何现有的
首选项。此脚本旨在帮助管理员在包含密码的域 SYSVOL 中找到 GP 首选项。

.DESCRIPTION
此脚本应在随 RSAT 一起安装的 DC 或客户端计算机上运行,然后才能打印包含密码
以及 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 并
启用组策略模块后,您可以在域控制器上运行此脚本,也可以
在客户端上重新运行脚本。
或者,您可以通过 Get-GPO cmdlet 使用 GPO GUID 获取 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 中的“Machine”文件夹下,
# 则将在计算机配置下定义设置,否则,
# 该设置将是用户配置
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)
{
# 根据从文件路径提取的 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
}
} # end if $gppWithCpassword
} # end foreach $file
} # end functions 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,以清理整个环境。当检测脚本返回零结果时,您的工作就完成了。

文件名称

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


需要更多帮助?

需要更多选项?

了解订阅权益、浏览培训课程、了解如何保护设备等。

社区可帮助你提出和回答问题、提供反馈,并听取经验丰富专家的意见。

此信息是否有帮助?

你对语言质量的满意程度如何?
哪些因素影响了你的体验?
按“提交”即表示你的反馈将用于改进 Microsoft 产品和服务。 你的 IT 管理员将能够收集此数据。 隐私声明。

谢谢您的反馈!

×