function Disconnect-From { <# .SYNOPSIS Terminates a session established with Connect-To using a CredentialStoreItem. .DESCRIPTION Terminates a session established with Connect-To using a CredentialStoreItem. .PARAMETER RemoteHost Specify the remote endpoint, whose session you would like to terminate. .PARAMETER Identifier Defaults to "". Specify a string, which separates two CredentialStoreItems for the same hostname. .PARAMETER Type Specify the host type of the target. Currently implemented targets are: - CiscoUcs - CiscoUcsCentral - FTP - NetAppFAS - VMware - CisServer - ExchangeHTTP - ExchangeHTTPS - SCP .PARAMETER Force Force the disconnect, even if the disconnect would fail. .INPUTS [None] .OUTPUTS [None] .EXAMPLE Disconnect-From -RemoteHost "ucs.myside.local" -Type CiscoUcs .EXAMPLE Disconnect-From -RemoteHost "ftp.myside.local" -Type FTP .EXAMPLE Disconnect-From -RemoteHost "fas.myside.local" -Type NetAppFAS .EXAMPLE Disconnect-From -RemoteHost "esx01.myside.local" -Type VMware .EXAMPLE Disconnect-From -RemoteHost "esx01.myside.local" -Type VMware -Force:$True .EXAMPLE Disconnect-From -RemoteHost "vcenter.myside.local" -Type CisServer .EXAMPLE Disconnect-From -RemoteHost "exchange01.myside.local" -Type ExchangeHTTP .EXAMPLE Disconnect-From -RemoteHost "exchange01.myside.local" -Type ExchangeHTTPS #> [CmdletBinding()] [Diagnostics.CodeAnalysis.SuppressMessageAttribute( 'PSAvoidGlobalVars', '', Justification = 'Wrapping existing global vars from external modules' )] param ( [Parameter(Mandatory = $true)] [string]$RemoteHost, [Parameter(Mandatory = $true)] [ValidateSet( 'CiscoUcs', 'CiscoUcsCentral', 'FTP', 'NetAppFAS', 'VMware', 'CisServer', 'ExchangeHTTP', 'ExchangeHTTPS', 'SCP' )] [string]$Type, [Parameter(Mandatory = $false)] [switch]$Force ) begin {} process { switch -Regex ($Type) { "VMware" { try { if ($Force) { Disconnect-VIServer -Server $RemoteHost -Confirm:$false -ErrorAction 'Stop' -Force:$true } else { Disconnect-VIServer -Server $RemoteHost -Confirm:$false -ErrorAction 'Stop' } } catch { # Write a error message to the log. $MessageParams = @{ Message = "Unable to disconnect from {0} using Type {1}." -f $RemoteHost, $Type ErrorAction = 'Stop' } Write-Error @MessageParams } } "CisServer" { try { if ($Force) { Disconnect-CisServer -Server $RemoteHost -Confirm:$false -ErrorAction 'Stop' -Force:$true } else { Disconnect-CisServer -Server $RemoteHost -Confirm:$false -ErrorAction 'Stop' } } catch { # Write a error message to the log. $MessageParams = @{ Message = "Unable to disconnect from {0} using Type {1}." -f $RemoteHost, $Type ErrorAction = 'Stop' } Write-Error @MessageParams } } # Check for an existing WinSCP Session var "FTP" { if ($Global:WinSCPSession.Opened) { Remove-WinSCPSession -WinSCPSession $Global:WinSCPSession } else { $MessageParams = @{ Message = 'There is no open WinSCP Session' ErrorAction = 'Stop' } Write-Error @MessageParams } } # DataONTAP doesn't have a CmdLet `Disconnect-NcController`. # So we go ahead and clear the CurrentNcController variable. "NetAppFAS" { try { $MessageParams = @{ Message = ( "Setting {0} to `$null, which will disconnect NetAppFAS" -f $Global:CurrentNcController ) ErrorAction = 'Continue' } Write-Verbose @MessageParams $Global:CurrentNcController = $null } catch { # Write a error message to the log. $MessageParams = @{ Message = "Unable to disconnect from {0} using Type {1}." -f $RemoteHost, $Type ErrorAction = 'Stop' } Write-Error @MessageParams } } "CiscoUcs" { try { Disconnect-Ucs -Ucs $RemoteHost } catch { # Write a error message to the log. $MessageParams = @{ Message = "Unable to disconnect from {0} using Type {1}." -f $RemoteHost, $Type ErrorAction = 'Stop' } Write-Error @MessageParams } } "CiscoUCSCentral" { try { $handle = Connect-UcsCentral -Name $RemoteHost -Credential $creds -NotDefault $ExecutionContext.SessionState.PSVariable.Set('DefaultUcsCentral', $handle) } catch { $MessageParams = @{ Message = "Unable to disconnect from {0} using Type {1}." -f $RemoteHost, $Type ErrorAction = 'Stop' } Write-Error @MessageParams } } "ExchangeHTTP*" { try { Get-Variable -Name 'PSExchangeRemote' -Scope 'Global' -ErrorAction 'Stop' Remove-PSSession -Session $Global:PSExchangeRemote -ErrorAction 'Stop' } catch { $MessageParams = @{ Message = "Unable to disconnect from {0} using Type {1}." -f $RemoteHost, $Type ErrorAction = 'Stop' } Write-Error @MessageParams } } "SCP" { if ($Global:WinSCPSession.Opened) { Remove-WinSCPSession -WinSCPSession $Global:WinSCPSession } else { $MessageParams = @{ Message = 'There is no open WinSCP Session' ErrorAction = 'Stop' } Write-Error @MessageParams } } default { # Write a error message to the log. $MessageParams = @{ Message = "Unable to disconnect from {0} using Type {1}." -f $RemoteHost, $Type ErrorAction = 'Stop' } Write-Error @MessageParams } } } }