tools/spe/Stop-ScriptSession.ps1 (91 lines of code) (raw):
function Stop-ScriptSession {
<#
.SYNOPSIS
Stop Sitecore PowerShell Extensions script session after a script execution.
This command should always be executed to clean up after a session created using New-ScriptSession was used to Invoke-RemoteScript.
If no script was executed on the server (i.e. the $session object was only used to download or upload files/items the cleanup is not necessary.
.EXAMPLE
The following example remotely executes a script in Sitecore using a reusable session and disposes of it afterwards
$session = New-ScriptSession -Username admin -Password b -ConnectionUri http://remotesitecore
Invoke-RemoteScript -Session $session -ScriptBlock { Get-User -id admin }
Stop-ScriptSession -Session $session
Name Domain IsAdministrator IsAuthenticated
---- ------ --------------- ---------------
sitecore\admin sitecore True False
.EXAMPLE
The following example runs a script as a ScriptSession job on the server (using Start-ScriptSession internally).
The arguments are passed to the server with the help of the $Using convention.
The results are finally returned and the job is removed after which the session is closed..
$session = New-ScriptSession -Username admin -Password b -ConnectionUri http://remotesitecore
$identity = "admin"
$date = [datetime]::Now
$jobId = Invoke-RemoteScript -Session $session -ScriptBlock {
[Sitecore.Security.Accounts.User]$user = Get-User -Identity $using:identity
$user.Name
$using:date
} -AsJob
Start-Sleep -Seconds 2
Invoke-RemoteScript -Session $session -ScriptBlock {
$ss = Get-ScriptSession -Id $using:JobId
$ss | Receive-ScriptSession
if($ss.LastErrors) {
$ss.LastErrors
}
}
Stop-ScriptSession -Session $session
.LINK
Wait-RemoteScriptSession
.LINK
New-ScriptSession
.LINK
Invoke-RemoteScript
#>
[CmdletBinding()]
param(
[Parameter(ParameterSetName='Session')]
[ValidateNotNull()]
[pscustomobject]$Session,
[Parameter(ParameterSetName='Uri')]
[Uri[]]$ConnectionUri,
[Parameter(ParameterSetName='Uri')]
[string]$SessionId,
[Parameter(ParameterSetName='Uri')]
[string]$Username,
[Parameter(ParameterSetName='Uri')]
[string]$Password,
[Parameter(ParameterSetName='Uri')]
[System.Management.Automation.PSCredential]
$Credential
)
if($PSCmdlet.ParameterSetName -eq "Session") {
$Username = $Session.Username
$Password = $Session.Password
$SessionId = $Session.SessionId
$Credential = $Session.Credential
$Connection = $Session.Connection
} else {
$Connection = $ConnectionUri | ForEach-Object { [PSCustomObject]@{ Uri = [Uri]$_; Proxy = $null } }
}
foreach($singleConnection in $Connection) {
if($singleConnection.Uri.AbsoluteUri -notmatch ".*\.asmx(\?wsdl)?") {
$singleConnection.Uri = [Uri]"$($singleConnection.Uri.AbsoluteUri.TrimEnd('/'))/sitecore%20modules/PowerShell/Services/RemoteAutomation.asmx?wsdl"
}
if(!$singleConnection.Proxy) {
$proxyProps = @{
Uri = $singleConnection.Uri
}
if($Credential) {
$proxyProps["Credential"] = $Credential
}
$singleConnection.Proxy = New-WebServiceProxy @proxyProps
if($Credential) {
$singleConnection.Proxy.Credentials = $Credential
}
}
if(-not $singleConnection.Proxy) { return $null }
$response = $singleConnection.Proxy.DisposeScriptSession($Username, $Password, $SessionId)
if($response) {
Write-Verbose "Server $($singleConnection.BaseUri.AbsoluteUri) returned a response of '$($response)'."
}
}
}