# encoding: ascii
# api: powershell
# title: VMware Lab Manager 4.x
# description: Based on poshcode.org/753 – minor mods to support new mandatory authentication parameters in Lab Manager 4.x.
# version: 0.1
# type: function
# author: oldsienna
# license: CC0
# function: Ignore-SslErrors
# x-poshcode-id: 2318
# x-archived: 2015-05-09T14:37:28
# x-published: 2011-10-24T11:19:00
#
# Sample code to demonstrate PowerShell 2.0 integration with Lab Manager APIs. Majority of code can be omitted if properly signed SSL certificates are used.
# Added a function to connect to the Lab Manager’s internal API and some examples code of how to work with it. The SOAP API provides a VMware supported set of automation functionality however the set is very limited in comparison to what is provided by the VMware unsupported internal which provides far more automation ability.
# Lab Manager internal API help files can be obtained here: http://communities.vmware.com/docs/DOC-8603 , and here: http://communities.vmware.com/docs/DOC-10608 . The Lab Manager API community discussion forums can be found here: http://communities.vmware.com/community/developer/forums/labmanager .
#
function Ignore-SslErrors {
# Create a compilation environment
$Provider=New-Object Microsoft.CSharp.CSharpCodeProvider
$Compiler=$Provider.CreateCompiler()
$Params=New-Object System.CodeDom.Compiler.CompilerParameters
$Params.GenerateExecutable=$False
$Params.GenerateInMemory=$True
$Params.IncludeDebugInformation=$False
$Params.ReferencedAssemblies.Add("System.DLL") > $null
$TASource=@'
namespace Local.ToolkitExtensions.Net.CertificatePolicy {
public class TrustAll : System.Net.ICertificatePolicy {
public TrustAll() {
}
public bool CheckValidationResult(System.Net.ServicePoint sp,
System.Security.Cryptography.X509Certificates.X509Certificate cert,
System.Net.WebRequest req, int problem) {
return true;
}
}
}
'@
$TAResults=$Provider.CompileAssemblyFromSource($Params,$TASource)
$TAAssembly=$TAResults.CompiledAssembly
## We now create an instance of the TrustAll and attach it to the ServicePointManager
$TrustAll=$TAAssembly.CreateInstance("Local.ToolkitExtensions.Net.CertificatePolicy.TrustAll")
[System.Net.ServicePointManager]::CertificatePolicy=$TrustAll
}
function New-ObjectFromProxy {
param($proxy, $proxyAttributeName, $typeName)
# Locate the assembly for $proxy
$attribute = $proxy | gm | where { $_.Name -eq $proxyAttributeName }
$str = "`$assembly = [" + $attribute.TypeName + "].assembly"
invoke-expression $str
# Instantiate an AuthenticationHeaderValue object.
$type = $assembly.getTypes() | where { $_.Name -eq $typeName }
return $assembly.CreateInstance($type)
}
function Connect-LabManager {
param
(
[string] $server,
$credential,
[string] $organizationname = "Default",
[string] $workspacename = "Main"
)
# Log in to Lab Manager's web service.
$server = "https://" + $server + "/"
$endpoint = $server + "LabManager/SOAP/LabManager.asmx"
$proxy = new-webserviceproxy -uri $endpoint -cred $credential
# Before continuing we need to add an Authentication Header to $proxy.
$authHeader = New-ObjectFromProxy -proxy $proxy -proxyAttributeName "AuthenticationHeaderValue" -typeName "AuthenticationHeader"
$authHeader.username = $credential.GetNetworkCredential().UserName
$authHeader.password = $credential.GetNetworkCredential().Password
$authHeader.organizationname = $organizationname
$authHeader.workspacename = $workspacename
$proxy.AuthenticationHeaderValue = $authHeader
return $proxy
}
function Get-LabManagerInternal
{
param
(
[string] $server = $(throw "Parameter -Server [System.String] is required."),
$credential = $(get-credential),
[string] $organizationname = "Global",
[string] $workspacename = "Main"
)
$labManagerInternalUri = [System.Uri] "https://$server/LabManager/SOAP/LabManagerInternal.asmx"
$proxy = New-WebServiceProxy -Uri $labManagerInternalUri -Credential $credential
if ($proxy)
{
# Before continuing we need to add an Authentication Header to $proxy.
$authHeader = New-ObjectFromProxy -proxy $proxy -proxyAttributeName "AuthenticationHeaderValue" -typeName "AuthenticationHeader"
$authHeader.username = $credential.GetNetworkCredential().UserName
$authHeader.password = $credential.GetNetworkCredential().Password
$authHeader.organizationname = $organizationname
$authHeader.workspacename = $workspacename
$proxy.AuthenticationHeaderValue = $authHeader
return $proxy
}
}
# Examples:
# Run this command if your Lab Manager's certificate is untrusted but you want to connect.
Ignore-SslErrors
# Connect to Lab Manager.
$labManager = Connect-LabManager -server "demo.eng.vmware.com" -credential (get-credential)
# Find out what operations there are.
$labManager | gm | where { $_.MemberType -eq "Method" }
# See http://www.vmware.com/pdf/lm30_soap_api_guide.pdf for help on arguments.
# List all library configurations.
$labManager.ListConfigurations(1)
# Find all machines deployed from any library configuration.
$labManager.ListConfigurations(1) | foreach { write-host ("For Configuration " + $_.id + ":"); $labManager.ListMachines($_.id) }
# Internal API Examples:
# Connect to Lab Manager Internal API.
$labmanagerinternal = Get-LabManagerInternal -server "demo.eng.vmware.com" -organizationname "Default" -workspacename "Main" -credential (get-credential)
# Gets all Media images in Lab Manager.
$labmanagerinternal.GetAllMedia()