Working with the SCVMM Templates via Powershell

Ok... this is my first blog post in quite some time. I've been doing some different coding and since my ASPNET blog posts helped people out, I thought I'd share what I've learned working with SCVMM.

 In this post I'll describe how to request and work with SCVMM template items via powershell and C#.

This post is going to assume you know how to setup C# and work with the System.Management.Automation namespace. If you don't I'll be posting a blog on how I do this next.

In this blog I'm going to show you how to request a specific template and parse the PSObject returned so we can populate a form with the template values. 

The first thing I'm going to do is create the powershell script to get a given template. I've created a function that takes in two parameters, the name of the template that I want, and the VMM Server where that template lives:

public void GetTemplate(string TemplateName, string Server)

{

string psscript = "Get-Template -VMMServer " + Server + " | where {$_.Name -eq '" + TemplateName + "'}";

      
      Collection<PSObject> results = InvokePowerShell(psscript);
}

The InvokePowerShell function will be detailed in the next blog post.

OK this is great, now we have a PSObject that contains all the members of the Template class. But how do we go and get these members so we can use them in C#? With the exception of the custom properties, you just have to know the Member name. Let's take a look:

if (results[0].Members["FullName"].Value != null)

{

tempTemplate.FullName = results[0].Members["FullName"].Value.ToString();

}

So here I am assuming that there is only one template that matches the name that we passed into our function. If there are multiple template objects, they will be returned via an array of PSObjects. This is why I just check the first item in the results array.

From there I just need to know the name of the member of the template class that I'm looking for. There are many ways to do this. You can open the SCVMM powershell window and type Get-Help Get-Template. Or easier, just open the SCVMM powershell window and type get-template. This will return all templates and all members of those templates of the localhost.

Now I did mention that the custom properties are a bit different to work with. This is because the custom properties are canacatenated together split by a space. We can create an array of custom properties to access our custom properties very easily like this:

string[] customproperties = (string[])results[0].Members["CustomProperties"].Value;

tempTemplate.CustomProperty1 = customproperties[0];

string CustomProperty2 = customproperties[1];

The last topic to cover would be setting template settings. I do this by getting the template from SCVMM and then passing the values of the members to be set via the  Set-Template cmdlet. This function will set custom property 1 of the template to the value passed into the function.

public void UpdateTemplate(string TemplateName, string myValue)

{
     string psscript = "";

     psscript += "\r\n$Template = Get-Template -VMMServer localhost | where {$_.Name -like '" + TemplateName + "'}\r\n";

     psscript += "\r\nSet-Template -Template $Template -Custom1 '" + myValue + "'";

Collection<PSObject> results = InvokePowerShell(psscript);
}

If the function succeeds it will return the name of the template in the PSObject results.

Thats it... pretty straight forward.

Enjoy!

 

Adam