Skip to content

feat: add 825 REST cmdlets - #482

Open
DeterminedExecution wants to merge 67 commits into
thycotic-ps:devfrom
DeterminedExecution:sls.ss-rest-port.dev
Open

DeterminedExecution wants to merge 67 commits into
thycotic-ps:devfrom
DeterminedExecution:sls.ss-rest-port.dev

Conversation

@DeterminedExecution

@DeterminedExecution DeterminedExecution commented Oct 17, 2026 •

Copy link
Copy Markdown
  • 825 new cmdlets cover the REST areas. Existing cmdlets only gain parameter sets or parameters; existing parameters keep their names, positions, Mandatory and aliases. No breaking changes: Get-TssSecretPasswordStatus now reads the published route with the same parameters and output (CHANGELOG General Updates). The New-TssSession Platform login changes are split out of this PR.
  • REST coverage goes from 228 to 1,151 of 1,327 verb+route rows (86.7 percent). Exported commands go from 262 to 1,087.
  • Every new cmdlet has full help, a doc page and a Pester shape test (29,794 passing, 0 failing). Live checks on on-prem and cloud had 0 failures. Start-TssUpgrade was dropped: on a multi-node farm its wait could end on another node's status.
  • Test-TssPlatformIntegration and Get-TssPlatformCompatibilityLevel stay in this PR. Small fixes to existing cmdlets are under Bug Fixes in the CHANGELOG.

Review changes

Your 2026-10-19 review, one commit per finding (69c4d8f to 766602b):

  • Platform sign-in for New-TssSession moved to its own branch (1a714f2). Its PR follows once the live test is done.
    1. Dropped New-TssActiveDirectoryDomain, Search-TssActiveDirectoryDomain and Start-TssActiveDirectorySync. The six new Directory cmdlets now use the DirectoryService noun (Get-/Set-TssDirectoryServiceConfiguration, Get-TssDirectoryServiceConfigurationAudit, Get-TssDirectoryServiceDomainStub, Search-TssDirectoryServiceSyncLog, Set-TssDirectoryServiceDomain), and class DirectoryDomain is now DirectoryServiceDomain. The legacy routes moved into existing cmdlets: Search-TssDirectoryServiceDomain -SearchText (GET active-directory/domains, fills DistinguishedName and SiteId; the default set returns both empty) and Start-TssDirectoryServiceSync -PassThru.
    1. New/Update/Remove-TssAdvancedConfigurationSetting show your warning text, ask to continue, then ShouldProcess. -Force skips the prompts; -WhatIf sends nothing.
    1. Set-TssDatabaseConfiguration warns the change is per web node and the session must point at that node.
    1. Set-TssPlatformConfiguration, Set-TssPlatformUserMapping, Reset-TssPlatformUserMapping, Enable-TssUnifiedMode and Set-TssUnifiedModeStatus warn the change can cut off Platform access. Invoke-TssPlatformProvision dropped.
    1. Start-TssSecretKeyRotation, Stop-TssSecretKeyRotation, Start-TssMekRotation, Restart-TssMekRotation and Update-TssKeyManagement warn a bad or interrupted change can leave secrets unreadable.
    1. Dropped the 9 PBA cmdlets (PBA is deprecated).
    1. Anchored the 20 v1 to v2/v3 ApiUrl rewrites to the end of the URL. tests/Module.ApiUrlRewrite.Tests.ps1 fails on a new unanchored ApiUrl -replace with a literal pattern, except in Search-TssConfigurationBackupLog and Search-TssSystemLog (pre-existing). It does not check .Replace() calls.
    1. Get-TssSecretPasswordStatus reads only the published route GET v1/secrets/secret-detail/{id}/password-status. -RestApi and the internal route are gone. Parameters and output match 0.62.1.

The 14 guarded cmdlets share one private helper, Confirm-TssDangerousOperation. Each has Pester tests for -Force, -WhatIf, the prompt, and nothing sent without -Force. The guard, -SearchText and -PassThru have Pester coverage only, no live runs yet.

