Thycotic.Secret.Server.psm1

function Connect-TSS {
  param(
    [Parameter(Mandatory = $true)]
    [string] 
      $fqdn,
    [Parameter(Mandatory = $true)]
    [pscredential] 
      $credential,
    [Parameter(Mandatory = $true)]  
    [string]
      $domain
  )
  
  [System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}
  [Net.ServicePointManager]::SecurityProtocol = 'Tls12'
  $proxy = New-WebServiceProxy -uri "https://$fqdn/webservices/sswebservice.asmx" -UseDefaultCredential -Namespace "ss"
  $proxy.CookieContainer = New-Object System.Net.CookieContainer
  $token = $proxy.authenticate($Credential.UserName, 
    ($Credential.GetNetworkCredential()).Password, '', $domain) | select -expandproperty token
  
  $proxy | add-member -name 'token' -MemberType NoteProperty -value $token
  
  $Global:defaultTss = $proxy
  return $proxy
}

function Get-TssSubFolder {
  param(
    [Parameter(
      Helpmessage = 'Parent Folder ID'
    )]
    [int]
      $id = -1,
      
    $tss = $defaultTss
  )
  
  $folders = $tss.foldergetallchildren($defaulttss.token, $id) | select -ExpandProperty folders | ?{$_.id -ne 1}
  $folders
  foreach ($f in $folders) {
    Get-TssSubFolder $f.id $tss
  }  
}

function Get-TssSecretInFolder {
  param(
    [Parameter(
      Mandatory = $true,
      ValueFromPipeline = $true,
      ValueFromPipelineByPropertyName = $true,
      Helpmessage = 'Parent Folder ID'
    )]
    [int]
      $id,
   
    $tss = $defaultTss
  )
  begin {}
  process {
    $folderPath = Get-TssFolderPath $id $tss
    $tss.SearchSecretsByFolder($tss.token, '*', $id, $false, $false, $true) | 
      select -ExpandProperty secretsummaries |
      select *, @{ n='Path'; e={"{0}/{1}" -f $folderPath, $_.SecretName} }
  }
  end {}
}

function Get-TssFolderPath {
  param(
    [Parameter(
      Mandatory = $true,
      ValueFromPipeline = $true,
      ValueFromPipelineByPropertyName = $true
    )]
    [int]
      $Id,
      
    $tss = $defaultTss
  )
  begin {}
  process {
    $thisFolder = $tss.folderGet($tss.token, $id) | select -ExpandProperty folder
    if ($thisFolder.parentFolderId -eq -1) {$thisFolder.name}
    else { 
      (Get-TssFolderPath $thisFolder.parentFolderId) + "/" + $thisFolder.name
    }
  }
  end {}
}

function Get-TssSecretData {
  param(
    [Parameter(
      Mandatory = $true,
      ValueFromPipeline = $true,
      ValueFromPipelineByPropertyName = $true,
      Helpmessage = 'Secret ID'
    )]
    [int]
      $SecretId,
   
    $tss = $defaultTss
  )
  begin {}
  process {
    $tss.GetSecretLegacy($tss.token, $SecretId) | select -ExpandProperty secret
  }
  end {}
}

function Get-TssRestToken {
  param(
    [Parameter(Mandatory = $true)]
    [string] 
      $fqdn,
    [Parameter(Mandatory = $true)]
    [pscredential] 
      $credential
  )
  
  [Net.ServicePointManager]::SecurityProtocol = 'Tls12'
  $uri = "https://$fqdn/oauth2/token"
  $data = @{
    'username' = $Credential.UserName
    'password' = ($Credential.GetNetworkCredential()).Password
    'grant_type' = 'password' 
  }
  return (Invoke-RestMethod -Uri $uri -Method Post -body $data).access_token
}

function Get-TssRestSecretPassword {
  param(
    [Parameter(Mandatory = $true)]
    [string] 
      $fqdn,
    [Parameter(Mandatory = $true)]
    [string] 
      $token,
    [Parameter(Mandatory = $true)]
    [string]
      $secretId
  )
  
  [Net.ServicePointManager]::SecurityProtocol = 'Tls12'
  $uri = "https://$fqdn/api/v1/secrets/$secretId/fields/Password"
  $head = @{
    'Authorization' = "Bearer $token" 
  }
  return (Invoke-RestMethod -Uri $uri -Method Get -Headers $head)
}