2

最新的 windows 10 版本推出了更新版本的 powershell (10586)。

除了https://dscottraynsford.wordpress.com/2015/11/15/windows-10-build-10586-powershell-problems/中记录的证书所需的更改之外,我似乎还有一个问题,同时尝试应用配置:

警告消息 应用部分配置 [PartialConfiguration]ExternalIntegrationConfiguration 时发生错误。错误消息是:解密失败..

使用相同的证书,我可以使用 build 10.0.10240.16384 成功创建 MOF,并成功应用它。因此,查看两个 MOF 之间的差异,我发现 build 10586 构建的 MOF 如下所示:

instance of MSFT_Credential as $MSFT_Credential6ref
{
Password = "-----BEGIN CMS-----
    \nBase64 encrypted
\n-----END CMS-----";
UserName = "SomeUser";
};

而不是过去在构建(10.0.10240.16384)中的样子:

instance of MSFT_Credential as $MSFT_Credential6ref
{
Password = "Base64 encrypted";
UserName = "SomeUser";
};

所以内容不一样。我确实检查了是否可以使用 Get-CmsMessage 和 unprotect-CmsMessage 解密凭据,并且可以。所以公钥/私钥的东西似乎很好。

是否应该对正在应用配置的机器进行更新?我没有看到任何新的 powershell 版本。

任何想法,将不胜感激。

4

1 回答 1

1

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
于 2015-12-03T06:53:08.200 回答