Bomgar-API.psm1
$script:defaultBomgarVaultFolder = "$Env:LOCALAPPDATA\Bomgar-API\" $script:defaultBomgarVaultLocation = "$Env:LOCALAPPDATA\Bomgar-API\bomgarVault.conf" function Initialize-BomgarAPI{ param ( [Parameter(Mandatory=$false)] [bool] $ReturnBaseURL=$false ) $vaultFile = $script:defaultBomgarVaultLocation if(Test-Path $vaultFile) { $vaultValue = Get-BomgarVault -VaultPath $vaultFile $AuthCred, $baseURL = $vaultValue.vaultKey, $vaultValue.baseURL } else { Write-Host "You currently don't have a localvault setup. Please enter your Bomgar API Credentials" $userResponse = Invoke-BomgarCredPrompt $AuthCred, $baseURL = $userResponse.vaultKey, $userResponse.baseURL $userPrompt = Read-Host "Would you like to save your API credentials in an encrypted Vault? 'Y' for yes any other key for no." if($userPrompt -eq 'y'){ New-BomgarVault -BaseURL $baseURL -AuthCred $AuthCred -VaultPath $vaultFile } } $script:vaultObject = @{"BaseURL"=$baseURL; "vaultKey"=$AuthCred} return $script:vaultObject } function Invoke-BomgarCredPrompt{ Write-Host "Welcome to Bomgar API Services." Write-Host "Initializing your Authentication." $apiKey = Read-Host "Enter your API KEY" $apiSecret = Read-Host "Enter your API SECRET" $baseURL = Read-Host "Enter the baseURL" $authHeader = ConvertTo-Base64 ("$($apiKey):$($apiSecret)") $script:vaultObject = @{"BaseURL"=$baseURL; "vaultKey"=$authHeader} return $script:vaultObject } function New-BomgarVault{ param ( [Parameter(Mandatory=$false)] [string] $BaseURL, [Parameter(Mandatory=$false)] [string] $AuthCred, [Parameter(Mandatory=$false)] [string] $VaultPath=$script:defaultBomgarVaultLocation ) if(!($BaseURL) -or !($AuthCred)){ $userResponse = Invoke-BomgarCredPrompt $BaseURL = $userResponse.baseURL $AuthCred = $userResponse.vaultKey } $vaultKey = ConvertFrom-SecureString -SecureString (ConvertTo-SecureString -String $AuthCred -AsPlainText -Force) $script:vaultObject = @{"BaseURL"=$BaseURL; "vaultKey"=$vaultKey} if(!(Test-Path $script:defaultBomgarVaultFolder)){ New-Item -Path $script:defaultBomgarVaultFolder -ItemType Directory | Out-Null } $encryptedVaultObject = @{"BaseURL"=$BaseURL; "vaultKey"=$vaultKey} $script:vaultObject = @{"BaseURL"=$BaseURL; "vaultKey"=$AuthCred} Set-Content -Value ($encryptedVaultObject | ConvertTo-Json) -Path $VaultPath return $script:vaultObject } function Set-BomgarVault{ param ( [Parameter(Mandatory=$false)] [string] $BaseURL, [Parameter(Mandatory=$false)] [string] $AuthCred, [Parameter(Mandatory=$false)] [string] $VaultPath=$script:defaultBomgarVaultLocation ) try{ $vaultValues = Get-BomgarVault $VaultPath } catch{ Write-Host "Corrupted vault file. Try running Remove-BomgarVault first." Initialize-BomgarAPI return } if($vaultValues){ $tempVaultKey = $vaultValues.vaultKey $tempBaseURL = $vaultValues.baseURL if(!$BaseURL){$BaseURL = $tempBaseURL} if(!$AuthCred){$AuthCred = $tempVaultKey} } else{ if(!$AuthCred -or !$BaseURL){ Write-Host "Invalid or missing Bomgar Vault. Creating a new Vault." Initialize-BomgarAPI return } } $vaultKey = ConvertFrom-SecureString -SecureString (ConvertTo-SecureString -String $AuthCred -AsPlainText -Force) $encryptedVaultObject = @{"BaseURL"=$BaseURL; "vaultKey"=$vaultKey} $script:vaultObject = @{"BaseURL"=$BaseURL; "vaultKey"=$AuthCred} Set-Content -Value ($encryptedVaultObject | ConvertTo-Json) -Path $VaultPath } function Get-BomgarVault{ param ( [Parameter(Mandatory=$false)] [string] $VaultPath=$script:defaultBomgarVaultLocation ) if(!(Test-Path $VaultPath) -and !($script:vaultObject)){ Write-Host "No Bomgar vault found. First create a vault using New-BomgarVault or running Initialize-BomgarAPI cmdlet" return } try{ if($script:vaultObject){ $localVaultObject = $script:vaultObject $baseURL = $localVaultObject.baseURL $AuthCred = $localVaultObject.vaultKey } else{ $localVaultObject = (Get-Content $VaultPath) | ConvertFrom-Json $encryptedAuth = $localVaultObject.vaultKey $baseURL = $localVaultObject.baseURL $secureAuth = ConvertTo-SecureString -String $encryptedAuth $AuthCred = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto([System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($secureAuth)) } } catch{ Write-Host "Error reading from Bomgar vault. Try running Remove-BomgarVault command first." return } $script:vaultObject = @{"BaseURL"=$baseURL; "vaultKey"=$AuthCred} return $script:vaultObject } function Update-BomgarVault{ if(!$script:vaultObject){ Write-Host "No cached vault" } else{ $localVaultObject = $script:vaultObject $baseURL = $localVaultObject.baseURL $AuthCred = $localVaultObject.vaultKey Set-BomgarVault -BaseURL $baseURL -AuthCred $AuthCred } } function Remove-BomgarVault{ param ( [Parameter(Mandatory=$false)] [string] $VaultPath=$script:defaultBomgarVaultFolder ) if(Test-Path $VaultPath){ Remove-Item $VaultPath -Recurse } else{ Write-Host "No Bomgar vault found." } } function Get-BomgarAPIToken{ $initObject = Initialize-BomgarAPI $authHeader, $baseURL = $initObject.vaultKey, $initObject.baseURL $header = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $header.Add("Authorization", "Basic $($authHeader)") $body = @{grant_type="client_credentials"} $authUrl = "$baseURL/oauth2/token" $response = Invoke-RestMethod $authUrl -Method 'POST' -Headers $header -Body $body $authKey = $response.access_token return $authKey } function Get-BomgarJumpClients{ param ( [Parameter(Mandatory=$false)] [int] $curPage=0, [Parameter(Mandatory=$false)] [bool] $headerFlag=$false ) $baseURI = (Get-BomgarVault).baseURL $authKey = Get-BomgarAPIToken $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.Add("Authorization", "Bearer $($authKey)") $headers.Add("Accept", "application/json") try{ $clientRequestURL = "$baseURI/api/config/v1/jump-client?current_page=$curPage" $jumpClientData = Invoke-RestMethod $clientRequestURL -Method 'Get' -Headers $headers } catch{ $authKey = Get-BomgarAPIToken } if($headerFlag -eq $true){ $jumpClientHeader = (Invoke-WebRequest $clientRequestURL -Method 'Get' -Headers $headers).Headers return $jumpClientHeader } return $jumpClientData } function Get-BomgarUsers{ param ( [Parameter(Mandatory=$false)] [int] $curPage=0, [Parameter(Mandatory=$false)] [bool] $headerFlag=$false ) $baseURI = (Get-BomgarVault).baseURL $authKey = Get-BomgarAPIToken $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.Add("Authorization", "Bearer $($authKey)") $headers.Add("Accept", "application/json") try{ $clientRequestURL = "$baseURI/api/config/v1/user?current_page=$curPage" $jumpClientData = Invoke-RestMethod $clientRequestURL -Method 'Get' -Headers $headers } catch{ $authKey = Get-BomgarAPIToken } if($headerFlag -eq $true){ $jumpClientHeader = (Invoke-WebRequest $clientRequestURL -Method 'Get' -Headers $headers).Headers return $jumpClientHeader } return $jumpClientData } function Invoke-AllBomgarUsers{ $contentArray = @(); $response = Get-BomgarUsers 0 $true $entries = [int] ($response.'x-bt-pagination-per-page') $total = [int] ($response.'x-bt-pagination-total') $numPages = [int] ($response.'x-bt-pagination-last-page') try{ $entries = [int] $entries $total = [int] $total $numPages = [int] $numPages }catch{ $entries = [int] $entries[0] $total = [int] $total[0] $numPages = [int] $numPages[0] } while($numPages -gt 0){ $response = Get-BomgarUsers $numPages $false; $contentArray += $response; $numPages -= 1 } return $contentArray } function Invoke-AllBomgarClients{ $contentArray = @(); $response = Get-BomgarJumpClients 0 $true $entries = [int] ($response.'x-bt-pagination-per-page') $total = [int] ($response.'x-bt-pagination-total') $numPages = [int] ($response.'x-bt-pagination-last-page') try{ $entries = [int] $entries $total = [int] $total $numPages = [int] $numPages }catch{ $entries = [int] $entries[0] $total = [int] $total[0] $numPages = [int] $numPages[0] } while($numPages -gt 0){ $response = Get-BomgarJumpClients $numPages $false; $contentArray += $response; $numPages -= 1 } return $contentArray } function ConvertTo-Base64 { param ( [Parameter(Mandatory = $true)] [string]$StringToEncode ) $bytes = [System.Text.Encoding]::UTF8.GetBytes($StringToEncode) $base64String = [System.Convert]::ToBase64String($bytes) return $base64String } function ConvertFrom-Base64 { param ( [Parameter(Mandatory = $true)] [string]$Base64String ) $bytes = [System.Convert]::FromBase64String($Base64String) $plainText = [System.Text.Encoding]::UTF8.GetString($bytes) return $plainText } # Export only the functions using PowerShell standard verb-noun naming. # Be sure to list each exported functions in the FunctionsToExport field of the module manifest file. # This improves performance of command discovery in PowerShell. Export-ModuleMember -Function *-* |