Added after review

  • abd9dd3 docs: the CHANGELOG 0.63.0 section opens with General Updates, led by the Search-TssDirectoryServiceDomain output change. Get-TssSecretPasswordStatus moved there from Breaking Changes, since its parameters and output are unchanged.
  • f57c3d5 fix (Module import is about 3.5x slower in 0.63.0-alpha1 (30 s vs 8 s) #486): the release ships one psm1 with every function inlined instead of dot-sourcing 1,084 files at import. Cold import drops from about 26 s to about 1.1 s with the same 1,087 commands and parameter signatures. build.functions.ps1 adds Merge-ModuleFunction, which build.ps1 and build-release-only.ps1 call while staging. It fails the build if a function file would behave differently once inlined. tests/Module.FunctionInlining.Tests.ps1 adds 10 tests. Error positions now point at the psm1, and a #region functions/ marker names the source file.

Per area

Live cells = cmdlet x target (12.3 on-prem, Secret Server Cloud, Platform-connected vault). 62 not-applicable cells not counted.

Area Wave Scope New cmdlets Extended Live PASS OWED FAIL
auth 1 Platform integration probes 2 0 6 0 0
area-1 1 Unlimited admin 2 0 6 0 0
area-2 1 Custom lists 3 0 9 0 0
area-3 1 Reports 17 2 60 0 0
area-4 1 Proxy core 23 0 59 10 0
area-5 1 Template editing, MUST 24 2 78 0 0
area-6 1 Upgrade 15 0 4 11 0
area-7 1 Template editing, FULL 14 0 42 0 0
area-8 2 SSH adjuncts 33 0 73 26 0
w2-secrets 2 Secrets 27 1 70 14 0
w2-secrets-2 2 Secrets 23 2 61 14 0
w2-users 2 Users 25 3 68 16 0
w2-teams 2 Teams 14 0 42 0 0
w2-groups 2 Groups 12 0 36 0 0
w2-roles 2 Roles 10 0 30 0 0
w2-folders 2 Folders 6 0 18 0 0
w2-permissions 2 Secret / folder permissions 6 0 16 2 0
w2-rpc 2 RPC / dependencies 17 0 44 7 0
w2-rpc-2 2 RPC / dependencies 14 2 42 3 0
w2-heartbeat 2 Heartbeat 3 0 5 2 0
w2-engines 2 Distributed engines / sites / nodes 17 0 27 12 0
w2-launchers 2 Launchers config 26 0 64 14 0
w2-event-pipelines 2 Event pipelines 27 1 84 0 0
w2-password-reqs 2 Password reqs / char sets 11 0 33 0 0
w2-secret-policies 2 Secret policies 2 0 6 0 0
w2-metadata 2 Metadata 4 1 24 0 0
w2-ip-restrictions 2 IP restrictions 3 0 8 1 0
w2-scripts 2 Scripts 8 0 24 0 0
w3-config 3 Config / settings (other) 24 1 64 3 0
w3-config-2 3 Config / settings (other) 26 0 54 14 0
w3-config-3 3 Config / settings (other) 26 0 67 11 0
w3-discovery 3 Discovery 24 0 47 25 0
w3-discovery-2 3 Discovery 27 0 55 26 0
w3-discovery-3 3 Discovery 26 1 81 3 0
w3-inbox 3 Inbox / notifications / subscriptions 25 0 75 0 0
w3-inbox-2 3 Inbox / notifications / subscriptions 24 0 71 1 0
w3-platform-admin 3 Platform admin / migration 22 0 33 33 0
w3-platform-admin-2 3 Platform admin / migration 23 0 33 36 0
w3-external-vaults 3 External vaults / DSV 18 0 48 6 0
w3-external-vaults-2 3 External vaults / DSV 17 0 45 6 0
w3-access-requests 3 Access requests / workflows / dual control 30 0 64 26 0
w3-auth-clients 3 Auth / SDK / app clients / tokens 24 0 70 2 0
w3-diagnostics 3 Diagnostics / logs / audits 20 0 22 38 0
w3-session-recording 3 Session recording 19 0 30 27 0
w3-directory-services 3 Directory services 13 2 37 2 0
w3-dr 3 DR / replication 11 0 25 8 0
w3-key-management 3 Key management / HSM 8 0 15 9 0
w3-dashboard 3 Dashboard 10 0 30 0 0
w3-ticket-systems 3 Ticket systems 8 0 24 0 0
w3-licenses 3 Licenses 1 0 3 0 0
w3-bulk-ops 3 Bulk operations 11 0 29 4 0
Total 825 18 2061 412 0

OWED 412: no test environment, license, server-wide state with no safe undo, cloud-only, sign-in or account step declined, other. The 13 removed cmdlets (9 PBA, 3 ActiveDirectory, Invoke-TssPlatformProvision) are not in the counts.
Start-TssUpgrade (area-6) was dropped after QA (multi-node wait defect) and is not counted.

Backward compatibility

  • Existing parameters keep their names, positions, Mandatory and aliases. 9 cmdlets now name their default set where 0.62.1 had none (Search-TssDirectoryServiceDomain, Get-TssDiscoveryStatus, Search-TssEventPipeline, Export-TssReport, Add-TssSecretTemplateField, Get-TssSecretState, Get-TssUserAudit, Get-TssUserOwner, Lock-TssUser), and 3 declare an extra OutputType for the new switch (Get-TssSecretTemplate, Search-TssEventPipeline, Start-TssDirectoryServiceSync). Shape tests pin positions and Mandatory. Get-TssSecretPasswordStatus keeps its parameters and output but now calls the published route. Search-TssDirectoryServiceDomain output (DomainSummary) gains DistinguishedName and SiteId in every parameter set; the default set returns them empty, so scripts that export or compare whole objects see two new columns.
  • Name collisions extend the existing cmdlet additively (new parameter set or new parameter). Each needs your approval:
Existing cmdlet Wave Addition
Get-TssSecretTemplate 1 -Detail switch (v2 route)
Add-TssSecretTemplateField 1 Name set (posts a new field)
Export-TssReport 1 download set (CSV)
Get-TssSecretAttachment 2 outfile set
Get-TssSecretField 2 checkout set
Get-TssSecretState 2 flags and flagsV2 sets
Lock-TssUser 2 lockout set
Get-TssUserAudit 2 action set
Get-TssUserOwner 2 owner set
Get-TssSecretPasswordStatus 2 none: reads the published route instead of the internal one (CHANGELOG General Updates)
Search-TssEventPipeline 2 detailed set (-Detailed)
New-TssMetadataField 2 field set
New-TssScript 2 none: not changed on the branch
Search-TssAutoExportStorage 3 -ConfigurationId
Get-TssDiscoveryStatus 3 scanResults, itemMetrics and osMetrics sets
Search-TssDirectoryServiceDomain 3 searchText set (GET active-directory/domains)
Start-TssDirectoryServiceSync 3 -PassThru switch
  • Other existing cmdlets touched: Get-TssReportCategory and New-TssSecretDependency (fixes, see CHANGELOG Bug Fixes).

Coverage

Metric Before (0f6cc71) After (766602b)
Verb+route rows covered 228/1327 (17.2%) 1151/1327 (86.7%)
Exported commands 262 (259 functions + 3 cmdlets) 1087 (1084 functions + 3 cmdlets)
Pester 5222 passed, 0 failed 29794 passed, 0 failed

Evidence

Scrubbed excerpts from the live QA runs on 12.3 on-prem. <ss-url> = the instance, ids replaced.

Search-TssInboxMessage (inbox): only type 9 returned, equal to raw REST; same on Secret Server Cloud and a Platform vault.

PS> Search-TssInboxMessage -TssSession $session -MessageTypeId 9 -Verbose
VERBOSE: Performing the operation GET <ss-url>/api/v1/inbox/messages/9?take=2147483647

Search-TssUserTeam (users): equal to raw REST; -IncludeGroupMemberships adds the team held through a group.

PS> Search-TssUserTeam -TssSession $session -Id <user-id> -Verbose
VERBOSE: Performing the operation GET <ss-url>/api/v1/users/<user-id>/teams?take=2147483647

Set-TssDirectoryConfiguration (directory services, now Set-TssDirectoryServiceConfiguration): no request sent, stored config unchanged.

PS> Set-TssDirectoryConfiguration -TssSession $session -DaysToKeepOperationalLogs 99 -EnableDirectorySynchronization:$false -WhatIf
What if: Performing the operation "PATCH <ss-url>/api/v1/directory-services/configuration with: { "data": { "daysToKeepOperationalLogs": { "value": 99, "dirty": true }, "enableDirectorySynchronization": { "value": false, "dirty": true } } } " on target "Directory configuration".

Install-TssUpgrade (upgrade): no request sent, request body kept out of the What if text.

PS> Install-TssUpgrade -TssSession $session -ImpersonationCredential $cred -WhatIf
What if: Performing the operation "POST <ss-url>/api/v1/upgrade/install (request body not shown: it carries sensitive values)" on target "Upgrade".

Closes #486
Refs #481

-- Claude Code

DeterminedExecution and others added 30 commits October 17, 2026 02:58
New-TssSession sets platform (-PlatformUrl -Credential: Platform service user, client credentials grant at identity/api/oauth2/token/xpmplatform, scope xpmheadless, X-CENTRIFY-NATIVE-CLIENT header) and platformToken (-PlatformUrl -AccessToken, validated with the vault broker). The vault comes from GET vaultbroker/api/vaults (active vault: -VaultId, else global default, default, first) or -SecretServer, and must pass a trust check (https, Secret Server Cloud host, the Platform host, or -AllowedVaultHost) before any token is sent to it. Existing parameter sets, positions, the nts alias and the output type are unchanged. Refs thycotic-ps#481.
TssSession: AuthProvider, PlatformUrl, VaultId, VaultType, IsPlatformToken, AutoRefresh. SessionRefresh re-grants a Platform token only with -AutoRefresh (client secret held as a private SecureString, thycotic-ps#455). SessionExpire skips oauth-expiration for Platform tokens; Close-TssSession returns False with a verbose note.
New cmdlets: Get-TssPlatformVault (GET vaultbroker/api/vaults), Test-TssPlatformIntegration (GET platform/test-integration), Get-TssPlatformCompatibilityLevel (GET platform/compatibility-level).
Docs: command and type pages, Delinea Platform section on the authentication page.

Also squashed in:
- test: add Platform auth shape tests
- fix: keep secrets out of verbose output, report an unreachable Platform as unreachable

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Read the Unlimited Admin Mode state (GET configuration/unlimited-admin) and its audit log (GET configuration/unlimited-admin/audit). New class Thycotic.PowerShell.Configuration.UnlimitedAdminAudit; Get-TssUnlimitedAdmin reuses the existing UnlimitedAdmin class.

Also squashed in:
- test: add shape tests for Get-TssUnlimitedAdmin and Get-TssUnlimitedAdminAudit

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Get-TssListAudit reads a list's audit trail (GET lists/{id}/audits). New-TssListOption adds options with an optional category: many in one request (POST lists/{id}/options), one request per value with -Single (options/single), or from a file with -Path (options/file). Update-TssListOption updates options from Get-TssListOption objects (PUT lists/{id}/options), one option with -Single (options/single), or replaces all options with -Replace (options/replace). New class Thycotic.PowerShell.Lists.Audit; option output reuses Thycotic.PowerShell.Lists.Item.

Also squashed in:
- test: add shape tests for Get-TssListAudit, New-TssListOption and Update-TssListOption
- fix: Update-TssListOption -Category help matches server behavior

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Update-TssReport replaces a report definition (PUT reports/{id}); piping Get-TssReport keeps current values. Restore-TssReport undeletes a system report (PUT reports/{id}/undelete).
Search-TssReportAudit reads report audit entries, all or per report (GET reports/audits, reports/{id}/audits).
New-TssReportCategory and Set-TssReportCategory create and rename report categories (POST reports/categories, PATCH reports/categories/{id}).
Search-TssReportCategoryPermission and Search-TssReportPermission read category and report permissions, or the grantable role permissions with -Options (GET reports/categories/{id}/permissions, reports/categories/permissions/options, reports/{id}/permissions, reports/permissions/options).
Set-TssReportCategoryPermission and Set-TssReportPermission replace or clear explicit permissions; Set-TssReportPermission also toggles inheritance (PATCH reports/categories/{id}/permissions, reports/{id}/permissions).
Get-TssReportCategoryPermissionDefault reads the permissions a category passes down (GET reports/{id}/permissions-from-category).
Search-TssReportChartType lists chart types (GET reports/charttypes). Send-TssReportEmail emails a report (POST reports/{id}/email).
Set-TssReportSchedule changes a schedule's format, parameter values and schedule (PATCH reports/schedules/{id}); Restore-TssReportSchedule undeletes one (PUT reports/schedules/{id}/undelete); Get-TssReportScheduleStub returns a new-schedule stub (GET reports/schedules/stub/{id}).
Search-TssReportScheduleHistory lists a schedule's stored runs or returns one run (GET reports/schedules/{id}/history/search, reports/schedules/{id}/history); Save-TssReportScheduleHistory saves a run's report file (POST reports/schedules/{id}/history/download).
Export-TssReport gains a -Download parameter set that streams CSV (GET reports/download-csv); existing parameter sets unchanged.
New classes in Thycotic.PowerShell.Reports: Audit, ChartType, Permission, PermissionOption, ScheduleHistory, ScheduleHistorySummary. Schedule output reuses ReportSchedule, report output reuses Report.

Also squashed in:
- fix: type Reports.Permission Group and RolePermission as PSObject
- test: add shape tests for the report audit, category, permission and schedule cmdlets
- fix: Update-TssReport requires Description; Set-TssReportPermission help on inheritance
- fix: Export-TssReport export set and Get-TssReportCategory -Id and -All

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Get-TssProxyAudit: GET v1/proxy/audit
Get-TssProxyEndpointNotification: GET v1/proxy/endpoints/notification
Get-TssProxyExplanation: GET v1/proxy/explanation
Get-TssProxyRdpConfiguration: GET v1/proxy/rdp/config
Get-TssProxyRdpNotification: GET v1/proxy/rdp/notification
Get-TssProxySshClientHistory: GET v1/proxy/ssh/clienthistory
Get-TssProxySshConfiguration: GET v1/proxy/ssh/config
Get-TssProxySshNotification: GET v1/proxy/ssh/notification
Get-TssProxyState: GET v1/proxy/state
New-TssProxyRdpCertificate: POST v1/proxy/rdp/generate-certificate
New-TssProxySshClientOverride: POST v1/proxy/ssh/client-overrides
New-TssProxySshKey: POST v1/proxy/ssh/generate-key
Remove-TssProxySshClientOverride: DELETE v1/proxy/ssh/client-overrides/{clientOverrideId}
Search-TssProxyEndpoint: GET v1/proxy/endpoints
Search-TssProxySshClient: GET v1/proxy/ssh/clients
Search-TssProxySshClientOverride: GET v1/proxy/ssh/client-overrides
Set-TssProxyEndpointEngine: PATCH v1/proxy/endpoints/engines/{id}
Set-TssProxyEndpointNode: PATCH v1/proxy/endpoints/nodes/{id}
Set-TssProxyEndpointSite: PATCH v1/proxy/endpoints/sites/{id}
Set-TssProxyRdpConfiguration: PATCH v1/proxy/rdp/config
Set-TssProxySshClient: PATCH v1/proxy/ssh/clients/{clientId}
Set-TssProxySshClientOverride: PATCH v1/proxy/ssh/client-overrides/{clientOverrideId}
Set-TssProxySshConfiguration: PATCH v1/proxy/ssh/config

Set-TssProxyEndpointSite sends the current RDP proxy certificate secret back when the parameter is omitted, because the API clears it otherwise.

Also squashed in:
- test: add shape tests for proxy core cmdlets
- fix: proxy notification text and SSH client history filters

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Copy-TssSecretTemplate: POST secret-templates/{id}/copy
Export-TssSecretTemplate: GET secret-templates/{id}/export
Import-TssSecretTemplate: POST secret-templates/import
Update-TssSecretTemplate: PATCH v2 secret-templates/{id}
Get-TssSecretTemplate: new -Detail switch, GET v2 secret-templates/{id}
Add-TssSecretTemplateField: new Name parameter set, POST secret-templates/{id}/fields
Get-TssSecretTemplateField: GET secret-templates/fields/{id}, GET secret-templates/fields/basic/{templateId}
Get-TssSecretTemplateFieldStub: GET secret-templates/fields/stub
Search-TssSecretTemplateField: GET secret-templates/fields/search, GET secret-templates/fields/search-basic
Set-TssSecretTemplateField: PATCH secret-templates/fields/{id}
Remove-TssSecretTemplateField: DELETE secret-templates/fields/{id}
Set-TssSecretTemplateFieldOrder: POST secret-templates/{id}/fields/sort
Get-TssSecretTemplateLauncher: GET secret-templates/{id}/launchers/{launcherTypeId}
Get-TssSecretTemplateLauncherStub: GET secret-templates/{id}/launchers/{launcherTypeId}/stub
New-TssSecretTemplateLauncher: POST secret-templates/{id}/launchers/{launcherTypeId}
Set-TssSecretTemplateLauncher: PATCH secret-templates/{id}/launchers/{launcherTypeId}
Remove-TssSecretTemplateLauncher: DELETE secret-templates/{id}/launchers/{launcherTypeId}
Search-TssSecretTemplateLauncher: GET secret-templates/launchers, GET secret-templates/launcher-types
Get-TssSecretTemplatePasswordType: GET secret-templates/{id}/password-type
Set-TssSecretTemplatePasswordType: PATCH secret-templates/{id}/password-type
Update-TssSecretTemplatePasswordType: PUT secret-templates/password-type/{id}
Search-TssSecretTemplateSimple: GET secret-templates-list
Search-TssSecretTemplatePermission: GET secret-template-permissions
Get-TssSecretTemplatePermissionGrouped: GET secret-template-permissions/grouped
Search-TssSecretTemplatePermissionRole: GET secret-template-permissions/roles
Update-TssSecretTemplatePermission: PUT secret-template-permissions, PUT secret-template-permissions/{id}

Also squashed in:
- test: add shape tests for the secret template editing cmdlets
- fix: correct secret template editing cmdlets found in QA
- test: pin Copy-TssSecretTemplate -Name as mandatory

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Clear-TssUpgradeInProgress: POST diagnostics/clear-upgrade-in-progress
Complete-TssManualUpgrade: POST configuration/finish-manual-upgrade
Confirm-TssManualUpgradeStaging: POST upgrade/manual/staging-test-successful
Get-TssManualUpgradeState: GET upgrade/manual/state
Get-TssUpgradeState: GET upgrade/state
Get-TssUpgradeStatus: GET upgrade/upgrade-status
Install-TssUpgrade: POST upgrade/install (ConfirmImpact High)
New-TssManualUpgradeAppZip: POST upgrade/manual/generate-application-zip
New-TssManualUpgradeSqlScript: POST upgrade/manual/generate-sql-script
Save-TssManualUpgradePackage: GET v2 upgrade/manual/download, -Base64 uses GET v1 upgrade/manual/download
Search-TssManualUpgradeNode: GET upgrade/manual/nodes
Set-TssUpgradeIgnoreVersionMismatch: POST configuration/set-ignore-version-mismatch-on-upgrade
Start-TssUpgrade: download (optional), install and poll to completion, PATCH configuration/read-only-mode (ConfirmImpact High)
Start-TssUpgradeDownload: POST upgrade/download
Stop-TssManualUpgrade: POST upgrade/manual/cancel
Test-TssManualUpgradeSqlDelta: POST upgrade/manual/verify-sql-deltas

All on-premises only. Impersonation account is a -ImpersonationCredential PSCredential.

Also squashed in:
- test: add shape tests for upgrade and manual upgrade cmdlets
- fix: Start-TssUpgrade fast failure and v2 URL in Save-TssManualUpgradePackage
- fix: Start-TssUpgrade ignores a stale failed status from another node

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…enerated password cmdlets

Get-TssExtendedFieldRegex: GET extended-fields/regex/{secretId}
Get-TssPasswordDictionary: GET secret-templates/password-requirements/password-dictionaries/{id}
Get-TssSecretTemplateExtendedMapping: GET secret-templates/{secretTemplateId}/extended-mappings/{extendedTypeId}
Get-TssSecretTemplateExtendedMappingStub: GET secret-templates/{secretTemplateId}/extended-mappings/{extendedTypeId}/stub
New-TssGeneratedPassword: POST secret-templates/generate-password/{secretfieldId}
New-TssPasswordDictionary: POST secret-templates/password-requirements/password-dictionaries
New-TssSecretTemplateExtendedMapping: POST secret-templates/{secretTemplateId}/extended-mappings/{extendedTypeId}
Remove-TssPasswordDictionary: DELETE secret-templates/password-requirements/password-dictionaries/{id}
Remove-TssSecretTemplateExtendedMapping: DELETE secret-templates/{secretTemplateId}/extended-mappings/{extendedTypeId}
Search-TssPasswordDictionary: GET secret-templates/password-requirements/password-dictionaries
Search-TssSecretTemplateExtendedMapping: GET secret-templates/extended-mappings
Search-TssSecretTemplateExtendedType: GET secret-templates/extended-types
Set-TssSecretTemplateExtendedMapping: PATCH secret-templates/{secretTemplateId}/extended-mappings/{extendedTypeId}
Update-TssPasswordDictionary: PUT secret-templates/password-requirements/password-dictionaries

New classes: ExtendedFields.Regex, SecretTemplates.ExtendedMapping, ExtendedMappingSummary, ExtendedMappingDelete, ExtendedType, PasswordDictionary, PasswordDictionaryDelete. Command and type doc pages included.

Also squashed in:
- test: add shape tests for the template extended mapping, password dictionary and generated password cmdlets
- fix: Get-TssPasswordDictionary help states the server returns items sorted, not in file order

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ts, menus, cipher suites)

- Get-TssJumpboxRoute: GET v1/jumpbox-route/{id}
- Get-TssJumpboxRouteAudit: GET v1/jumpbox-route/{id}/audit
- Get-TssJumpboxRouteLevel: GET v1/jumpbox-route/{id}/level
- Get-TssJumpboxRouteUser: GET v1/jumpbox-route/user
- New-TssJumpboxRoute: POST v1/jumpbox-route
- New-TssJumpboxRouteLevel: POST v1/jumpbox-route/{id}/level
- Remove-TssJumpboxRouteLevel: DELETE v1/jumpbox-route/{id}/level/{order}
- Search-TssJumpboxRoute: GET v1/jumpbox-route/search
- Set-TssJumpboxRoute: PATCH v1/jumpbox-route/{id}
- Set-TssJumpboxRouteLevel: PATCH v1/jumpbox-route/{id}/level/{order}
- Get-TssSshCipherSuite: GET v1/ssh-cipher-suite/{id}
- Get-TssSshCipherSuiteAudit: GET v1/ssh-cipher-suite/{id}/audit
- Search-TssSshCipherSuite: GET v1/ssh-cipher-suite/search
- Set-TssSshCipherSuite: PATCH v1/ssh-cipher-suite/{id}
- Search-TssSshCipher: GET v1/ssh-ciphers/search
- Get-TssSshCommand: GET v1/ssh-command/{id}
- Get-TssSshCommandStub: GET v1/ssh-command/stub
- New-TssSshCommand: POST v1/ssh-command
- Search-TssSshCommand: GET v1/ssh-command/list
- Set-TssSshCommand: PATCH v1/ssh-command/{sshCommandId}
- Get-TssSshCommandBlocklist: GET v1/ssh-command-blocklist/{id}
- Get-TssSshCommandBlocklistPolicy: GET v1/ssh-command-blocklist/policies
- Get-TssSshCommandBlocklistStub: GET v1/ssh-command-blocklist/stub
- New-TssSshCommandBlocklist: POST v1/ssh-command-blocklist
- Search-TssSshCommandBlocklist: GET v1/ssh-command-blocklist/list
- Set-TssSshCommandBlocklist: PATCH v1/ssh-command-blocklist/{sshCommandBlocklistId}
- Get-TssSshCommandItemAudit: GET v1/ssh-command-item/audit/search
- Get-TssSshCommandMenu: GET v1/ssh-command-menu/{sshCommandMenuId}
- Get-TssSshCommandMenuAudit: GET v1/ssh-command-menu/audit/search
- Get-TssSshCommandMenuState: GET v1/ssh-command-menu/state
- New-TssSshCommandMenu: POST v1/ssh-command-menu
- Search-TssSshCommandMenu: GET v1/ssh-command-menu/search
- Set-TssSshCommandMenu: PATCH v1/ssh-command-menu/{sshCommandMenuId}

Also squashed in:
- test: add shape tests for the SSH adjunct cmdlets
- fix: SSH adjunct searches honor their documented filter defaults

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…extension cmdlets

Export-TssBundle: POST v1/bundle/export
Get-TssEnterpriseSearchRequest: GET v1/enterprise/search-request/{requestId}
New-TssEnterpriseSearchRequest: POST v1/enterprise/search-request
Get-TssSecretEraseRequest: GET v1/secret-erase-requests/{id}
Get-TssSecretEraseRequestHistory: GET v1/secret-erase-requests/{id}/history
Get-TssSecretEraseRequestInbox: GET v1/secret-erase-requests/inbox
New-TssSecretEraseRequest: POST v1/secret-erase-requests
Search-TssSecretEraseRequest: GET v1/secret-erase-requests/search
Search-TssSecretEraseSecret: GET v1/secret-erase-requests/secrets
Start-TssSecretErase: GET v1/secret-erase-requests/run-now
Update-TssSecretEraseRequest: PUT v1/secret-erase-requests
Get-TssSecretExtensionAutofillValue: POST v1/secret-extensions/autofill-values
Search-TssSecretExtensionAd: POST v1/secret-extensions/search-ad-secrets-by-domain
Search-TssSecretExtensionWindowsAccount: POST v1/secret-extensions/search-windows-account-secrets-by-computer-name
Enable-TssSecret: PUT v3/secrets/{id}/activate
Export-TssSecretBulk: POST v1/secrets/export, v2/secrets/export/job
Get-TssSecretAssociatedSecret: GET v1/secrets/{secretId}/launchers/{id}/associated-secrets
Get-TssSecretBulkExport: GET v2/secrets/export, v2/secrets/export/{jobId}/details, v2/secrets/export/job/{jobId}
Get-TssSecretConvertInfo: POST v1/secrets/get-convert-info
Get-TssSecretDetail: GET v1/secrets/secret-detail/{id}/general
Import-TssSecretCsv: POST v1/secrets/import-csv-process, v1/secrets/import-csv-verify
Invoke-TssSecretCheckout: POST v1/secrets/{id}/check-out
Invoke-TssSecretExtendCheckout: POST v1/secrets/{id}/extend-check-out
Search-TssSecretExtended: POST v1/secrets/extended-search-details
Search-TssSecretFavorite: GET v1/secrets/favorite
Set-TssSecretFavorite: POST v1/secrets/{secretId}/favorite
Update-TssSecretAssociatedSecret: PUT v1/secrets/{secretId}/launchers/{id}/associated-secrets
Get-TssSecretAttachment: new -OutFile parameter set, GET v1/secrets/{id}/fields/{slug}; existing sets unchanged

Also squashed in:
- test: add shape tests for the secrets area cmdlets
- fix: secrets area cmdlets return the live response shapes

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
New cmdlets:
Approve-TssSecretForceCheckout: POST v1/secrets/{id}/approve-force-check-out-request
Convert-TssSecretTemplate: POST v1/secrets/convert-template
Get-TssSecretFieldListDetail: GET v1/secrets/{id}/fields/{slug}/listdetails
Get-TssSecretForceCheckoutDetail: GET v1/secrets/get-force-checkout-request-details/{secretId}/{requesterId}
Get-TssSecretHasAny: GET v2/secrets/has-any
Get-TssSecretHealthExposure: GET v1/secrethealth/exposure
Get-TssSecretImportConfiguration: GET v1/secrets/import-configuration
Get-TssSecretMfa: GET v1/secrets/{id}/mfa
Get-TssSecretPreview: GET v1/secrets/{id}/preview
Get-TssSecretSearchTotal: GET v2/secrets/search-total
Get-TssSecretTransitionHistory: GET v1/secrets/{secretId}/transition-history
Import-TssSecretXml: POST v1/secrets/import-xml-process
Remove-TssSecretFieldListDetail: DELETE v1/secrets/{id}/fields/{slug}/listdetails
Request-TssSecretForceCheckout: POST v1/secrets/{id}/request-force-check-out
Search-TssSecretField: GET v1/secrets/{id}/fields/{slug}/list
Search-TssSecretIds: GET v1/secrets/search-for-ids
Search-TssSecretSshRestrictedCommand: GET v1/secrets/{id}/ssh-restricted-commands
Set-TssSecretSecurityMfa: PATCH v1/secrets/{id}/security-multifactor-authentication
Set-TssSecretShare: PATCH v1/secrets/{secretId}/share
Update-TssSecretFieldListDetail: PUT v1/secrets/{id}/fields/{slug}/listdetails
Update-TssSecretJumpboxRouteSelection: PUT v1/secret-detail/{secretId}/jumpbox-route-selection
Update-TssSecretSecurityApproval: PUT v3/secrets/{id}/security-approval
Update-TssSecretSshRestrictedCommand: PUT v1/secrets/{secretId}/update-ssh-restricted-commands

Extended additively (new parameter sets, existing sets unchanged):
Get-TssSecretField: checkout set, GET v1/secrets/{id}/fields/{slug} with autoCheckout, autoCheckIn, autoComment
Get-TssSecretState: flags and flagsV2 sets, GET v1/secrets/{id}/state/flags, GET v2/secrets/{id}/state/flags

Also squashed in:
- test: add shape tests for the secret search, state, security and list field cmdlets
- fix: correct SSH restriction and approval type help

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ctivity cmdlets

Add-TssUserOwner: POST v1/users/{id}/owners
Add-TssUserRole: POST v1/users/{id}/roles
Disable-TssUserSshKey: PATCH v1/users/public-ssh-keys/{id}
Find-TssApplicationAccount: GET v1/application-accounts/lookup
Get-TssCurrentUserSummary: GET v1/users/current-summary
Get-TssUserPreference: GET v1/users/preference
Get-TssUserSecretActivity: GET v1/users/{userId}/secret-activity
Get-TssUserStub: GET v1/users/stub
Get-TssUserTotpStatus: GET v1/users/totp-status
Invoke-TssExpireUserSecretActivity: POST v1/users/{userId}/secret-activity/expire
Invoke-TssForgotPassword: POST v1/users/forgot-password
New-TssUserSshKey: POST v1/users/public-ssh-keys
Remove-TssUser: DELETE v1/users/{id}
Remove-TssUserGroup: DELETE v1/users/{id}/groups
Remove-TssUserOwner: DELETE v1/users/{id}/owners/{ownerId}
Remove-TssUserRole: DELETE v1/users/{id}/roles
Reset-TssUserTwoFactor: POST v1/users/{userId}/reset-two-factor
Search-TssUserSession: GET v1/users/sessions
Search-TssUserSshKey: GET v1/users/public-ssh-keys
Search-TssUserTeam: GET v1/users/{userId}/teams
Set-TssUserOwner: PATCH v1/users/{id}/owners
Stop-TssUserSession: POST v1/users/sessions/terminate
Test-TssCurrentUserPassword: POST v1/users/verify-password
Update-TssDefaultAppSettings: PUT v1/users/set-default-app-settings
Update-TssDoubleLockPassword: PUT v1/users/doublelock-password
Get-TssUserAudit: new action set, GET v1/users/action/audit
Get-TssUserOwner: new owner set, GET v1/users/{id}/owners/{ownerId}
Lock-TssUser: new lockout set, POST v1/users/{userId}/lock-out

Also squashed in:
- test: add shape tests for the user cmdlets
- fix: Get-TssUserPreference reads named preferences; Update-TssDoubleLockPassword help
- fix: Update-TssDoubleLockPassword help says the unlock is per user

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Get-TssTeam: GET teams/{id}
Get-TssTeamStub: GET teams/stub
New-TssTeam: POST teams
Search-TssTeam: GET teams
Update-TssTeam: PUT teams/{id}
Get-TssTeamAudit: GET teams/{id}/audits
Add-TssTeamList: POST teams/{id}/lists, keeps existing lists unless -Replace
Search-TssTeamList: GET teams/{id}/lists, GET teams/lists with -SearchText
Add-TssTeamMember: POST v2 teams/{id}/members, POST v1 with -Replace
Get-TssTeamMember: GET teams/{id}/members
Search-TssTeamMember: GET teams/{id}/members/search
Remove-TssTeamMember: DELETE teams/{id}/members
Add-TssTeamSite: POST teams/{id}/sites, keeps existing sites unless -Replace
Search-TssTeamSite: GET teams/{id}/sites

Also squashed in:
- test: add shape tests for the team cmdlets
- fix: team list restriction kept, team site and member search help

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…audit)

