Desired State Configuration (DSC) 已知问题和限制
重大更改:DSC 配置中用于对密码进行加密/解密的证书在安装 WMF 5.0 RTM 后可能失效
在 WMF 4.0 和 WMF 5.0 预览版本中,DSC 不允许配置中的密码长度超过 121 个字符。 尽管使用较长的强密码更好,但 DSC 强制使用短密码。 此项重大更改使 DSC 配置中的密码可为任意长度。
解决方法: 使用数据加密或密钥加密密钥用法和文档加密增强型密钥用法 (1.3.6.1.4.1.311.80.1) 重新创建证书。 有关详细信息,请参阅 Protect-CmsMessage。
安装 WMF 5.0 RTM 后 DSC cmdlet 可能失败
安装 WMF 5.0 RTM 后,Start-DscConfiguration
和其他 DSC cmdlet 可能失败并出现以下错误:
LCM failed to retrieve the property PendingJobStep from the object of class dscInternalCache .
+ CategoryInfo : ObjectNotFound: (root/Microsoft/...gurationManager:String) [], CimException
+ FullyQualifiedErrorId : MI RESULT 6
+ PSComputerName : localhost
解决方法: 通过在提升的 PowerShell 会话中运行以下命令(以管理员身份运行)来删除 DSCEngineCache.mof:
Remove-Item -Path $env:SystemRoot\system32\Configuration\DSCEngineCache.mof
如果在 WMF 5.0 生产预览版的基础上安装 WMF 5.0 RTM,DSC cmdlet 可能失效
解决方法: 在提升的 PowerShell 会话中运行以下命令(以管理员身份运行):
mofcomp $env:windir\system32\wbem\DscCoreConfProv.mof
在 DebugMode 中使用 Get-DscConfiguration 时,LCM 可能进入不稳定状态
如果 LCM 处于 DebugMode,按 CTRL+C 来停止 Get-DscConfiguration
处理可能导致 LCM 进入不稳定状态,从而导致大部分 DSC cmdlet 失效。
解决方法: 调试 Get-DscConfiguration
cmdlet 时,不要按 CTRL+C。
在 DebugMode 中,Stop-DscConfiguration 可能不响应
如果 LCM 处于 DebugMode,则试图停止由 Get-DscConfiguration
启动的操作时,Stop-DscConfiguration
可能不响应
解决方法: 按调试 DSC 资源中所述完成由 Get-DscConfiguration
所启动操作的调试。
DebugMode 中不显示详细错误消息
如果 LCM 处于 DebugMode ,DSC 资源中将不显示详细错误消息。
解决方法: 禁用 DebugMode 以从资源中查看详细消息
Get-DscConfigurationStatus cmdlet 无法检索 Invoke-DscResource 操作
使用 Invoke-DscResource
cmdlet 直接调用资源的方法后,将无法再通过 Get-DscConfigurationStatus
检索此类操作的记录。
解决方法: 无。
Get-DscConfigurationStatus 将请求周期操作返回为 Consistency 类型
将节点设置为 PULL 刷新模式时,对于所执行的每个请求操作,Get-DscConfigurationStatus
cmdlet 会将操作类型报告为 Consistency 而不是 Initial
解决方法: 无。
Invoke-DscResource cmdlet 不按生成消息的顺序返回消息
Invoke-DscResource
cmdlet 不按 LCM 或 DSC 资源生成详细、警告和错误消息的顺序返回这些消息。
解决方法: 无。
与 Invoke-DscResource 一起使用时,无法轻松调试 DSC 资源
LCM 在调试模式下运行时,Invoke-DscResource
cmdlet 不会给出有关连接到运行空间以进行调试的信息。 有关详细信息,请参阅调试 DSC 资源。
解决方法: 使用 cmdlet Get-PSHostProcessInfo
、Enter-PSHostProcess
、Get-Runspace
和 Debug-Runspace
发现并连接到运行空间以调试 DSC 资源。
# Find all the processes hosting PowerShell
Get-PSHostProcessInfo
ProcessName ProcessId AppDomainName
----------- --------- -------------
powershell 3932 DefaultAppDomain
powershell_ise 2304 DefaultAppDomain
WmiPrvSE 3396 DscPsPluginWkr_AppDomain
# Enter the process that is hosting DSC engine (WMI process with DscPsPluginWkr_Appdomain)
Enter-PSHostProcess -Id 3396 -AppDomainName DscPsPluginWkr_AppDomain
# Find all the available rusnspaces in that process
Get-Runspace
Id Name ComputerName Type State Availability
-- ---- ------------ ---- ----- ------------
2 Runspace2 localhost Local Opened InBreakpoint
5 RemoteHost localhost Local Opened Busy
# Debug the runspace that is in **InBreakpoint** availability state
Debug-Runspace -Id 2
同一节点的各部分配置文档不能具有相同的资源名称
对于部署到单个节点上的多个部分配置,相同的资源名称可能导致运行时错误。
解决方法: 即使对不同部分配置中的相同资源也使用不同的名称。
Start-DscConfiguration –UseExisting 不可与 -Credential 一起使用
使用具有 UseExisting 参数的 Start-DscConfiguration
时,将忽略 Credential 参数 。 DSC 使用默认进程标识继续执行操作。 当需要其他凭据才可在远程节点上继续执行时,这将导致错误。
解决方法: 使用 CIM 会话进行远程 DSC 操作:
$session = New-CimSession -ComputerName $node -Credential $credential
Start-DscConfiguration -UseExisting -CimSession $session
将 IPv6 地址作为 DSC 配置中的节点名称
此版本中不支持将 IPv6 地址作为 DSC 配置脚本中的节点名称。
解决方法: 无。
调试 Class-Based
DSC 资源
此版本中不支持调试基于类的 DSC 资源。
解决方法: 无。
在多次调用 DSC 资源之间,将不保留在 DSC 基于类的资源中 $script 作用域内定义的变量和函数
如果配置使用任何基于类的资源,而该资源包含在 $script
作用域内定义的变量或函数,则对 Start-DSCConfiguration
的多个连续调用将失败。
解决方法: 在 DSC 资源类本身中定义所有变量和函数。 没有 $script
作用域的变量/函数。
在资源使用 PSDscRunAsCredential 时进行 DSC 资源调试
在此版本中,当资源使用配置中的 PSDscRunAsCredential 属性时,不支持进行 DSC 资源调试。
解决方法: 无。
不支持将 PsDscRunAsCredential 用于 DSC 复合资源
解决方法: 尽可能使用 Credential 属性。 示例 ServiceSet 和 WindowsFeatureSet
Get-DscResource -Syntax 不能正确地反映 PsDscRunAsCredential
当资源将 Syntax 参数标记为强制使用或不支持它时,它将不能正确地反映 PsDscRunAsCredential 。
解决方法: 无。 但是,使用 IntelliSense 时,在 ISE 中创作配置可以反映关于 PsDscRunAsCredential 属性的正确元数据。
WindowsOptionalFeature 在 Windows 7 中不可用
WindowsOptionalFeature DSC 资源在 Windows 7 中不可用。 此资源需要 DISM 模块以及在 Windows 8 和更新版 Windows 操作系统中开始提供的 DISM cmdlet。
对于基于类的 DSC 资源,Import-DscResource -ModuleVersion 可能未按预期运行
如果编译节点具有多个版本的基于类的 DSC 资源模块,Import-DscResource -ModuleVersion
不会获取指定版本,并导致产生以下编译错误。
ImportClassResourcesFromModule : Exception calling "ImportClassResourcesFromModule" with "3" argument(s):
"Keyword 'MyTestResource' already defined in the configuration."
At C:\Windows\system32\WindowsPowerShell\v1.0\Modules\PSDesiredStateConfiguration\PSDesiredStateConfiguration.psm1:2035 char:35
+ ... rcesFound = ImportClassResourcesFromModule -Module $mod -Resources $r ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [ImportClassResourcesFromModule], MethodInvocationException
+ FullyQualifiedErrorId : PSInvalidOperationException,ImportClassResourcesFromModule
解决方法: 通过定义 ModuleSpecification 对象将所需版本导入到 ModuleName 参数,RequiredVersion 密钥按如下所示指定:
Import-DscResource -ModuleName @{ModuleName='MyModuleName';RequiredVersion='1.2'}
一些 DSC 资源,如注册表资源可能开始需要较长时间处理请求。
解决方法 1: 创建定期清理以下文件夹的计划任务。
$env:windir\system32\config\systemprofile\AppData\Local\Microsoft\Windows\PowerShell\CommandAnalysis
解决方法 2: 更改 DSC 配置以在配置结束时清理 CommandAnalysis 文件夹。
Configuration $configName
{
# User Data
Registry SetRegisteredOwner
{
Ensure = 'Present'
Force = $True
Key = $Node.RegisteredKey
ValueName = $Node.RegisteredOwnerValue
ValueType = 'String'
ValueData = $Node.RegisteredOwnerData
}
#
# Script to delete the config
#
script DeleteCommandAnalysisCache
{
DependsOn = "[Registry]SetRegisteredOwner"
getscript = "@{}"
testscript = 'Remove-Item -Path $env:windir\system32\config\systemprofile\AppData\Local\Microsoft\Windows\PowerShell\CommandAnalysis -Force -Recurse -ErrorAction SilentlyContinue -ErrorVariable ev | out-null;$true'
setscript = '$true'
}
}