我认为 DSC 选择用于凭证加密的证书文件的方式存在错误,例如服务资源和 PSCredential。
如果节点名称包含在后续节点名称中(节点顺序很重要),则 DSC 配置会使用来自 AllNodes 集合的错误证书文件。这意味着发送到节点的加密值可能是错误的。
以下是包含两个测试的重现。两个测试都应该失败,但第一个测试成功(使用错误的证书):
$password = ConvertTo-SecureString "password" -AsPlainText -Force
$serviceCredential = New-Object System.Management.Automation.PSCredential ("username", $password)
$currentPath = Split-Path -Parent $MyInvocation.MyCommand.Definition
$thisShouldNotWork = @{
AllNodes = @(
@{
NodeName = "web1"
CertificateFile = "nonexistentfile"
},
@{
NodeName = "customerweb1"
CertificateFile = "$currentPath\mycert.cer"
}
);
}
$thisDoesNotWork = @{
AllNodes = @(
@{
NodeName = "web1"
CertificateFile = "nonexistentfile"
},
@{
NodeName = "customerweXb1"
CertificateFile = "$currentPath\mycert.cer"
}
);
}
Configuration DscWebServer
{
Node $AllNodes.NodeName
{
Service "Service Started"
{
Name = "MyService"
State = "Running"
Credential = $serviceCredential
}
}
}
Write-Host "Test 1" -ForegroundColor Blue -BackgroundColor White
DscWebServer -OutputPath .\DSC -ConfigurationData $thisShouldNotWork
Write-Host "Test 2" -ForegroundColor Blue -BackgroundColor White
DscWebServer -OutputPath .\DSC -ConfigurationData $thisDoesNotWork
我已经报告了此事连接但我想在这里提出这个问题,以防它有帮助,或者我所做的事情有什么不寻常的地方。有人能解释这种行为吗?
更新:微软确认这是一个错误,并于 2015 年 5 月修复了它。我收到了这样的反馈:“这个问题已经在 WMF5 四月预览版中修复了。如果您有不同意见,请告诉我们 :)”
答案1
这很有趣。您能确认每个测试的输出是什么吗?测试 2 实际上会引发异常吗?
我不会说你所做的事情有什么不寻常的,因为 DSC 就是为以这种方式处理多个节点而设计的,但仍然只有少数人使用 DSC,而使用安全凭证的人就更少了。
此外,我认为我们很多人一直对每个节点使用单一配置,这可以防止出现这种行为。
这当然对您来说也是一个可行的解决方法,但需要改变您的工作流程。
要使用现有的配置数据,您可以像这样解决该问题:
foreach($node in $thisShouldNotWork.AllNodes) {
DscWebServer -OutputPath .\DSC -ConfigurationData @{AllNodes = @($node)}
}
如果可能的话,我将在明天尝试重现此问题,以便我可以将我的投票和重现描述添加到连接报告中。