Remove-TssGroup: DELETE groups/{id} (disables the group)
Set-TssGroup: PATCH groups/{groupId}
Update-TssGroup: PUT groups/{id}
Get-TssGroupAudit: GET groups/audit
Get-TssGroupPlatform: GET groups/platform/{adGuid}
Get-TssGroupStub: GET groups/stub
Add-TssGroupRole: POST groups/{id}/roles
Remove-TssGroupRole: DELETE groups/{id}/roles
Update-TssGroupRole: PUT v2 groups/{id}/roles
Set-TssGroupMember: PATCH groups/{id}/users
Search-TssGroupUser: GET groups/{id}/users/search
Find-TssGroupUser: GET groups/{id}/users-lookup

New classes: Groups.Audit, Groups.MemberChangeStatus, Groups.MemberSummary,
Groups.RoleChangeStatus. Group-returning cmdlets reuse Groups.Group with the
Get-TssGroup owner projection.

Also squashed in:
- test: add shape tests for the group cmdlets
- fix: Update-TssGroupRole only swaps the trailing api/v1 for api/v2

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Get-TssRole: GET roles/{id}
Get-TssRoleStub: GET roles/stub
Get-TssRoleUnassignedPermission: GET rolepermissions/unassigned, one string per permission name
New-TssRole: POST roles, -Enabled switch, created disabled when omitted
Set-TssRole: PATCH roles/{id}, sends only the fields passed
Search-TssRoleAudit: GET role-audits, always sends filter.auditType (default All) and a dateRecorded sort because the server returns 500 without either
Search-TssRoleGroup: GET roles/{id}/groups
Set-TssRoleGroup: PATCH roles/{roleId}/groups, -GroupIdToAdd and -GroupIdToRemove
Search-TssRolePermission: GET roles/{id}/permissions, -Eligible and -Unassigned switch sets for the eligible and unassigned routes
Update-TssRolePermission: PUT roles/{id}/permissions, replaces the full set, empty list allowed

