#region: Workaround for SelfSigned Cert and force TLS 1.2
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
[System.Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
#endregion
#region Set the stage
$Credentials = Get-Credential -Message "Enter credentials for SRS"
$Headers = @{
"accept" = "application/json"
"content-type" = "application/json"
}
#endregion
#region Logon
Write-Host "Logging on..."
$WebRequest = @{
Uri = "https://srs.local.lab/api/auth/login"
Method = "POST"
Headers = $Headers
Credential = $Credentials
}
$Logon = Invoke-WebRequest @WebRequest
$Headers.Add('X-SRS-API-KEY', $Logon.Headers['X-SRS-API-KEY'])
#endregion
#region Create Runspace
Write-Host "Creating a new runspace..."
$Body = @{
name = 'MyRunSpace'
run_vc_connection_script = $true
}
$WebRequest = @{
Uri = "https://srs.local.lab/api/runspaces"
Method = "POST"
Headers = $Headers
Credential = $Credentials
}
$WebRequest.Add('Body', ($Body | ConvertTo-Json))
$RunSpace = Invoke-WebRequest @WebRequest
$RunSpace = $RunSpace.Content | ConvertFrom-Json
#endregion
#region Check runspace status
Write-Host "Checking the runspace status..."
while ($RunSpace.state -eq 'Creating') {
$WebRequest = @{
Uri = "https://srs.local.lab/api/runspaces/$($RunSpace.id)"
Method = 'GET'
Headers = $headers
Credential = $Credentials
}
$getRunSpace = Invoke-WebRequest @WebRequest
$RunSpace = $getRunSpace.Content | ConvertFrom-Json
}
Write-Host "New runspace is ready..."
#endregion
#region Run script
Write-Host "Running the script..."
$Body = @{
runspace_id = $RunSpace.Id
name = "MyScript"
script = "Get-VM"
script_parameters = @()
}
$WebRequest = @{
Uri = "https://srs.local.lab/api/script-executions"
Method = "POST"
Headers = $Headers
Credential = $Credentials
}
$WebRequest.Add('Body', ($Body | ConvertTo-Json))
$RunScript = Invoke-WebRequest @WebRequest
$RunScript = $RunScript.Content | ConvertFrom-Json
#endregion
#region Check script status
Write-Host "Checking script status..."
while ($RunScript.state -eq 'running') {
$WebRequest = @{
Uri = "https://srs.local.lab/api/script-executions/$($RunScript.id)"
Method = 'GET'
Headers = $Headers
}
$GetScript = Invoke-WebRequest @WebRequest
$RunScript = $GetScript.Content | ConvertFrom-Json
}
Write-Host "Script is ready..."
#endregion
#region Retrieve Script output
Write-Host "Retrieving script output..."`n
$WebRequest = @{
Uri = "https://srs.local.lab/api/script-executions/$($RunScript.id)/Output"
Method = 'GET'
Headers = $Headers
}
$ScriptOutput = Invoke-WebRequest @WebRequest
$ScriptOutput.Content | ConvertFrom-Json
#endregion
#region Retrieve Script streams
Write-Host `n"Retrieving script streams..."
$Status = 'information','error','warning','debug','verbose'
$Status | ForEach-Object -Process {
$WebRequest = @{
Uri = "https://srs.local.lab/api/script-executions/$($RunScript.id)/streams/$($_)"
Method = 'GET'
Headers = $headers
}
$Stream = Invoke-WebRequest @WebRequest
if ($Stream.Content -ne '[]') {
$out = ($Stream.Content | ConvertFrom-Json).message | Out-String
switch($_){
'information' {Write-Information -MessageData $out}
'error' {Write-Error -Message $out}
'warning' {Write-Warning -Message $out}
'debug' {Write-Debug -Message $out}
'verbose' {Write-Verbose -Message $out}
}
}
}
#endregion
#region Remove Runspace
Write-Host "Removing runspace..."
$WebRequest = @{
Uri = "https://srs.local.lab/api/runspaces/$($RunSpace.id)"
Method = "DELETE"
Headers = $Headers
Credential = $Credentials
}
$WebRequest.Add('Body', ($Body | ConvertTo-Json))
$RunSpace = Invoke-WebRequest @WebRequest
$RunSpace = $RunSpace.Content | ConvertFrom-Json
#endregion
#region Logout
Write-Host "Logging out..."
$WebRequest = @{
Uri = "https://srs.local.lab/api/auth/logout"
Method = "POST"
Headers = $Headers
Credential = $Credentials
}
$Logout = Invoke-WebRequest @WebRequest
#endregion