PPS.psm1
# Override Write-Verbose in this module so calling function is added to the message function script:Write-Verbose { [CmdletBinding()] param ( [Parameter(Mandatory=$true, Position=0, ValueFromPipeline=$true)] [String] $Message ) begin {} process { try { $PSBoundParameters['Message'] = $((Get-PSCallStack)[1].Command) + ': ' + $PSBoundParameters['Message'] } catch {} Microsoft.PowerShell.Utility\Write-Verbose @PSBoundParameters } end {} } function Connect-Pps { <# #> [CmdletBinding(DefaultParameterSetName='Default')] param ( [Parameter(Mandatory=$true, Position=0)] [string] $Uri, [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName='Credential')] [pscredential] $Credential, [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName='UserPass')] [string] $Username, [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName='UserPass')] [string] $Password, [Parameter()] [string] $Session = 'Default' ) begin { Write-Verbose -Message "Begin (ErrorActionPreference: $ErrorActionPreference)" $origErrorActionPreference = $ErrorActionPreference $verbose = $PSBoundParameters.ContainsKey('Verbose') -or ($VerbosePreference -ne 'SilentlyContinue') # FIXXXME - should this be moved out - so it is run when module is imported? if (-not $script:SessionList) { Write-Verbose -Message 'Creating session list' $script:SessionList = @{} } } process { Write-Verbose -Message "Process begin (ErrorActionPreference: $ErrorActionPreference)" try { # Make sure that we don't continue on error, and that we catches the error $ErrorActionPreference = 'Stop' $Uri = $Uri -replace '/$' if (-not ($Credential -or $Username -or $Password)) { $PSBoundParameters['Credential'] = Get-Credential -Message 'PPS' } $oauth2Params = @{ Uri = "$Uri/OAuth2/Token" ReturnHeader = $true } $PSBoundParameters.GetEnumerator() | Where-Object -Property Key -In -Value 'Credential','Username','Password' | ForEach-Object -Process { $oauth2Params[$_.Key] = $_.Value } $script:SessionList[$Session] = [PSCustomObject] @{ Uri = $Uri Headers = Connect-OAuth2 @oauth2Params } } catch { Write-Verbose -Message "Encountered an error: $_" Write-Error -ErrorAction $origErrorActionPreference -Exception $_.Exception } finally { $ErrorActionPreference = $origErrorActionPreference } Write-Verbose -Message 'Process end' } end { Write-Verbose -Message 'End' } } function Get-PpsEntry { <# #> [CmdletBinding()] param ( [Parameter(Mandatory=$true, Position=0)] [guid] $Id, [Parameter()] [string] $Session = 'Default' ) begin { Write-Verbose -Message "Begin (ErrorActionPreference: $ErrorActionPreference)" $origErrorActionPreference = $ErrorActionPreference $verbose = $PSBoundParameters.ContainsKey('Verbose') -or ($VerbosePreference -ne 'SilentlyContinue') } process { Write-Verbose -Message "Process begin (ErrorActionPreference: $ErrorActionPreference)" try { # Make sure that we don't continue on error, and that we catches the error $ErrorActionPreference = 'Stop' $p = @{ Session = $Session } $entry = Invoke-PpsApiRequest @p -Uri "credential/$Id" $entry.Password = Invoke-PpsApiRequest @p -Uri "credential/$Id/password" # Return $entry } catch { Write-Verbose -Message "Encountered an error: $_" Write-Error -ErrorAction $origErrorActionPreference -Exception $_.Exception } finally { $ErrorActionPreference = $origErrorActionPreference } Write-Verbose -Message 'Process end' } end { Write-Verbose -Message 'End' } } function Get-PpsGroup { <# #> [CmdletBinding()] param ( [Parameter(Position=0)] [guid] $Id, [Parameter()] [string] $Session = 'Default' ) begin { Write-Verbose -Message "Begin (ErrorActionPreference: $ErrorActionPreference)" $origErrorActionPreference = $ErrorActionPreference $verbose = $PSBoundParameters.ContainsKey('Verbose') -or ($VerbosePreference -ne 'SilentlyContinue') } process { Write-Verbose -Message "Process begin (ErrorActionPreference: $ErrorActionPreference)" try { # Make sure that we don't continue on error, and that we catches the error $ErrorActionPreference = 'Stop' $p = @{ Session = $Session } $folder = Invoke-PpsApiRequest @p -Uri "credentialgroup/$Id" # Return $folder } catch { Write-Verbose -Message "Encountered an error: $_" Write-Error -ErrorAction $origErrorActionPreference -Exception $_.Exception } finally { $ErrorActionPreference = $origErrorActionPreference } Write-Verbose -Message 'Process end' } end { Write-Verbose -Message 'End' } } function Invoke-PpsApiRequest { <# #> [CmdletBinding()] param ( [Parameter(Mandatory=$true)] [string] $Uri, [Parameter()] [Microsoft.PowerShell.Commands.WebRequestMethod] $Method = 'Get', [Parameter()] [object] $Data, [Parameter()] [switch] $Return, [Parameter()] [string] $Session = 'Default' ) begin { Write-Verbose -Message "Begin (ErrorActionPreference: $ErrorActionPreference)" $origErrorActionPreference = $ErrorActionPreference $verbose = $PSBoundParameters.ContainsKey('Verbose') -or ($VerbosePreference -ne 'SilentlyContinue') # FIXXXME - should this be moved out - so it is run when module is imported? if (-not $script:SessionList) { Write-Verbose -Message 'Creating session list' $script:SessionList = @{} } } process { Write-Verbose -Message "Process begin (ErrorActionPreference: $ErrorActionPreference)" try { # Make sure that we don't continue on error, and that we catches the error $ErrorActionPreference = 'Stop' if (-not ($s = $script:SessionList[$Session])) { throw "Session <$Session> not found" } $requestParams = @{ Method = $Method Uri = "$($s.Uri)/api/v4/rest/$Uri" # FIXXXME - v4 should'n be hardcoded here! Headers = $s.Headers UseBasicParsing = $true } if ($Data) { $requestParams['Body'] = ConvertTo-Json -Depth 9 -InputObject $Data $requestParams['ContentType'] = 'application/json; charset=utf-8' } Write-Verbose -Message ($requestParams | ConvertTo-Json) # Return Invoke-RestMethod @requestParams } catch { Write-Verbose -Message "Encountered an error: $_" Write-Error -ErrorAction $origErrorActionPreference -Exception $_.Exception } finally { $ErrorActionPreference = $origErrorActionPreference } Write-Verbose -Message 'Process end' } end { Write-Verbose -Message 'End' } } function New-PpsEntry { <# #> [CmdletBinding()] param ( [Parameter(Mandatory=$true, ValueFromPipeline=$true, ParameterSetName='Entry')] [PSCustomObject] $Entry, [Parameter(Mandatory=$true, ParameterSetName='Properties')] [guid] $GroupId, [Parameter(ParameterSetName='Properties')] [AllowNull()] [AllowEmptyString()] [string] $Name, [Parameter(ParameterSetName='Properties')] [AllowNull()] [AllowEmptyString()] [string] $Username, [Parameter(ParameterSetName='Properties')] [AllowNull()] [AllowEmptyString()] [string] $Password, [Parameter(ParameterSetName='Properties')] [AllowNull()] [AllowEmptyString()] [string] $Url, [Parameter(ParameterSetName='Properties')] [AllowNull()] [AllowEmptyString()] [string] $Notes, [Parameter()] [string] $Session = 'Default' ) begin { Write-Verbose -Message "Begin (ErrorActionPreference: $ErrorActionPreference)" $origErrorActionPreference = $ErrorActionPreference $verbose = $PSBoundParameters.ContainsKey('Verbose') -or ($VerbosePreference -ne 'SilentlyContinue') } process { Write-Verbose -Message "Process begin (ErrorActionPreference: $ErrorActionPreference)" try { # Make sure that we don't continue on error, and that we catches the error $ErrorActionPreference = 'Stop' $p = @{ Session = $Session } if (-not $Entry) { $Entry = [PSCustomObject] @{ GroupId = $GroupId Name = $Name Username = $Username Password = $Password Url = $Url Notes = $Notes } } $id = Invoke-PpsApiRequest @p -Uri "credential" -Data $Entry -Method Post # Return [PSCustomObject] @{ Id = $id Uri = "$($script:SessionList[$Session].Uri)/WebClient/Main?itemId=$id" } } catch { Write-Verbose -Message "Encountered an error: $_" Write-Error -ErrorAction $origErrorActionPreference -Exception $_.Exception } finally { $ErrorActionPreference = $origErrorActionPreference } Write-Verbose -Message 'Process end' } end { Write-Verbose -Message 'End' } } function New-PpsGroup { <# #> [CmdletBinding()] param ( [Parameter(Mandatory=$true, ValueFromPipeline=$true, ParameterSetName='Group')] [PSCustomObject] $Group, [Parameter(Mandatory=$true, ParameterSetName='Properties')] [guid] $ParentId, [Parameter(Mandatory=$true, ParameterSetName='Properties')] [string] $Name, [Parameter()] [string] $Session = 'Default' ) begin { Write-Verbose -Message "Begin (ErrorActionPreference: $ErrorActionPreference)" $origErrorActionPreference = $ErrorActionPreference $verbose = $PSBoundParameters.ContainsKey('Verbose') -or ($VerbosePreference -ne 'SilentlyContinue') } process { Write-Verbose -Message "Process begin (ErrorActionPreference: $ErrorActionPreference)" try { # Make sure that we don't continue on error, and that we catches the error $ErrorActionPreference = 'Stop' $p = @{ Session = $Session } if (-not $Group) { $Group = [PSCustomObject] @{ ParentId = $ParentId Name = $Name } } $id = Invoke-PpsApiRequest @p -Uri "credentialgroup" -Data $Group -Method Post # Return [PSCustomObject] @{ Id = $id Uri = "$($script:SessionList[$Session].Uri)/WebClient/Main?itemId=$id" } } catch { Write-Verbose -Message "Encountered an error: $_" Write-Error -ErrorAction $origErrorActionPreference -Exception $_.Exception } finally { $ErrorActionPreference = $origErrorActionPreference } Write-Verbose -Message 'Process end' } end { Write-Verbose -Message 'End' } } function Update-PpsEntry { <# #> [CmdletBinding()] param ( [Parameter(Mandatory=$true, ValueFromPipeline=$true)] [PSCustomObject] $Entry, [Parameter()] [string] $Session = 'Default' ) begin { Write-Verbose -Message "Begin (ErrorActionPreference: $ErrorActionPreference)" $origErrorActionPreference = $ErrorActionPreference $verbose = $PSBoundParameters.ContainsKey('Verbose') -or ($VerbosePreference -ne 'SilentlyContinue') } process { Write-Verbose -Message "Process begin (ErrorActionPreference: $ErrorActionPreference)" try { # Make sure that we don't continue on error, and that we catches the error $ErrorActionPreference = 'Stop' $p = @{ Session = $Session } $id = $Entry.Id $null = Invoke-PpsApiRequest @p -Uri "credential/$($Entry.Id)" -Data $Entry -Method Put # Return [PSCustomObject] @{ Id = $id Uri = "$($script:SessionList[$Session].Uri)/WebClient/Main?itemId=$id" } } catch { Write-Verbose -Message "Encountered an error: $_" Write-Error -ErrorAction $origErrorActionPreference -Exception $_.Exception } finally { $ErrorActionPreference = $origErrorActionPreference } Write-Verbose -Message 'Process end' } end { Write-Verbose -Message 'End' } } Export-ModuleMember -Function New-PpsEntry Export-ModuleMember -Function New-PpsGroup Export-ModuleMember -Function Connect-Pps Export-ModuleMember -Function Update-PpsEntry Export-ModuleMember -Function Invoke-PpsApiRequest Export-ModuleMember -Function Get-PpsEntry Export-ModuleMember -Function Get-PpsGroup |