From cca3317e7f7b93bedd6ed7af26364fee3629ed66 Mon Sep 17 00:00:00 2001 From: Adam Bertram Date: Mon, 17 Jun 2024 11:32:39 -0500 Subject: [PATCH] Added refactored scripts from RDMSamples-ps support Github repo --- Convert-EmbeddedCredential.ps1 | 77 +++++++++++++++++++++++++++ ConvertTo-Folder.ps1 | 95 ++++++++++++++++++++++++++++++++++ 2 files changed, 172 insertions(+) create mode 100644 Convert-EmbeddedCredential.ps1 create mode 100644 ConvertTo-Folder.ps1 diff --git a/Convert-EmbeddedCredential.ps1 b/Convert-EmbeddedCredential.ps1 new file mode 100644 index 0000000..de727e8 --- /dev/null +++ b/Convert-EmbeddedCredential.ps1 @@ -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 +} \ No newline at end of file diff --git a/ConvertTo-Folder.ps1 b/ConvertTo-Folder.ps1 new file mode 100644 index 0000000..50f795c --- /dev/null +++ b/ConvertTo-Folder.ps1 @@ -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 \ No newline at end of file