Get-DscConfiguration:无法将“...”类型的对象强制转换为“...”

时间:2016-05-10 20:00:33

标签: powershell dsc

我写了两个自己的DSC资源。当我在运行PowerShell 4且使用其中一种资源的计算机上调用Get-DscConfiguration时(PowerShell 5不受影响,我会收到以下错误:

  

Get-DscConfiguration:无法将“System.Management.Automation.SwitchParameter”类型的对象强制转换为类型   'System.IConvertible'

  

Get-DscConfiguration:无法将类型为“System.String”的对象强制转换为类型   'Microsoft.Management.Infrastructure.Native.InstanceHandle'。

发生了什么事?什么是DSC试图转换以及如何让这个错误消失?

1 个答案:

答案 0 :(得分:0)

当资源的Get-TargetResource函数返回的哈希表中的值类型不匹配或无法隐式转换为资源的MOF中定义的类型时,会发生这种情况。

我的第一个DSC资源的MOF声明了这个属性:

[Write]
boolean CaseSensitive;

我的Get-TargetResource函数声明了Switch参数:

[Switch]
# The INI file being modified is case-sensitive.
$CaseSensitive,

这样就回来了:

return @{
            # snip 
            CaseSensitive = $CaseSensitive;
        }

解决方案是自己投射开关:

return @{
            # snip 
            CaseSensitive = [bool]$CaseSensitive;
        }

我的第二个资源的MOF声明了PSCredential属性:

[Write,
 EmbeddedInstance("MSFT_Credential")] 
string TaskCredential;

我的Get-TargetResource函数声明这是一个PsCredential对象:

[Management.Automation.PSCredential]
# The principal the task should run as. Use `Principal` parameter to run as a built-in security principal. Required if `Interactive` or `NoPassword` switches are used.
$TaskCredential,

默认情况下,此属性作为空字符串返回:

$resource = @{
                 TaskCredential = '';
             }

解决方案是将TaskCredential的默认值设置为$null

$resource = @{
                 TaskCredential = $null;
             }