預期狀態設定 (DSC) 的已知問題和限制
重大變更:用來加密/解密 DSC 設定密碼的憑證,在安裝 WMF 5.0 RTM 之後可能無法運作
在 WMF 4.0 和 WMF 5.0 Preview 版本中,DSC 不允許組態中的密碼長度超過 121 個字元。 DSC 已強制使用短密碼,即使需要冗長的強式密碼亦同。 這項重大變更允許 DSC 組態中的密碼為任意長度。
解決方案: 以 [資料編密] 或 [金鑰編密] 的金鑰使用方式,與 [文件加密增強] 金鑰使用方式 (1.3.6.1.4.1.311.80.1) 重新建立憑證。 如需詳細資訊,請參閱 Protect-CmsMessage。
DSC Cmdlet 在安裝 WMF 5.0 RTM 之後可能會失敗
Start-DscConfiguration
和其他 DSC Cmdlet 可能會在安裝 WMF 5.0 RTM 之後失敗,並傳回下列錯誤:
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 RTM 安裝在 WMF 5.0 Production Preview 之上,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。
Stop-DscConfiguration 在 DebugMode 中可能不會回應
如果 LCM 處於 DebugMode,則嘗試停止 Get-DscConfiguration
所啟動的作業時,Stop-DscConfiguration
可能不會回應
解決方案: 完成對 Get-DscConfiguration
所啟動的作業進行偵錯,如偵錯 DSC 資源中所述。
在 DebugMode 中不顯示詳細的錯誤訊息
如果 LCM 處於 DebugMode,則 DSC 資源不會顯示詳細的錯誤訊息。
解決方案: 停用 DebugMode 以查看資源中的詳細訊息
DscConfigurationStatus Cmdlet 無法擷取 Invoke-DscResource 作業
使用 Invoke-DscResource
Cmdlet 直接叫用任何資源的方法之後,就無法透過 Get-DscConfigurationStatus
擷取這類作業的記錄。
解決方案: 無。
Get-DscConfigurationStatus 傳回提取循環作業,作為類型一致性
將節點設定為 PULL 重新整理模式時,對於每個執行的提取作業,Get-DscConfigurationStatus
Cmdlet 會將作業類型報告為一致性,而非「初始」 。
解決方案: 無。
Invoke-DscResource Cmdlet 不會以這些作業所產生的順序傳回訊息
Invoke-DscResource
Cmdlet 不會以 LCM 或 DSC 資源產生它們的順序來傳回詳細資訊、警告和錯誤訊息。
解決方案: 無。
以 Invoke-DscResource 使用 DSC 資源時,無法輕易偵錯 DSC 資源
當 LCM 在偵錯模式中執行時,Invoke-DscResource
Cmdlet 不會提供要連線以進行偵錯的 Runspace 相關資訊。 如需詳細資訊,請參閱偵錯 DSC 資源。
解決方案: 使用 Get-PSHostProcessInfo
、Enter-PSHostProcess
、Get-Runspace
及 Debug-Runspace
Cmdlet 來探索並附加至 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 會使用預設處理序身分識別,繼續作業; 而如果在遠端節點上繼續作業時需要不同的認證,這樣做會導致錯誤。
解決方案: 使用遠端 DSC 作業的 CIM 工作階段︰
$session = New-CimSession -ComputerName $node -Credential $credential
Start-DscConfiguration -UseExisting -CimSession $session
以 IPv6 位址作為 DSC 組態中的節點名稱
在此版本中,不支援以 IPv6 位址作為 DSC 組態指令碼中的節點名稱。
解決方案: 無。
對 Class-Based
DSC 資源進行偵錯
在此版本中,不支援以類別為基礎的 DSC 資源偵錯。
解決方案: 無。
在 DSC 以類別為基礎之資源的 $script 範圍中定義的變數和函式,不會在對 DSC 資源的多個呼叫之間保留
如果設定使用任何以類別為基礎的資源,且該資源具有 $script
範圍中定義的變數或函式時,對 Start-DSCConfiguration
的多個連續呼叫將會失敗。
解決方案: 在 DSC 資源類別本身中定義所有變數和函式。 沒有 $script
範圍變數/函式。
當資源正在使用 PSDscRunAsCredential 時偵錯 DSC 資源
在此版本中,當資源正在使用設定中的 PSDscRunAsCredential 屬性時,不支援 DSC 資源偵錯。
解決方案: 無。
對於 DSC 複合資源不支援 PsDscRunAsCredential
解決方案: 使用 Credential 屬性 (如果有的話)。 範例 ServiceSet 和 WindowsFeatureSet
Get-DscResource-Syntax 並未正確反映 PsDscRunAsCredential
當資源將 PsDscRunAsCredential 標記為強制或不支援它時,Syntax 參數就不會正確反映它。
解決方案: 無。 不過,使用 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'
}
}