Why Should I Attend the PowerShell Summit?

Starting last fall for the European PowerShell Summit and this year for the North America PowerShell Summit all the session recordings are available on YouTube. Because of that you may be asking yourself “Why should I go to the Summit when I can just watch everything online?”. Here are ten reasons, in no particular order other than the order in which my brain dumped them out.

  1. You get direct interaction with the product team. And I am not talking about members of the PowerShell team sitting in a corner not interacting with anyone.  They are there to get as much feedback as possible, learn how people are using it, and to directly interact with members of the community.  This isn’t the Microsoft of 10 years ago or two years ago.  When they say they want your feedback (and not just the good stuff) they absolutely mean it.  Special thanks to Lee Holmes, Michael Greene, Joey Aiello, Angel Calvo, Hemant Mahawar, and Kenneth Hansen for making the trip out to Charlotte.
  2. I don’t care how much you interact with other members of the community over Twitter, Email, Google Hangouts, whatever.  There is no substitute for meeting people face to face, shaking their hand and getting to know something about them besides how they use PowerShell.
  3. And combining #1 and #2, you also get to talk to (and listen to) people talk about how they have solved problems using PowerShell, and what their thought process was around creating that solution. You can then ask people, I have this problem, what would you do to solve it?  One of those conversations alone is worth the price of admission.
  4. You get to watch Mike Robbins “harass” Rohn Edwards all week by telling everyone how great his sessions are going to be and how everyone needs to go to them.  By all accounts they were awesome.
  5. You get to see the look on Dave Wyatt’s face Microsoft announces that “his code” (Pester) is shipping with the next version of Windows Server
  6. You get to have Steven Murawski answer your questions about creating Custom DSC Resources while you are creating them
  7. You get a free Chef T-Shirt, courtesy of Steve.
  8. You get awesome Nano Server and PowerShell stickers courtesy of the one and only Jeffrey Snover.
  9. You get to watch Jason Helmick live and in person talk about how he has his depends on.
  10. You end up finding a bug in Class based DSC Resources that you only found because you participated in the DSC Resource hack-a-thon at the PowerShell Summit.  So make sure you vote on that!
  11. Bonus!  Jeff Hicks gives you a signed PowerShell Deep Dives book and a 30 day Pluralsight subscription to give away at your next user group meeting.
  12. Bonus!  You get to watch Jeffrey Snover demonstrate and talk about a bunch of stuff I can’t repeat or talk about upon fear of death :).
  13. Bonus!  You get to talk to (and listen) to June Blender talk about PowerShell, PowerShell Help, and writing.  Her passion and knowledge around those topics is unbelievable.
  14. Bonus!  You learn how little you really know about PowerShell.  This is a good thing!  This is also something I relearn on a nearly daily basis.

I was also asked by Josh Duffney on Twitter what I thought were some of the “must watch” videos from the Summit.  The lame answer is “everything”, but that’s also not realistic.  If you put a gun to my head and said “you have to pick 7 sessions” here are the 7 I would pick (no particular order).  All the Summit videos can be found in this playlist on YouTube.

  1. Kenneth Hansen & Angel Calvo PowerShell Team Engagement
  2. Don Jones DSC Resource Design
  3. Dave Wyatt on Automated Testing using Pester
  4. Defending the Defenders Part 1 & 2
  5. Debugging
  6. PowerShell Get
  7. Ashley McGlone on DSC and AD
  8. PowerShell v5 Debugging (There is also a session on Debugging PowerShell by Kirk Munro.  These are different)

ValidateSet for a Parameter in a DSC Class Based Resource Fails to Throw Error

While working on a Custom DSC Resource that I started Monday night at the PowerShell Summit I came across some interesting behavior that turned out to be a bug in the WMF 5.0 February Preview. I have logged this issue in Connect, but I wanted to write a blog post to demonstrate what exactly is going on for when someone else runs into this issue. I am just going to the use Custom DSC Resource for creating a Primary DNS Zone that I was working on as the example to demonstrate the behavior.

