Private/Connect-VUM.ps1
function Connect-VUM { <# .SYNOPSIS Private function to create connection to VUM instance. .DESCRIPTION In order to make calls to the vcIntegrity API a connection to a VUM instance is required. All functions within the VUMXtra module call this prior to executing any actions. The connection object is then used within the calling function. If multiple defaultVIServers exists, then the -vumVI parameter must be used to specify which to use for the VUM connection. .PARAMETER vumVI The name of the VI connection to use to connect to the VUM service. Optional if there is only a single connection. .INPUTS None. .OUTPUTS System.Management.Automation.PSCustomObject. A VUM service connection object. .EXAMPLE $vumCon = Connect-VUM Creates a VUM connection object using the single default vCenter connection. .EXAMPLE $vumCon = Connect-VUM -vumVI vcsa01.lab.local Creates a VUM connection object to vcsa01.lab.local. .NOTES 01 18/03/19 Initial version. A McNair 02 23/12/19 Tidied up synopsis and added verbose output. A McNair Added parameter to specify which VI connection to use. #> [CmdletBinding()] Param ( [Parameter(Mandatory=$false,ValueFromPipeline=$false)] [String]$vumVI ) Write-Verbose ("[Connect-VUM]Function start.") ## Address the 3 possible conditions and set an appropriate vCenter connection switch ($vumVI) { ## Parameter was specified, set the VI connection to use {($_)} { Write-Verbose ("vumVI parameter was specified. Using vCenter " + $vumVI + " for VUM API connection.") $vCenterServer = $global:DefaultVIServers | Where-Object {$_.name -eq $vumVI} } # true ## Parameter not specified, but there multiple VI connections, exit as this is ambiguous. {(!$_) -and ($global:DefaultVIServers.count -gt 1)} { throw ("Multiple vCenter connections detected, either use a single default connection, or specify the -vumVI parameter.") } # false ## Parameter not specified, one default instance default { Write-Verbose ("Assuming connection to default vCenter.") $vCenterServer = $global:DefaultVIServer } } # switch ## Check that there is a suitable vCenter connection if (!$vCenterServer) { throw ("Not connected to vCenter or specified vCenter instance was not found in list of active connections.") } # if ## Check the PowerCLI invalid vertificate action. If set to ignore, then configure HTTP connections to ignore invlaid certs $pcliConfig = Get-PowerCLIConfiguration if (($pcliConfig | Where-Object {$_.scope -eq "session"}).invalidCertificateAction -eq "ignore") { Write-Verbose ("[Connect-VUM]PowerCLI is configured to ignore invlaid certificates.") ## Ignore invalid certificates if (!([System.Management.Automation.PSTypeName]'TrustAllCertsPolicy').Type) { Add-Type @" using System.Net; using System.Security.Cryptography.X509Certificates; public class TrustAllCertsPolicy : ICertificatePolicy { public bool CheckValidationResult( ServicePoint srvPoint, X509Certificate certificate, WebRequest request, int certificateProblem) { return true; } } "@ [System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy -ErrorAction SilentlyContinue [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 } # if } # if ## Get VUM extension try { $serviceInstance = Get-View ServiceInstance -Server $vCenterServer $extensionMgr = Get-View $serviceInstance.Content.ExtensionManager -Server $vCenterServer $vumExtension = $extensionMgr.FindExtension("com.vmware.vcIntegrity") Write-Verbose ("[Connect-VUM]Got VUM extension.") } # try catch { throw ("Error getting VUM extension. " + $_) Write-Debug ("[Connect-VUM]Failed to get VUM extension.") } # catch ## Ensure VUM automation module is loaded try { Get-Patch -Id 0 -ErrorAction Stop -WarningAction SilentlyContinue | Out-Null Write-Verbose ("[Connect-VUM]Loaded VUM assemblies.") } # try catch { throw ("Could not load VUM assemblies. " + $_) Write-Debug ("[Connect-VUM]Could not load VUM assemblies.") } # catch ## Initialise VUM service try { $vumWebService = New-Object IntegrityApi.IntegrityService $vumUrl = $vumExtension.Server[0].Url $vumWebService.Url = $vumUrl $vumWebService.CookieContainer = New-Object System.Net.CookieContainer $vumWebService.Timeout = 300000 $svcRefVum = New-Object IntegrityApi.ManagedObjectReference $svcRefVum.type = "VcIntegrity" $svcRefVum.Value = 'Integrity.VcIntegrity' $sessionManager = Get-View $serviceInstance.Content.SessionManager -Server $vCenterServer $vumServiceContent = $vumWebService.RetrieveVcIntegrityContent($svcRefVum) $userSession = $vumWebService.VciLogin($vumServiceContent.sessionManager, $sessionManager.CurrentSession.UserName, $sessionManager.CurrentSession.Key, $sessionManager.CurrentSession.Locale) } # try catch { throw ("Could not initialise the VUM service. " + $_) Write-Debug ("[Connect-VUM]Could not initialise the VUM service.") } # catch Write-Verbose ("[Connect-VUM]Connected to VUM.") ## Set return object $vumCon = [pscustomobject]@{"vumWebService" = $vumWebService; "vumServiceContent" = $vumServiceContent} ## Return connection object return $vumCon } # function |