2015 年 12 月 18 日更新:在正在配置的节点上安装 2015 年 12 月 17 日发布的 Windows Management Framework (WMF) 5.0 RTM 版本将解决此错误。WMF 5.0 可以在这里下载。
MS 已更改 PSDesiredStateConfiguration 中的 Get-EncryptedPassword 函数,以生成 MOF 中密码字段的新格式。如果未升级 WMF 以支持密码,这将防止 DSC 节点解密密码。但由于 MS 尚未发布更新以允许 WMF 读取这种新格式,因此这应该被视为完全损坏的版本。
我设法找到了解决方法:将 PSDesiredStateConfiguration 模块从 10586 之前的机器(例如带有最新 WMF 5.0 的 Windows Server 2012 R2)复制到 Built 10586 机器上的 PowerShell 模块文件夹。
例如
,将 C:\Windows\System32\WindowsPowerShell\v1.0\Modules\PSDesiredStateConfiguration 文件夹替换为旧版本
注意:您需要拥有此文件夹的所有权并授予自己写入权限,因为默认情况下只有 TrustedInstaller 可以写入此文件夹。
就我而言,此版本的 PSDesiredStateConfiguration 已完全损坏,最好将其回滚,直到 MS 可以修复它。这还将修复一些其他报告的问题(模块版本、新证书策略要求)。
仅供参考,这是更改凭据加密的更改代码:
PSDesiredStateConfiguration.psm1 中的旧代码:
# Cast the public key correctly
$rsaProvider = [System.Security.Cryptography.RSACryptoServiceProvider]$cert.PublicKey.Key
# Convert to a byte array
$keybytes = [System.Text.Encoding]::UNICODE.GetBytes($Value)
# Add a null terminator to the byte array
$keybytes += 0
$keybytes += 0
try
{
# Encrypt using the public key
$encbytes = $rsaProvider.Encrypt($keybytes, $false)
# Reverse bytes for unmanaged decryption
[Array]::Reverse($encbytes)
# Return a string
[Convert]::ToBase64String($encbytes)
}
catch
{
if($node)
{
$errorMessage = $LocalizedData.PasswordTooLong -f $node
}
else
{
$errorMessage = $LocalizedData.PasswordTooLong -f 'localhost'
}
$exception = New-Object -TypeName System.InvalidOperationException -ArgumentList $errorMessage
Write-Error -Exception $exception -Message $errorMessage -Category InvalidOperation -ErrorId PasswordTooLong
Update-ConfigurationErrorCount
}
PSDesiredStateConfiguration.psm1 中的新代码:
# Encrypt using the public key
$encMsg =Protect-CmsMessage -To $CmsMessageRecipient -Content $Value
# Reverse bytes for unmanaged decryption
#[Array]::Reverse($encbytes)
#$encMsg = $encMsg -replace '-----BEGIN CMS-----',''
#$encMsg = $encMsg -replace "`n",''
#$encMsg = $encMsg -replace '-----END CMS-----',''
return $encMsg