New classes: Roles.Audit, Roles.Group, Roles.Permission, Roles.UpdateResult. Command and type doc pages included.

Also squashed in:
- test: add shape tests for the role cmdlets
- fix: correct role group and unassigned permission help

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…lder stub cmdlets

Add-TssFolderTemplate: POST folders/{id}/templates
Get-TssFolderPinned: GET folders/pinned
Get-TssFolderStub: GET folders/stub
Remove-TssFolderPinned: DELETE folder/{id}/pinned
Set-TssFolderPermission: PATCH folder/{folderId}/permissions
Set-TssFolderPinned: PATCH folder/{id}/pinned

New classes: Folders.ActionResult, Folders.Pinned, Folders.TemplateAssociation. Get-TssFolderStub reuses Folders.Folder. Command and type doc pages included.

Also squashed in:
- test: add shape tests for the folder pin, permission and template cmdlets

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…er check and platform permission cmdlets

Get-TssFolderPermissionStub: GET v1/folder-permissions/stub
Get-TssSecretPermissionDetail: GET v1/secret-permissions/{id}
Get-TssSecretPermissionRoleOption: GET v1/secret-permissions/role-options
Get-TssSecretPermissionStub: GET v1/secret-permissions/stub
Get-TssSecretPlatformPermission: GET v1/secret-permissions/platform-permission
Set-TssSecretPlatformPermission: POST v1/secret-permissions/platform-permission
Test-TssSecretOwner: POST v1/secret-permissions/is-current-user-secret-owner

Also squashed in:
- test: add shape tests for the secret and folder permission cmdlets
- fix: secret permission stub and platform permission errors on unreachable secrets; help corrections
- fix: remove Get-TssSecretPlatformPermission, its GET route always returns 500

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…dependency changer cmdlets

Start-TssConfigurationRpc: POST v1/configuration/rpc/run-now
Get-TssDependencyChanger: GET v1/dependency-changers/dependency-changer/{id}
New-TssDependencyChanger: POST v1/dependency-changers/dependency-changer
Search-TssDependencyChanger: GET v1/dependency-changers/dependency-changers
Search-TssDependencyChangerScript: GET v1/dependency-changers/dependency-changer-scripts
Search-TssDependencyChangerSetting: GET v1/dependency-changers/dependency-changer-settings
Search-TssDependencyScanField: GET v1/dependency-changers/scan-fields
Set-TssDependencyChanger: PATCH v1/dependency-changers/dependency-changer/{id}
New-TssCustomCommand: POST v1/remote-password-changing/custom-commands
Remove-TssCustomCommand: DELETE v1/remote-password-changing/custom-commands/{id}
Save-TssCustomCommand: POST v1/remote-password-changing/custom-commands/{id}
Search-TssCustomCommand: GET v1/remote-password-changing/custom-commands/{id}
Test-TssCustomCommand: POST v1/remote-password-changing/custom-command/test
Update-TssCustomCommand: PUT v1/remote-password-changing/custom-commands/{id}
New-TssPasswordType: POST v1/remote-password-changing/password-types
Remove-TssPasswordType: DELETE v1/remote-password-changing/password-types/{id}
Update-TssPasswordType: PUT v1 and v2 remote-password-changing/password-types/{id}

Also squashed in:
- test: add shape tests for the custom command, password type, dependency changer and RPC run-now cmdlets
- fix: password type v2 URL and password type, dependency changer help defects
- fix: Set-TssDependencyChanger help, password change slot cannot be removed

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…, scan fields, RPC scripts)

Get-TssPasswordTypeAuth: GET remote-password-changing/password-type-auth/{id}
New-TssPasswordTypeAuth: POST remote-password-changing/password-type-auth/{id}
Set-TssPasswordTypeAuth: PATCH remote-password-changing/password-type-auth/{id}
Get-TssPasswordTypeUsage: GET remote-password-changing/password-type-usage
Get-TssRpcLdapSettings: GET remote-password-changing/ldap-settings/{id}
Set-TssRpcLdapSettings: PATCH remote-password-changing/ldap-settings/{id}
Get-TssRpcScanTemplate: GET remote-password-changing/scan-templates
Set-TssRpcScanTemplateField: PATCH remote-password-changing/scan-templates-fields/{id}
Update-TssSecretDependency: PUT secret-dependencies/{id}
Update-TssSecretDependencyGroup: PUT secret-dependencies/groups/{secretId}
Remove-TssSecretDependencyGroup: DELETE secret-dependencies/groups/{id}
Invoke-TssSecretChangePassword: POST secrets/{id}/change-password
Get-TssSecretRpcScript: GET v3 secrets/{id}/rpc-script-secrets
Update-TssSecretRpcScript: PUT v3 and v2 secrets/{id}/rpc-script-secrets
Get-TssSecretPasswordStatus: new -RestApi switch for GET secrets/secret-detail/{id}/password-status