Here are the properties for the resource. I figured I could just do ValidateSet like I always had done for an advanced function or non-class based DSC Resource.

My Configuration for testing the Resource looks like this:

If I run this Configuration, with one of the appropriate values for ReplicationScope, it works exactly like you would expect it to.

That’s great. But, what happens if I put in a value that isn’t part of Validate Set?

That is clearly not what should happen. You would expect to see an error saying something to effect of “HokeyPokey does not belong to the set “Domain”,”Forest”,”Current”,”Legacy”, it needs to be one of those values”.

If we look at the .MOF file that gets created, this incorrect value also makes it into the .MOF file:

You can tell that it knows something is wrong, because when it runs through Test-TargetResource and Set-TargetResource it doesn’t actually do anything (notice all the Verbose messages that are missing from the previous example), but it also doesn’t error.

So how do we get around this? By using an Enum!

Now, if I try to set the ReplicationScope to HokeyPokey, we get the behavior we would expect.

Creating a Class based DSC Resource using PowerShell

Scenario: I would like to think I am fairly competent at creating DSC Resources using .MOF files. But with the upcoming release of Windows Management Framework 5.0 we can now write DSC Resources using Classes. I have never done anything with a Class. I am going to attempt to figure out how to write a simple Class based DSC Resource.

I am going to start with this TechNet Article, because it was the first thing that came up when I Googled “Create Class based DSC Resource”.

I am going to create a DSC Resource called MyTestClassResource. The first thing I need to do is create the appropriate folder structure, which I do by running the following two commands:

Next, I need to create the Module Manifest.

The .PSM1 file is where I define and create my Class based resource.

Now, let’s get to creating this Resource. I am going to go super simple here and create a Resource that will just ensure that a Folder exists. Yes, I know the File DSC Resource already does this, that’s not the point :). After fiddling around for a little bit here is what my Class DSC Resource “Skeleton” looks like.

The rest of this should be pretty straightforward. Right? The first thing I try to do in the Get section is to test and see if the path exists.

This doesn’t work however because “Variable is not assigned in the method”, whatever the hell that means. Looking at the article it uses a $This object (I have no idea if that’s even the right word) with the variables to do things, so let’s try a different tactic.

And that works fine, so clearly $This is some special thing I need to be using going forward. This should be fun :). Now that I got that working, the rest of this Method was pretty straight forward.

After that, the Test Method is pretty easy as well. However, I have no idea what is going on with the whole Return -not $Item part, I am just following along from the example and hoping that it works.

Onto the Set Method. One thing I noticed when creating this is that I don’t need an Else block with an If statement, which is nice.

With that done I need to re-create the Module Manifest that I made earlier with some important information.

At this point while trying to run Get-DSCResource I realized that my folder structure I created at the beginning was not correct, because I was used to the way I had been doing it when working with .MOF Files. I actually need only this:

And then I moved the .psm1 and .psd1 files into that folder. No extra sub-folder required. This is a win in my book.

Now, when I run Get-Module -ListAvailable, the MyTestClassResource Module is listed. However, when I run Get-DSCResource -Module MyTestClassResource I get a lot of nothing. Weird. Next I try to Import-Module -Name MyTestClassResource and I get this giant bundle of joy.

Uhhh…What? Thinking quickly I decide that it’s probably not going to work to name everything exactly the same. I rename the MyTestClassResource folder to MyTestClassResources and leave everything else the same. And well, I will spare all the error text but that didn’t work at all either. I am not sure how much time I spent trying to figure out what the hell I was doing wrong, but to say it was an exercise in frustration is a massive understatement. No matter what I did I couldn’t get it to recognize a valid Module, let alone DSC Resource. I lost track of all the troubleshooting that I did but here is what my folder structure looks like now that it is working. Note that I renamed my Class based Resource from MyTestClassResource to MyFolderResource.

Now, let’s test a Configuration!

And just to make sure it’s working, let’s set it to Absent