Desired State Configuration: Cannot bind argument to parameter ‘ResourceKey’ because it is an empty string

Applies To: PowerShell Version: 5.0.10240.16384, xComputerManagement 1.2.2, 1.3.0

I was working on a DSC Configuration to build a Hyper-V host, when I encountered the error shown below.

So, that’s a pretty awesome error, and not one that I can say that I have seen before. I did A LOT of troubleshooting to figure out what was going on (which in the interests of time and space I am going to skip over) and we will get right to the good stuff.

My Configuration had some string parameters that were not assigned any values in the Configuration, or when I was creating the .mof files. Let’s pretend the Configuration looks like the one below. If you just copy and paste and run this, it is going to fail with the error above.

If you remove the section for xComputerManagement, it will work just fine. Also, if you hard code a value into the parameter $ComputerName in the Configuration, or pass it in when you build the Configuration (I have shown both ways below), it will also not error and will work the way you would expect it to.

So, the next question is, why is this? Thankfully, the answer is in the error message once you figure it out. The Name parameter of the DSC resource is the Key value of the resource, and as such it cannot be an empty string (which completely makes sense). It doesn’t throw the error for the File resource, because it’s key value is DestinationPath, which in my example I have coded in as an actual value. How can you tell what the Key property of a DSC Resource is? Look at the example below! Key properties are Mandatory parameters, and as such are shown without being enclosed in square brackets. You can also open up and look at the schema.mof file for the resource which will show you that information as well.

To further illustrate the point, if I run the Configuration below, it is also going to error out.

Warning: Unable to find package provider ‘PSModule’ on Windows 10

Running Windows 10 Enterprise Preview Build 5.0.10158.0

When I run Find-Module, I receive the error message in the screenshot below.
CIX7pMsWEAAgUqK

After bashing my face against the problem for a while, I got some help from Ben Gelens, who provided the answer on how to fix the problem:

Get-PackageProvider -Name PSModule -ForceBootstrap

Once that is done, close and reopen the ISE (or the Console host) and you are good to go!

Unexpected Token ‘}’ in Expression or Statement when using $AllNodes in a Desired State Configuration

I was working on testing a custom DSC Resource when I came across a very strange issue. Whenever I tried to build a Configuration like the one below, it failed.

First Configuration:
$ConfigData =@{
    AllNodes = @(
        @{
            NodeName = '*'
            PSDSCAllowPlainTextPassword = $True
          }
    )

}

Configuration TestConfig{

    Import-DscResource -ModuleName @{ModuleName="xComputerManagement";ModuleVersion="1.3.0"}

    Node $AllNodes.Nodename{

        xComputer Test{
            Name = "MYPC"
        }

    }

}  

Under the very last curly brace there was a red squiggly line. When I tried to build the Configuration it failed with the error:

Unexpected token '}' in expression or statement.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : UnexpectedToken

It took me nearly an hour and a half to figure out what was causing the issue. Here is the working Configuration. Can you spot the difference?

$ConfigData =@{
    AllNodes = @(
        @{
            NodeName = '*'
            PSDSCAllowPlainTextPassword = $True
          }
    )

}

Configuration TestConfig{

    Import-DscResource -ModuleName @{ModuleName="xComputerManagement";ModuleVersion="1.3.0"}

    Node $AllNodes.NodeName {

        xComputer Test{
            Name = "MYPC"
        }

    }

}  

If you can’t spot the difference, the only difference is that in the second example, there is a space between $AllNodes.NodeName and the curly brace beginning the Node block. As you can imagine I have a serious problem with this, and believe this to be a bug. You will notice that I don’t need a space between the name of the Configuration and the curly brace, so why should I need a space after $AllNodes.NodeName? Also, in the next example, if I change $AllNodes.NodeName to Node MYPC, it doesn’t require a space between the node name and the curly brace either.

Configuration TestConfig{

    Import-DscResource -ModuleName @{ModuleName="xComputerManagement";ModuleVersion="1.3.0"}

    Node MYPC{

        xComputer Test{
            Name = "MYPC"
        }

    }

}  

All of this testing was done on Windows 10 Enterprise Preview edition with PowerShell Version 5.0.10158.0 . If you also believe this is a bug and should be fixed, vote up the issue on connect here.