New classes: Rpc.PasswordTypeAuth, Rpc.PasswordTypeUsage, Rpc.LdapSettings,
Rpc.ScanTemplate, Rpc.ScanTemplateField, Secrets.RpcDetail. Command and
type pages added; the Get-TssSecretPasswordStatus shape test knows -RestApi.

Also squashed in:
- test: add shape tests for RPC and secret dependency cmdlets
- fix: Get/Update-TssSecretRpcScript keep the server host in v2/v3 URLs; Get-TssSecretPasswordStatus -RestApi writes no internal endpoint note
- fix: New-TssSecretDependency sends unset optional secret ids as null

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Start-TssHeartbeat: POST configuration/heartbeat/run-now, returns the success flag
Get-TssHeartbeatLog: GET diagnostics/heartbeat-logs, parses the server CSV text into entries (on-prem only)
Get-TssHeartbeatStatusOverview: GET remote-password-changing/heartbeat-status-overview

New classes: Diagnostics.HeartbeatLog, Rpc.HeartbeatStatusOverview, Rpc.HeartbeatStatusCount. Command and type doc pages included.

Also squashed in:
- test: add shape tests for the heartbeat cmdlets
- fix: correct Start-TssHeartbeat help on per-secret run now

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…r node cmdlets

Get-TssDistributedEngineSettings: GET distributed-engine/engine-settings/{engineId}, GET distributed-engine/engine-settings/site/{siteId}
Set-TssDistributedEngineSettings: PATCH distributed-engine/engine-settings/{engineSettingsId}, PATCH distributed-engine/engine-settings/engine/{engineId}
Set-TssDistributedEngineLatestVersion: PATCH distributed-engine/configuration/engine-latest-version
Move-TssDistributedEngine: POST distributed-engine/engine/{engineId}/migrate
Search-TssDistributedEngineAudit: GET distributed-engine/site/{siteId}/engine-audits
Get-TssDistributedEngineSiteAudit: GET distributed-engine/site/{id}/audit
Search-TssDistributedEngineSiteLog: GET distributed-engine/site/{id}/logs
Get-TssDistributedEngineSiteStub: GET distributed-engine/site/stub
Move-TssDistributedEngineSiteSecret: POST distributed-engine/site/{id}/reassign
Test-TssDistributedEngineSiteConnectivity: POST distributed-engine/site/{siteId}/validate-connectivity
Get-TssDistributedEngineSiteConnectorStub: GET distributed-engine/site-connector/stub
Get-TssDistributedEngineSiteConnectorDownload: GET distributed-engine/site-connector/{id}/download-memorymq
Get-TssServerNode: GET nodes/{nodeId}
Get-TssServerNodeAudit: GET nodes/audit
Set-TssServerNodeConfiguration: POST nodes/{nodeId}/configuration
Get-TssServerNodeState: GET nodes-state
Set-TssServerNodeState: PATCH nodes-state

New classes: DistributedEngines.EngineAudit, EngineLatestVersion, EngineMigration, EngineSetting, EngineSettings, SiteAudit, SiteConnectivity, SiteLog; ServerNodes.Audit, Node, State, StateUpdate. Site and SiteConnector reused. SiteConnectorQueueType gains RabbitMqQuorum. Command and type doc pages included.

Also squashed in:
- test: add shape tests for the distributed engine, site and server node cmdlets
- fix: correct distributed engine and server node help to match server behavior

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Find-TssLauncher: GET launchers/lookup
Get-TssLauncher: GET launchers/{id}
Search-TssLauncher: GET launchers
Get-TssLauncherType: GET launchers/types/{launcherTypeId}
New-TssLauncherType: POST launchers/types
Set-TssLauncherType: PATCH launchers/types/{launcherTypeId}
Set-TssLauncherTypeFileAttachment: POST launchers/types/file-attachments
Get-TssLauncherAgent: GET launcheragents/{id}
Search-TssLauncherAgent: GET launcheragents
Search-TssLauncherAgentIssue: GET launcheragents/issues
Update-TssLauncherAgent: PUT launcheragents/{id} (reads the agent first, omitted values kept)
Get-TssLauncherAgentAudit: GET launcheragents/audit, launcheragents/{id}/audit
Get-TssLauncherAgentCollection: GET launcheragents/collections/{id}
Get-TssLauncherAgentCollectionStub: GET launcheragents/collections/stub
New-TssLauncherAgentCollection: POST launcheragents/collections
Search-TssLauncherAgentCollection: GET launcheragents/collections
Update-TssLauncherAgentCollection: PUT launcheragents/collections/{id} (reads the collection first, omitted values kept)
Get-TssLauncherAgentCollectionAudit: GET launcheragents/collections/audit, launcheragents/collections/{id}/audit
Get-TssLauncherAgentConfigurationState: GET launcheragents/configuration-state
Get-TssConnectionManagerSettings: GET connection-manager-settings
Set-TssLauncherSettings: PATCH configuration/launcher-settings
Set-TssProtocolHandlerSettings: PATCH configuration/protocol-handler-settings
Set-TssRdsSessionConnector: PATCH configuration/rds-session-connector (-Enabled required by the server)
Search-TssSecretLauncherSession: GET secrets/launcher-sessions
Set-TssSecretLauncherSession: PATCH secrets/launcher-sessions
Update-TssSecretWebLauncher: PUT secrets/{id}/web-launcher-settings

New classes under Launchers, LauncherAgents, ConnectionManager, Configuration and Secrets, with command and type doc pages.

Also squashed in:
- test: add shape tests for the launcher, launcher agent and launcher settings cmdlets
- fix: launcher agent audit, launcher session and launcher help defects

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
New-TssEventPipeline: POST event-pipeline
Update-TssEventPipeline: PUT event-pipeline/{id}
Update-TssEventPipelineOrder: PUT event-pipeline/{id}/order
Get-TssEventPipelineTrigger: GET event-pipeline/{id}/trigger
Get-TssEventPipelineTriggerOption: GET event-pipeline/trigger/options
Get-TssEventPipelineTriggerStub: GET event-pipeline/trigger/stub
Get-TssEventPipelineStub: GET event-pipeline/stub
Search-TssEventPipeline -Detailed: GET event-pipeline/list
Search-TssEventPipelineAudit: GET event-pipeline-audit
Get-TssEventPipelineFilterOption: GET event-pipeline-settings/filter/options
Get-TssEventPipelineFilterSetting: GET event-pipeline-settings/filter-settings/list/{id}
Get-TssEventPipelineTaskOption: GET event-pipeline-settings/tasks/options
Get-TssEventPipelineTaskSetting: GET event-pipeline-settings/task-settings/list/{id}
Search-TssEventPipelineTask: GET event-pipeline-settings/task/list
New-TssEventPipelinePolicy: POST event-pipeline-policy
Update-TssEventPipelinePolicy: PUT event-pipeline-policy/{id}
Update-TssEventPipelinePolicyOrder: PUT event-pipeline-policy/{id}/order
Copy-TssEventPipelinePolicy: POST event-pipeline-policy/duplicate
Export-TssEventPipelinePolicy: GET event-pipeline-policy/export/{id}
Import-TssEventPipelinePolicy: POST event-pipeline-policy/import
Search-TssEventPipelinePolicyFolder: GET event-pipeline-policy/{id}/folders
Update-TssEventPipelinePolicyFolder: PUT event-pipeline-policy/{id}/folders
Get-TssEventPipelinePolicyFolderChild: GET event-pipeline-policy/{id}/folders/{folderId}/childdata
Search-TssEventPipelinePolicyGroup: GET event-pipeline-policy/{id}/groups
Update-TssEventPipelinePolicyGroup: PUT event-pipeline-policy/{id}/groups
Get-TssEventPipelinePolicyGroupCount: GET event-pipeline-policy/{id}/groups/count
Search-TssEventPipelinePolicyRun: GET event-pipeline-policy/runs
Search-TssEventPipelinePolicySecretPolicy: GET event-pipeline-policy/{id}/secretpolicies

Search-TssEventPipeline gains a -Detailed parameter set; its existing parameters and summary output are unchanged. Update-TssEventPipeline sends unbound triggers, tasks and filters as not dirty so the server keeps them. New classes under EventPipeline and EventPipelinePolicy with type pages; command pages included.

Also squashed in:
- test: add shape tests for the event pipeline and event pipeline policy cmdlets
- fix: event pipeline task, trigger and filter lists; policy filter on Search-TssEventPipeline; drop no-op audit policy filter

Integration: the command pages live in the existing docs/commands/event-pipelines and event-pipeline-policies folders (plural since 0.62.0, Search-TssEventPipeline keeps its redirect), and the new cmdlets' docs links point there.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Get-TssCharacterSet: GET character-sets/{id}
Search-TssCharacterSet: GET character-sets, -Status Active, Inactive or All
New-TssCharacterSet: POST character-sets, -Active switch, created inactive when omitted
Set-TssCharacterSet: PATCH character-sets/{id}, sends only the fields passed
Get-TssCharacterSetAudit: GET character-sets/{id}/audit
Get-TssPasswordRequirement: GET password-requirements/{id}
Search-TssPasswordRequirement: GET password-requirements
New-TssPasswordRequirement: POST password-requirements, -Rule takes hashtables or rule objects from Get-TssPasswordRequirement
Set-TssPasswordRequirement: PATCH password-requirements/{id}, sends only the fields passed
Get-TssPasswordRequirementAudit: GET password-requirements/{id}/audit
Update-TssPasswordRequirementRule: PUT password-requirements/{id}/rules, replaces the full rule set, empty list allowed

New classes: CharacterSets.CharacterSet, CharacterSets.Audit, PasswordRequirements.PasswordRequirement, PasswordRequirements.PasswordRequirementItem, PasswordRequirements.Audit. Command and type doc pages included.

Also squashed in:
- test: add shape tests for the character set and password requirement cmdlets
- fix: require AllowedCharacterSetId on New-TssPasswordRequirement, correct audit help

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
New cmdlets:
Get-TssSecretPolicyAudit: GET v1/secret-policy/{id}/audit
Get-TssSecretPolicyStatus: GET v1/secret-policy/{id}/status

Also squashed in:
- test: add shape tests for the secret policy audit and status cmdlets
- fix: pass -IncludeInactive in the secret policy audit and status pipeline examples

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
New-TssMetadataFieldSection: POST metadata/field-sections
Set-TssMetadataField: PATCH metadata/fields/{id} (rename or disable)
Remove-TssMetadataField: DELETE metadata/fields/{id} (disables the field)
Remove-TssMetadataFieldSection: DELETE metadata/field-sections/{id} (disables the section)
New-TssMetadataField: new parameter set field for POST metadata/fields; existing sets unchanged
Metadata.FieldSummary and Metadata.FieldSectionSummary gain Enabled

