简介
Microsoft 已发布安全公告 MS14-025。若要了解有关此安全公告的更多信息:
-
家庭用户:
http://www.microsoft.com/zh-cn/security/pc-security/updates.aspx跳过详细信息:立即从 Microsoft Update 网站为您的家庭计算机或便携式计算机下载更新:
-
IT 专业人员:
https://technet.microsoft.com/zh-CN/library/security/ms14-025
如何获取此安全更新程序的帮助和支持
有关安装更新的帮助:
Microsoft 更新支持
IT 专业人员安全解决方案:
TechNet 安全疑难解答和支持
帮助保护您基于 Windows 的计算机不受病毒和恶意软件危害:
病毒解决方案和安全中心
基于国家/地区的本地支持:
国际支持
更多信息
有关此安全更新的已知问题和其他信息
下列文章包含此安全更新针对具体产品版本的其他信息。文章可能包含已知问题信息。如果是这样,已知问题会在每个文章链接的下方列出。
组策略首选项
概述
某些组策略首选项可以存储密码。此功能将被删除,因为通过这种方式存储的密码不安全。本文介绍了用户界面更改和任何可用的解决办法。
以下组策略首选项将不再允许保存用户名和密码:
-
驱动器映射
-
本地用户和组
-
计划任务
-
服务
-
数据源
这将影响环境中依赖于这些首选项中包含的密码的任何现有组策略对象 (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),或从已安装远程服务器管理工具的客户端进行操作。在这些控制台上,您可以通过五个步骤删除任意首选项。为此,请按照下列步骤操作:
-
在 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 |