Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 77 additions & 0 deletions Convert-EmbeddedCredential.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
#Requires -Modules Devolutions.PowerShell

<#
.SYNOPSIS
Converts embedded credential entries to proper credential entries in specified Remote Desktop Manager (RDM) vaults.

.DESCRIPTION
This script processes specified RDM vaults and converts embedded credential entries to proper credential entries.
It sets the current repository to each vault, retrieves embedded credential entries, and updates their username and password
if they exist. The script supports confirmation prompts and impact levels for actions taken.

.PARAMETER VaultName
The name of the RDM vault to process. If not specified, all available vaults will be processed.

.EXAMPLE
PS> .\Convert-EmbeddedCredential.ps1 -VaultName 'MyVault' -InformationAction Continue

This example processes the 'MyVault' vault, converts any embedded credential entries to proper credential entries,
and refreshes the entries list.

.EXAMPLE
PS> .\Convert-EmbeddedCredential.ps1

This example processes all available vaults, converts any embedded credential entries to proper credential entries,
and refreshes the entries list.
#>
[CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'Medium')]
param (
[Parameter()]
[ValidateNotNullOrEmpty()]
[string]$VaultName
)

$ErrorActionPreference = 'Stop'

$getRdmVaultParams = @{}
if ($PSBoundParameters.ContainsKey('VaultName')) {
$getRdmVaultParams['Name'] = $VaultName
}
[array]$vaults = Get-RDMVault @getRdmVaultParams

$embeddedCredentialCount = 0
foreach ($vault in $vaults) {
Set-RDMCurrentRepository -Repository $vault
$vaultname = $vault.Name

if (-not ($embeddedCredentialEntries = Get-RDMEntry | Where-Object { $_.CredentialConnectionID -eq '0C0C8D0A-CE6D-40E7-84D0-343D488E2DBA' })) {
Write-Information -Message "Vault: $vaultname | No embedded credential entries found"
} else {
Write-Information -Message "Vault: $vaultname | Found $($embeddedCredentialEntries.Count) embedded credential entries"
foreach ($entry in $embeddedCredentialEntries) {
$entry.CredentialConnectionID = ''

if ($username = Get-RDMSessionUserName $entry) {
Write-Information -Message "Vault: $vaultname | Entry: $($entry.Name) : Updating username..."
Set-RDMEntryUsername -InputObject $entry -UserName $username
}

if ($password = Get-RDMSessionPassword $entry) {
Write-Information -Message "Vault: $vaultname | Entry: $($entry.Name) : Updating password..."
Set-RDMEntryPassword -InputObject $entry -Password $password
}
if ($username -or $password) {
$embeddedCredentialCount++
if ($PSCmdlet.ShouldProcess("Vault: $vaultname | Entry: $($entry.Name)", "Update embedded credential to username: $username, password: $password")) {
Set-RDMEntry -InputObject $entry
}
}
}
}
}
if ($embeddedCredentialCount -gt 0) {
Write-Information -Message "Converted $embeddedCredentialCount embedded credential entries in $($vaults.Count) vaults"

## Refresh the entries list
Update-RDMEntries
}
95 changes: 95 additions & 0 deletions ConvertTo-Folder.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
#Requires -Modules Devolutions.PowerShell

<#
.SYNOPSIS
Processes specified vaults and creates virtual folders based on entry group paths.

.DESCRIPTION
This script processes all entries within specified vaults and extracts virtual folder paths from each entry's group.
It then checks for the existence of these virtual folders and creates them if they do not already exist.
The script leverages the Devolutions.PowerShell module to interact with Remote Desktop Manager (RDM).

.PARAMETER VaultName
An optional parameter to filter the entries by vault name. If not specified, all vaults will be processed.

.PARAMETER VirtualFolderName
An optional parameter to filter the entries by virtual folder name. If not specified, all virtual folders will be processed.

.NOTES
Requires the Devolutions.PowerShell module to be installed.

.EXAMPLE
PS> .\ConvertTo-Folder.ps1 -VaultName "MyVault" -VirtualFolderName "MyVirtualFolder" -InformationAction Continue

This example processes the entries in the vault named "MyVault", extracts virtual folder paths from entry groups,
and creates any missing virtual folders.

.EXAMPLE
PS> .\ConvertTo-Folder.ps1 -InformationAction Continue

This example processes all entries in all vaults and creates any missing virtual folders.

#>

[CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'Medium')]
param (
[Parameter()]
[ValidateNotNullOrEmpty()]
[string]$VaultName,

[Parameter()]
[ValidateNotNullOrEmpty()]
[string]$VirtualFolderName
)

$ErrorActionPreference = 'Stop'

$getRdmVaultParams = @{}
if ($PSBoundParameters.ContainsKey('VaultName')) {
$getRdmVaultParams['Name'] = $VaultName
}
$vaults = Get-RDMVault @getRdmVaultParams

foreach ($vault in $vaults) {
Set-RDMCurrentRepository -Repository $vault
$vaultname = $vault.Name
Write-Information -Message "Processing vault: $vaultname"

$allEntries = Get-RDMEntry

$allVirtualFolderPaths = @()
foreach ($entry in $allEntries) {

## Extract the virtual folder paths
$folderPath = $entry.Group

$folderPath -split ';' | Select-Object -Skip 1 | ForEach-Object {
if ($allVirtualFolderPaths -notcontains $_) {
Write-Information -Message "Found virtual folder [$_]"
$allVirtualFolderPaths += $_
}
}
}

# Get all folders that exist in the database
$folders = Get-RDMSession | Where-Object { $_.ConnectionType -eq "Group" }
$folderLookupHt = $folders | Group-Object -Property Group -AsHashTable

## Extract the folder names from the paths to create flat folders
$allVirtualFolderNames = $allVirtualFolderPaths -split '\\' | Select-Object -Unique

## Find all virtual folder paths that do not have folders already
$foldersToCreate = $allVirtualFolderNames | Where-Object { !$folderLookupHt.ContainsKey($_) }

## Create the folders
foreach ($folder in $foldersToCreate) {
if ($PSCmdlet.ShouldProcess("Vault: $vaultname", "Create Virtual Folder [$folder]")) {
## Create the new folder in current vault
New-RDMEntry -Name $folder -Group $folder -Type Group -Set
Write-Information "Folder for previous virtual folder [$folder] has been successfully created."
}
}

}

Update-RDMUI