Also squashed in:
- test: add shape tests for metadata field and field section cmdlets
- fix: metadata disable help says values stay on items

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
New cmdlets:
Get-TssIpRestriction: GET v1/ipaddress-restrictions/{id}
Get-TssIpRestrictionConfiguration: GET v1/ipaddress-restrictions/configuration
Update-TssIpRestrictionConfiguration: PUT v1/ipaddress-restrictions/configuration (Secret Server Cloud only)

Also squashed in:
- test: add shape tests for the IP restriction get and configuration cmdlets

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ories)

Get-TssUserScript: GET v2/userscripts/{scriptId}, includes body and type settings
New-TssUserScript: POST v2/userscripts, typed -PasswordChangerId and -UsePowerShellCore
Set-TssUserScript: PATCH v1/userscripts/{scriptId}, sends only the fields passed
Update-TssUserScriptParameter: PUT v1/userscripts/{scriptId}/parameters, powershell/sql/ssh sets, full replace
Get-TssUserScriptAudit: GET v1/userscripts/audit
Get-TssUserScriptHistory: GET v2/userscripts/history/{scriptHistoryId}
Get-TssUserScriptUsage: GET v1/userscripts/usage
Search-TssUserScriptCategory: GET v1/userscripts/categories

Existing New-TssScript is unchanged. New classes: Scripts.ScriptItem, UserScriptAudit, UserScriptHistory, UserScriptUsage, UserScriptCategory. Command and type doc pages included.

Also squashed in:
- test: add shape tests for the user script cmdlets
- fix: user script Get cmdlets: unknown id errors, help matches server behaviour

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… login policy, database, backup, UI/UX)

New-TssAdvancedConfigurationSetting: POST advanced-config-settings
Search-TssAdvancedConfigurationSetting: GET advanced-config-settings
Update-TssAdvancedConfigurationSetting: PUT advanced-config-settings
Remove-TssAdvancedConfigurationSetting: DELETE advanced-config-settings/{id}
Get-TssAppState: GET app-state
Clear-TssConfigurationAdCredential: POST configuration/login/clear-ad-credentials
Test-TssConfigurationRadius: POST configuration/login/radius/test, takes -Credential
Get-TssConfigurationLoginPolicy: GET configuration/login-policy
Set-TssConfigurationLoginPolicy: PATCH configuration/login-policy
Get-TssConfigurationSettingsMenu: GET configuration/settings-menu
Get-TssConfigurationState: GET configuration/state
Get-TssDatabaseConfiguration: GET configuration/database (on-prem only)
Set-TssDatabaseConfiguration: PATCH configuration/database (on-prem only, ConfirmImpact High)
Get-TssDcm: GET configuration/dcm/{type}, -CurrentUser GET configuration/dcm/current-user, -Mobile GET configuration/dcmmobile/current-user
Set-TssDcm: PATCH configuration/dcm
Invoke-TssDpapiDecrypt: POST configuration/dpapi/decrypt (on-prem only, ConfirmImpact High)
Search-TssAutoExportAudit: GET configuration/auto-export-audits
Search-TssAutoExportLog: GET configuration/auto-export-logs
Start-TssAutoExport: POST configuration/auto-export/run-now, returns the boolean
Set-TssBackupConfiguration: PATCH configuration/backup
Set-TssConfigurationApplication: PATCH configuration/application-settings
Set-TssConfigurationPermissionOption: PATCH v2 configuration/permission-options
Set-TssConfigurationUserExperience: PATCH configuration/user-experience
Set-TssConfigurationUserInterface: PATCH v2 configuration/user-interface

Search-TssAutoExportStorage: new optional -ConfigurationId (GET configuration/auto-export-storage/{id}); calls without it are unchanged, existing test knows the new parameter.

New classes: AdvancedConfigSettings.Setting, AdvancedConfigSettings.Summary, AppState.Status, Configuration.AdCredentialClearResult, AutoExportLog, ConfigurationLoginPolicy, ConfigurationPermissionOptions, ConfigurationUserExperience, ConfigurationUserInterface, DatabaseConfiguration, Dcm, DcmCurrentUser, DcmMobile, DpapiState, RadiusTestResult, SettingsMenu, State, StateSection. Command and type doc pages included.

Also squashed in:
- test: add shape tests for configuration and settings cmdlets
- fix: config cmdlets keep the server host in v2 URLs, New-TssAdvancedConfigurationSetting outputs nothing, DCM and auto export help match the server
- fix: Start-TssAutoExport help states the cloud error text for a disabled automatic export

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ation cmdlets

Invoke-TssDpapiEncrypt: POST configuration/dpapi/encrypt
Get-TssDpapiState: GET configuration/dpapi/state
Set-TssEmailConfiguration: PATCH configuration/email
Test-TssEmailConfiguration: POST configuration/email/test
New-TssEmailHeader: POST configuration/email/email-message-header
Remove-TssEmailHeader: DELETE configuration/email/email-message-header/{id}
Search-TssEmailHeader: GET configuration/email/email-message-header
Set-TssEmailHeader: PATCH configuration/email/email-message-header/{id}
Get-TssFeatureFlag: GET featureflag/{key}
Set-TssFolderConfiguration: PATCH configuration/folder
Get-TssFolderSyncConfiguration: GET configuration/folder-synchronization
Set-TssFolderSyncConfiguration: PATCH configuration/folder-synchronization
Get-TssHealthCheck: GET healthcheck
Get-TssIcon: GET icon/{id}
Get-TssInternalSiteConnectorConfiguration: GET configuration/internal-site-connector
Set-TssInternalSiteConnectorConfiguration: PATCH configuration/internal-site-connector
Get-TssMdiIntegrationAudit: GET configuration/mdi-integration-audits
Get-TssMdiIntegrationConfiguration: GET configuration/mdi-integration
Set-TssMdiIntegrationConfiguration: PATCH configuration/mdi-integration
Start-TssMdiSynchronization: POST mdi-integration/synchronize-now
Get-TssMdiSynchronization: GET mdi-integration/synchronization
Search-TssMfaProfile: GET configuration/mfa/get-auth-profiles
Update-TssMfaProfile: PUT configuration/mfa/set-auth-profile
Get-TssMobileConfiguration: GET mobile-configuration
Get-TssPlatformConfiguration: GET configuration/platform
Set-TssPlatformConfiguration: PATCH configuration/platform

Also squashed in:
- test: add shape tests for the email, folder, platform, MDI, MFA, DPAPI and other configuration cmdlets
- fix: drop read-only platform settings from Set-TssPlatformConfiguration, return nothing from Get-TssMdiSynchronization before the first sync
- fix: say Set-TssPlatformConfiguration clears the vault and tenant Id while OpenID Connect is off

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
DeterminedExecution and others added 7 commits October 17, 2026 03:19
Get-TssTicketSystem: GET v2/ticket-systems/{id}, -Legacy GET v1/ticket-systems/{id}
Search-TssTicketSystem: GET v3/ticket-systems, -V2 GET v2/ticket-systems, -Legacy GET v1/ticket-systems
New-TssTicketSystem: POST v1/ticket-systems
Set-TssTicketSystem: PATCH v1/ticket-systems/{id}
Test-TssTicketSystem: POST v1/ticket-systems/{ticketSystemId}/test
Search-TssTicketSystemOverride: GET v1/ticket-systems/overrides
Get-TssTicketSystemOverride: GET v1/ticket-systems/overrides/{ticketSystemOverrideId}
Get-TssTicketSystemOverrideStatus: GET v1/ticket-systems/override/{ticketSystemOverrideId}
Classes: Thycotic.PowerShell.TicketSystems TicketSystem, Summary, TestResult, Override, OverrideSummary, OverrideStatus

Also squashed in:
- test: add shape tests for ticket system cmdlets
- fix: Get-TssTicketSystemOverrideStatus reports a pending request as empty, not False

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Test-TssLicenseForConnectionManager: GET license/validforconnectionmanager

Also squashed in:
- test: shape test for Test-TssLicenseForConnectionManager

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Get-TssBulkOperation: GET bulk-operations/{id}
Search-TssBulkOperation: GET bulk-operations
Stop-TssBulkOperation: PUT bulk-operations/{taskId}/stop
Get-TssBulkOperationAudit: GET bulk-operations/{id}/audits
Get-TssBulkOperationProgress: GET bulk-operations/{taskId}/progress
Enable-TssBulkPasswordChanger: POST bulk-password-changer-operations/enable
Disable-TssBulkPasswordChanger: POST bulk-password-changer-operations/disable
Invoke-TssBulkSecretAction: POST bulk-secret-operations/{action}, 14 id-only actions
Move-TssSecret: POST bulk-secret-operations/move-to-folder
Invoke-TssBulkUserAction: POST bulk-user-operations/{action}, 9 actions
Set-TssUserTwoFactor: POST bulk-user-operations two-factor routes, 12 actions

Also squashed in:
- test: add shape tests for bulk operation cmdlets
- fix: Search-TssBulkOperation help says when -StartUserId applies

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…command folders

CHANGELOG: new 0.63.0 -- unreleased section (New Stuff grouped by command folder, General Updates, Bug Fixes, Tests) from the per-area notes.
compatibility.md: one Function List row and link reference per new cmdlet, plus rows for the existing cmdlets that gained a parameter set and had none (Get-TssSecretState and New-TssMetadataField already had rows, left as is). Version = the Secret Server version verified on; SSC-only cmdlets say so.
Command folder readme pages: nav_order 34 onward, in title order, after Proxy (33).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
UpdateManifest output of the Debug build: FunctionsToExport now lists 1099 functions (was 259). ModuleVersion stays 0.62.1.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… ends the unlock

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…pgrade status

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@jagger

jagger commented Oct 19, 2026

Copy link
Copy Markdown
Contributor

Request: split the Platform authentication commit into its own PR

Could you move 7a999c8b ("feat: add Delinea Platform authentication to New-TssSession") into a separate PR against dev, and drop it from this one?

Why

Platform sign-in is the foundation for Platform support, and it needs to be reviewed and live-tested on its own before the REST coverage builds on it. For v1 of Platform support we need service-user and interactive-user sign-in to work reliably, plus token refresh and unification detection (see #481). That's easier to get right in a small PR than inside a 3,652-file one.

It splits cleanly

  • 7a999c8b is the first commit on the branch and is self-contained: 27 files covering New-TssSession, Close-TssSession, Session.cs, PlatformVaultTrust.ps1, the verbose redaction in GetTssInvocationCmdlet.cs, Get-TssPlatformVault, Test-TssPlatformIntegration, Get-TssPlatformCompatibilityLevel, their classes, docs and tests.
  • Nothing else in this PR reads the new session properties or calls Get-TssPlatformVault / PlatformVaultTrust.
  • The only later commit that touches those files is ec1e3420, which adds one line to docs/commands/platform/readme.md.
  • git cherry-pick 7a999c8b onto current dev applies with no conflicts.

What the new PR needs on top of the commit

  1. FunctionsToExport entries for the three new functions (the manifest is regenerated later in 5c95468a).
  2. A CHANGELOG entry (the 0.63.0 entry lives in ec1e3420).
  3. Get-TssPlatformConfiguration and its PlatformConfiguration class from 6f369e03, since unification detection builds on /api/v1/configuration/platform (details in FR: warn when cmdlets are impacted by Platform unification on platform-connected SaaS tenants (users, groups, roles, secret/folder ACLs) #481).

Order

Merge the authentication PR first, then rebase this PR onto it with 7a999c8b dropped. The Platform-vault live QA here ran on Platform sessions, so it depends on that code.

Items for the authentication PR

  • Service user: live test with a real service user, on Secret Server Cloud and on an on-prem vault behind Platform (-AllowedVaultHost), including the failure paths.
  • Interactive user sign-in: not in the current commit. Needed for v1, ideally a browser sign-in that also covers federated users and MFA.
  • Token refresh: today only a service user with -AutoRefresh can refresh, and only when the script calls SessionRefresh(). v1 should refresh in the request path. -AccessToken with a non-JWT token leaves TimeOfDeath unset, so the TTL checks are wrong. Close-TssSession doesn't revoke the token.
  • Unification detection: see FR: warn when cmdlets are impacted by Platform unification on platform-connected SaaS tenants (users, groups, roles, secret/folder ACLs) #481.
  • Review notes on the current New-TssSession code:
    • The required Get-TssVersion call for Platform sessions runs before $tss_ignoreversioncheck is checked, so a vault with version numbers hidden could fail session creation outright.
    • VaultId and VaultType stay empty when -SecretServer is passed.
    • -Credential -SecretServer never calls the vault broker, so nothing confirms the vault belongs to that tenant until Get-TssVersion succeeds.
    • devsecretservercloud.com ships in the vault trust list; is that intended?

@jagger

jagger commented Oct 19, 2026

Copy link
Copy Markdown
Contributor

Review findings

These are on top of the split request above. Each one is checked against the PR head (0d1f0212).

Shared pattern for dangerous operations (findings 2 to 5)

None of the cmdlets in findings 2 to 5 has a -Force parameter. Some set ConfirmImpact = 'High' and some only have the default (Medium). High alone isn't enough: -Confirm:$false or $ConfirmPreference = 'None' skips the prompt silently.

Please add one private helper (for example Confirm-TssDangerousOperation, in the style of Write-TssInternalNote) and use it in every cmdlet listed below:

[CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High')]
param(
    # ...
    [switch] $Force
)
# ...
Write-Warning $dangerMessage
if ($Force -or $PSCmdlet.ShouldContinue($dangerMessage, 'OK to proceed?')) {
    if ($PSCmdlet.ShouldProcess($target, $action)) {
        # send the request
    }
}
  • ShouldContinue always prompts, so unattended automation has to pass -Force on purpose.
  • -WhatIf still works through ShouldProcess.
  • Each cmdlet's help should say why it's dangerous.

1. Directory services: duplicates and naming

New-TssActiveDirectoryDomain, Search-TssActiveDirectoryDomain and Start-TssActiveDirectorySync call the legacy active-directory/* routes. The feature covers non-AD domains: the UI was renamed to Directory Services, but the API internals weren't. The module already covers these operations on the current routes:

New in this PR Already on dev
New-TssActiveDirectoryDomain: POST active-directory/domains New-TssDirectoryService: POST directory-services/domains
Search-TssActiveDirectoryDomain: GET active-directory/domains Search-TssDirectoryServiceDomain: GET directory-services/domains
Start-TssActiveDirectorySync: POST active-directory/synchronize Start-TssDirectoryServiceSync: POST directory-services/synchronization-now

Ask:

  • Drop the three ActiveDirectory cmdlets. If a legacy route offers something the directory-services route doesn't, add it as a parameter set on the existing cmdlet instead.
  • Use the existing singular DirectoryService noun for the new directory services cmdlets:
Current name Rename to
Set-TssDirectoryDomain Set-TssDirectoryServiceDomain
Get-TssDirectoryDomainStub Get-TssDirectoryServiceDomainStub
Get-TssDirectoryConfiguration Get-TssDirectoryServiceConfiguration
Set-TssDirectoryConfiguration Set-TssDirectoryServiceConfiguration
Get-TssDirectoryConfigurationAudit Get-TssDirectoryServiceConfigurationAudit
Search-TssDirectorySyncLog Search-TssDirectoryServiceSyncLog

2. Advanced configuration settings are support-only

Cmdlets: New-, Update- and Remove-TssAdvancedConfigurationSetting. Today they have the default (Medium) confirm impact, no prompt and no -Force.

Ask: every change writes this warning, word for word, and then requires "OK to proceed" or -Force:

These settings are only to be updated by Delinea Support. Modifying them will have a major impact on Secret Server

3. Database configuration is per node

Cmdlet: Set-TssDatabaseConfiguration. It already has ConfirmImpact = 'High', but no -Force. The database configuration is a per-node setting: through a load-balanced URL the change lands on whichever node answers.

Ask:

  • Warn that the change applies only to the node that receives the request, and that the session must point directly at that node.
  • Use the shared pattern.
  • Ideally, compare the session host with the web nodes and refuse a load-balanced address unless -Force is passed.
  • The help for Get-TssDatabaseConfiguration should say the result comes from the node that answered.

4. Platform configuration and related Platform changes are dangerous

Changes here can cause you to lose access to the Delinea Platform.

Ask: use the shared pattern, with a warning that says this, on:

Cmdlet Today
Set-TssPlatformConfiguration (can set UsePlatformSettings, which switches unified mode) Medium, no -Force
Enable-TssUnifiedMode High, no -Force
Set-TssUnifiedModeStatus Medium, no -Force
Invoke-TssPlatformProvision High, no -Force
Reset-TssPlatformUserMapping High, no -Force
Set-TssPlatformUserMapping Medium, no -Force

5. Secret key rotation, key management and MEK rotation are dangerous

Ask: use the shared pattern (approval or -Force) on:

Cmdlet Today
Start-TssSecretKeyRotation High, no -Force
Stop-TssSecretKeyRotation Medium, no -Force
Update-TssKeyManagement High, no -Force
Start-TssMekRotation High, no -Force
Restart-TssMekRotation High, no -Force

6. PBA is deprecated

Ask: remove the 9 pba-configuration cmdlets, along with their classes, docs, tests and manifest entries:

  • Clear-TssPbaChallenge
  • Confirm-TssPbaPair
  • Get-TssPbaConfiguration
  • Get-TssPbaImportStatus
  • Import-TssPbaHistory
  • Search-TssPbaChallenge
  • Sync-TssPbaMetadata
  • Test-TssPbaConnection
  • Update-TssPbaConfiguration

Also drop the w3-pba row from the coverage table.

7. Unanchored versioned URL rewrites

$TssSession.ApiUrl -replace 'v1','v2' is a regex replace over the whole URL, so it rewrites every v1, including one in the host. A vault at https://dev1.example.com would send its requests, with the Bearer token, to dev2.example.com. For Platform sessions the vault URL comes from the vault broker, and the host trust check only runs in New-TssSession, never on the rewritten URL.

Added by this PR:

  • 17 -replace 'v1','v2' sites in 15 files:
    • diagnostics/Get-TssDiagnosticAppSetting.ps1:64
    • discovery/New-TssDiscoverySource.ps1:168
    • platform-integration/Get-TssPlatformIntegrationProgress.ps1:59
    • platform-integration/Set-TssPlatformIntegrationStep.ps1:94
    • scripts/Get-TssUserScript.ps1:62
    • scripts/Get-TssUserScriptHistory.ps1:59
    • scripts/New-TssUserScript.ps1:105
    • secrets/Export-TssSecretBulk.ps1:120
    • secrets/Get-TssSecretBulkExport.ps1:75,78,81
    • secrets/Get-TssSecretHasAny.ps1:42
    • secrets/Get-TssSecretSearchTotal.ps1:138
    • secrets/Get-TssSecretState.ps1:79
    • teams/Add-TssTeamMember.ps1:92
    • ticket-systems/Get-TssTicketSystem.ps1:71
    • ticket-systems/Search-TssTicketSystem.ps1:72
  • 3 -replace 'v1','v3' sites:
    • secrets/Enable-TssSecret.ps1:60
    • secrets/Update-TssSecretSecurityApproval.ps1:100
    • ticket-systems/Search-TssTicketSystem.ps1:81

Ask:

  • Use the anchored -replace '/api/v1$','/api/v2' form that 20 files in this PR already use, or better, a helper that builds the URL from the base.
  • Add a Pester check that fails on an unanchored ApiUrl -replace 'v1'.

The two pre-existing sites are tracked in #483.

8. Get-TssSecretPasswordStatus -RestApi

The new -RestApi switch uses the published route secrets/secret-detail/{id}/password-status, but the internal route stays the default. Internal routes are unsupported and can break on any Secret Server release, so use them only when no published route exists.

Ask:

  • Make the published route the default.
  • Either drop the internal route, or keep it behind an explicit opt-in that warns.
  • Call this out as a behavior change.

The other internal-route cmdlets predate this PR and are tracked in #483.

The Delinea Platform login for New-TssSession moves to its own change, per review.
New-TssSession, Close-TssSession and TssSession are back to their dev versions: no platform or platformToken parameter sets, no Platform session members, no Platform refresh or expire paths.
Removed with them: the vault host trust part, Get-TssPlatformVault with its Vault type, shape test and docs pages, the Delinea Platform section of the authentication page, and their CHANGELOG, compatibility and manifest rows.
Test-TssPlatformIntegration and Get-TssPlatformCompatibilityLevel stay; their examples now pass a Platform access token with -AccessToken.
The verbose redaction in Get-TssInvocation stays, it covers parameters of other new cmdlets.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@DeterminedExecution DeterminedExecution changed the title feat: add Delinea Platform auth and 839 REST cmdlets feat: add 838 REST cmdlets Oct 21, 2026
DeterminedExecution and others added 8 commits October 23, 2026 16:05
Removed per review: Clear-TssPbaChallenge, Confirm-TssPbaPair, Get-TssPbaConfiguration, Get-TssPbaImportStatus, Import-TssPbaHistory, Search-TssPbaChallenge, Sync-TssPbaMetadata, Test-TssPbaConnection and Update-TssPbaConfiguration.
Removed with them: the PbaConfiguration classes and type pages, the command pages, the shape tests, the CHANGELOG and compatibility rows and the manifest entries.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…ryService noun

Removed per review: New-TssActiveDirectoryDomain, Search-TssActiveDirectoryDomain and Start-TssActiveDirectorySync, with the ActiveDirectory classes, type pages, command pages, shape tests, CHANGELOG and compatibility rows and manifest entries. New-TssDirectoryService, Search-TssDirectoryServiceDomain and Start-TssDirectoryServiceSync cover the same operations on the directory-services routes.
What the legacy routes offered beyond the existing cmdlets moves onto them:
Search-TssDirectoryServiceDomain gets parameter set searchText (-SearchText, GET v1/active-directory/domains), which matches the friendly name as well as the domain name; DirectoryServices.DomainSummary gains DistinguishedName and SiteId for it. The default set, now named filter, is unchanged.
Start-TssDirectoryServiceSync gets -PassThru to output the Boolean the server returns; its help links now point at directory-services.
The POST active-directory/domains body has no field that DomainCreateModel lacks, so New-TssDirectoryService is unchanged.
Renamed: Set-TssDirectoryDomain to Set-TssDirectoryServiceDomain, Get-TssDirectoryDomainStub to Get-TssDirectoryServiceDomainStub, Get-TssDirectoryConfiguration to Get-TssDirectoryServiceConfiguration, Set-TssDirectoryConfiguration to Set-TssDirectoryServiceConfiguration, Get-TssDirectoryConfigurationAudit to Get-TssDirectoryServiceConfigurationAudit and Search-TssDirectorySyncLog to Search-TssDirectoryServiceSyncLog, and the DirectoryServices.DirectoryDomain class to DirectoryServiceDomain, with their tests, docs, CHANGELOG and compatibility rows and manifest entries.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
$TssSession.ApiUrl -replace 'v1','v2' rewrites every v1 in the URL, so a host or install path containing v1 sent the request and its token elsewhere. The 17 v2 and 3 v3 rewrites this change added now use -replace '/api/v1$','/api/v2' (or /api/v3), the form the other new cmdlets already use.
New tests/Module.ApiUrlRewrite.Tests.ps1 fails on any ApiUrl -replace whose pattern is not anchored at /api/v1$. The two pre-existing sites, Search-TssConfigurationBackupLog and Search-TssSystemLog, are on an allowlist in the test and are left for a separate fix; a second test fails once they are anchored, so the allowlist cannot go stale.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The published route GET v1/secrets/secret-detail/{id}/password-status is now the only route. The internal route internals/secret-detail/{id}/password-status is gone, and so is the -RestApi switch this change had added to choose between them; parameters and output are back to the dev shape.
Recorded under Breaking Changes in the CHANGELOG and in the command help: the default route changes, and the internal endpoint verbose note is no longer written.
New request test checks the route, the absence of the internal note and the PasswordStatus output. It runs the command through tests/_helperscripts/NoHostRunspace.ps1: a runspace whose host cannot prompt, with Invoke-TssApi replaced in the module scope by a recorder that answers 200, so nothing is sent.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…-Force

New-, Update- and Remove-TssAdvancedConfigurationSetting now write "These settings are only to be updated by Delinea Support. Modifying them will have a major impact on Secret Server" and ask OK to proceed? before they send anything. New -Force skips the question for unattended runs, ConfirmImpact is High, and -WhatIf still shows the request without sending it. Help says why the settings are dangerous and what -Force does.
The pattern lives in one new private cmdlet, Confirm-TssDangerousOperation (cmdlets/private, next to Write-TssInternalNote), which the later dangerous cmdlets reuse. It takes the caller's PSCmdlet, a danger name that selects the warning text, and the ShouldProcess target and action:
-WhatIf (bound or $WhatIfPreference): ShouldProcess only, so nothing is sent and nothing prompts.
No -Force: the warning, ShouldContinue (OK to proceed?), then ShouldProcess. -Confirm:$false or $ConfirmPreference = 'None' no longer skips the question.
-Force: the warning, no prompt, unless -Confirm is passed explicitly.
tests/Module.DangerousOperation.Tests.ps1 runs the helper and each command that uses it in a runspace whose host cannot prompt, with Invoke-TssApi recorded instead of sent, and checks each case above plus -Force, ConfirmImpact High and help on every command.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The database configuration is set per web node, so through a load-balanced address the change lands on whichever node answers. Set-TssDatabaseConfiguration now warns that the change applies only to the node that receives the request and that the session must point directly at that node, then asks OK to proceed? through Confirm-TssDangerousOperation. New -Force skips the question; ConfirmImpact stays High and -WhatIf sends nothing.
Get-TssDatabaseConfiguration help now says the result comes from the node that answered.
Not done: comparing the session host with the web nodes to refuse a load-balanced address.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…-TssPlatformProvision

Set-TssPlatformConfiguration, Enable-TssUnifiedMode, Set-TssUnifiedModeStatus, Reset-TssPlatformUserMapping and Set-TssPlatformUserMapping now warn that the change can cause loss of access to the Delinea Platform and ask OK to proceed? through Confirm-TssDangerousOperation. New -Force skips the question, ConfirmImpact is High on all five (was Medium on Set-TssPlatformConfiguration, Set-TssUnifiedModeStatus and Set-TssPlatformUserMapping), and -WhatIf sends nothing. Help says why each is dangerous.
Invoke-TssPlatformProvision is removed with its command page, shape test, CHANGELOG and compatibility rows and manifest entry. The ProvisionStatus class stays: Get-TssPlatformProvisionStatus returns it.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…Force

Start-TssSecretKeyRotation, Stop-TssSecretKeyRotation, Update-TssKeyManagement, Start-TssMekRotation and Restart-TssMekRotation now warn that a wrong or interrupted change to how Secret Server encrypts its data can leave Secret Server or its secrets unreadable, and ask OK to proceed? through Confirm-TssDangerousOperation. New -Force skips the question, ConfirmImpact is High on all five (was Medium on Stop-TssSecretKeyRotation), and -WhatIf sends nothing. Help says why each is dangerous.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@DeterminedExecution DeterminedExecution changed the title feat: add 838 REST cmdlets feat: add 825 REST cmdlets Oct 27, 2026
@jagger

jagger commented Oct 28, 2026

Copy link
Copy Markdown
Contributor

A dev build of this PR is published for validation as 0.63.0-alpha1, built from 766602b with a version stamp on top (5c3a965).

Install-Module Thycotic.SecretServer -RequiredVersion 0.63.0-alpha1 -AllowPrerelease -Scope CurrentUser

A plain Install-Module or Update-Module still gives 0.62.1. Local Pester run on the alpha build: 29,794 passed, 0 failed.

Please post validation results here: the Secret Server version, on-premises or Cloud, the command, and -Verbose output.

🤖 Generated with Claude Code

jagger and others added 2 commits October 28, 2026 17:44
…d-status is an update

Search-TssDirectoryServiceDomain output gains DistinguishedName and SiteId in every
parameter set, not only -SearchText; the default set returns them empty. Lead the 0.63.0
section with that entry and correct the claim that the default output is unchanged.

Get-TssSecretPasswordStatus keeps its parameters and output, so the route change moves
from Breaking Changes to General Updates.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…out 1 s (thycotic-ps#486)

The psm1 dot-sources every file under functions at import. With 1,084 function files that
takes about 26 s on a cold import; nearly all of it is per-file overhead, not parsing.

build.functions.ps1 adds Merge-ModuleFunction, which build.ps1 and build-release-only.ps1
call while staging. It replaces the Import Functions loader in the staged psm1 with each
function file wrapped in #region functions/<path> markers, in loader order, and removes the
staged functions folder. src keeps its per-file layout.

The merged text is parsed once and rejected, leaving the stage unchanged, if any file holds
#requires, using, script-level blocks or other top-level code, more than one function or a
function not named after its file, or $PSScriptRoot, $PSCommandPath or MyCommand.Path.

Measured on the staged build: 1,087 commands with an identical parameter signature hash,
cold import 1.1 s against 25.9 s from src.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@jagger

jagger commented Oct 28, 2026

Copy link
Copy Markdown
Contributor

I pushed two commits to this branch after A/B testing the 0.63.0-alpha1 build against 0.62.1 and 0.62.0 with the SecretServer-Internal scripts on a 12.3 lab.

abd9dd31 docs: CHANGELOG 0.63.0

  • Search-TssDirectoryServiceDomain now leads the 0.63.0 section. In 0.63, DomainSummary gains DistinguishedName and SiteId in every parameter set, not only -SearchText. The default filter set returns them empty (an empty string and null). That contradicts the old claim that the default output is unchanged. Scripts that export or compare whole objects now get two extra columns.
  • The Get-TssSecretPasswordStatus route change moved from Breaking Changes to General Updates. Its parameters and output are unchanged. Against the lab, both routes returned 200 with identical output.

f57c3d54 fix: ship one psm1 with functions inlined (#486)

  • Cold import goes from about 26 s to about 1.1 s. Details and measurements are in Module import is about 3.5x slower in 0.63.0-alpha1 (30 s vs 8 s) #486.
  • build.functions.ps1 (new) adds Merge-ModuleFunction. build.ps1 and build-release-only.ps1 call it at the end of stage.
    • It inlines functions/** into the staged psm1 in the loader's order, with a #region functions/<path> marker around each file, and drops the functions folder from the release. src keeps its per-file layout.
    • It parses the merged text once and fails the build, leaving the stage unchanged, if any function file contains:
      • #requires or using
      • script-level blocks or other top-level code
      • more than one function, or a function not named after its file
      • $PSScriptRoot, $PSCommandPath or MyCommand.Path
  • tests/Module.FunctionInlining.Tests.ps1 (new) has 10 tests. One inlines a copy of src and checks loader order, folder removal and that the result parses. The rest cover each rejection case.
  • Verified with a real build-release-only.ps1 -Configuration Release:
    • The zip has no functions folder.
    • The staged module exports the same 1,087 commands as src, with an identical hash over every parameter's name, type, mandatory flag and position.
    • Lab smoke tests on the staged build passed: session, Get-TssSecret, Search-TssSecretTemplate | Get-TssSecretTemplate, Get-TssSecretPasswordStatus, Get-TssUnlimitedAdmin, the -WhatIf warning path and Get-Help.
  • Error positions now point at Thycotic.SecretServer.psm1. The nearest #region marker above the reported line names the source file.

This branch is 3 commits behind dev, including 8af6a42e (InvokeBuild 5.12.2 for PowerShell 7.4+), which the build scripts here need on 7.4 and later. Both commits merge into dev without conflicts.

Not from this PR, but found in the same testing: since 0.62.1, Search-TssSecret emits its whole result as a single Summary[] object (the unary comma). Any Search-TssSecret | ... pipeline sees one item, and @(...) of an empty result has Count 1. That breaks scripts that pinned 0.62.0. I can open a separate issue for it.

@jagger

jagger commented Oct 30, 2026

Copy link
Copy Markdown
Contributor

0.63.0-rc1 is out as a prerelease on GitHub (https://github.com/thycotic-ps/thycotic.secretserver/releases/tag/v0.63.0-rc1) and the PowerShell Gallery (Install-Module Thycotic.SecretServer -RequiredVersion 0.63.0-rc1 -AllowPrerelease). Barring any reported issues, 0.63.0 releases on November 4.

It's built from this PR's head (f57c3d5) plus these commits on prerelease/0.63.0-rc1:

Could you pull these into the PR so it matches what ships as 0.63.0? I tested the Remove-TssUserPii change live on Secret Server against the staged rc1 module. Cold import on my machine measured 4.9 s, against about 30 s for alpha1.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Module import is about 3.5x slower in 0.63.0-alpha1 (30 s vs 8 s)

2 participants