Public/Entries/New-DSRDPEntry.ps1
function New-DSRDPEntry { <# .SYNOPSIS Creates a new RDP entry .DESCRIPTION Creates a new RDP entry with the parameters supplied. All fields have a default value corresponding to those of Remote Desktop Manager. .EXAMPLE #> [CmdletBinding()] PARAM ( #Entry's name [ValidateNotNullOrEmpty()] [string]$Name, #Entry's domain [string]$Domain, [ValidateNotNullOrEmpty()] #Entry's username [string]$Username, #Entry's password [string]$Password, #Entry's mnemonic passwordF [string]$MnemonicPassword, #Entry's vault ID [guid]$VaultID = [guid]::Empty, #Entry's location in the vault (Folder name, not ID) [string]$Group, #Entry's prompt for password when checkout [bool]$PromptCredentials, <# -- More tab -- #> #Entry's description [string]$Description, #Entry's tags (Keywords). Each word separeted by a space is considered a keyword. [string]$Tags, #Entry's expiration date (ISO-8601 format (yyyy-mm-ddThh:mm:ss.000Z) [string]$Expiration, <# -- Events tab -- #> #Warns the user if RDP session is already opened [bool]$WarnIfAlreadyOpened = $False, #A comment is required to view entry's credentials [bool]$CredentialViewedCommentIsRequired = $False, #A ticket number is required to view entry's credentials [bool]$TicketNumberIsRequiredOnCredentialViewed = $False, #Prompt the user for comment/ticket number on credential viewed [bool]$CredentialViewedPrompt = $False, #Prompt the user for comment/ticket number on open [bool]$OpenCommentPrompt = $False, #A comment is required on open [bool]$OpenCommentIsRequired = $False, #A ticket number is required on open [bool]$TicketNumberIsRequiredOnOpen = $False, #Prompt the user for comment/ticket number on close [bool]$CloseCommentPrompt = $False, #A comment is required on close [bool]$CloseCommentIsRequired = $False, #A ticket number is required on close [bool]$TicketNumberIsRequiredOnClose = $False, <# -- Security tab -- #> #Entry's checkout mode [CheckOutMode]$CheckoutMode = [CheckOutMode]::Default, #Entry's offline mode [AllowOffline]$AllowOffline = [AllowOffline]::Default, <# -- RDP entry specifics... -- #> #RDP's host name (Address) [string]$HostName, #Opens the adminstration console [bool]$AdminMode = $False, #Port used by RDP [string]$Port = '3389', #RDP Type [RDPType]$RDPType = [RDPType]::Normal, #Azure Cloud Services role name [string]$RoleName = '', #Azure Cloud Service's instance ID [int]$AzureInstanceID = 0, #Hyper-V Instance [string]$HyperVInstance = '', #Hyper-V enhanced session (Uses machine's local resources, such as USB drive or printer) [bool]$UseEnhancedSessionMode = $False, <# -- General -> Local resources tab -- #> #RDP access to clipboard [bool]$UsesClipboard = $true, #RDP access to "devices" (Such as cameras...) [bool]$UsesDevices = $False, #RDP access to hard drives [bool]$UsesHardDrives = $true, #RDP access to printers [bool]$UsesPrinters = $False, #RDP access to serial ports [bool]$UsesSerialPorts = $true, #RDP access to smart devices [bool]$UsesSmartDevices = $False, #Choose destination for sounds [SoundHook]$SoundHook = [SoundHook]::BringToThisComputer, #RDP Audio quality [RDPAudioQualityMode]$AudioQualityMode = [RDPAudioQualityMode]::Dynamic, #Record audio from RDP session [bool]$AudioCaptureRedirectionMode = $true, #Sets the destination for Windows key combinations (ALT+TAB, for example) [ValidateSet( [KeyboardHook]::OnTheLocalComputer, [KeyboardHook]::InFullScreenMode, [KeyboardHook]::OnTheRemoteComputer )] [string]$KeyboardHook = [KeyboardHook]::OnTheLocalComputer, <# -- General -> Programs tab -- #> #Path (including filename) of application to launch in alternate shell [string]$AlternateShell, #Path for alternate shell directory [string]$ShellWorkingDirectory, #Path (including filename and extension) of application to launch after login [string]$AfterLoginProgram, #Delay (in miliseconds) to launch application after login [int]$AfterLoginDelay = 500, #Path (including filename and extension) of application to launch [string]$RemoteApplicationProgram, #Parameters for the remote application [string]$RemoteApplicationCmdLine, <# -- General -> Experience tab -- #> #Connection speed to use for RDP [string]$NetworkConnectionType = [RDPNetworkConnectionType]::Default, #Enable desktop background [bool]$DesktopBackground = $true, #Enable font smoothing [bool]$FontSmoothing = $False, #Enable desktop composition [bool]$DesktopComposition = $False, #Enable animations [bool]$Animations = $False, #Enable visual styles [bool]$VisualStyles = $true, #Enable network autodetection [bool]$NetworkAutoDetect = $False, #Enable automatic reconnection if RDP drop [bool]$AutoReconnection = $true, #Enable DirectX redirection [bool]$RedirectDirectX = $False, #Enable video playback redirection [bool]$RedirectVideoPlayback = $False, #Enable content showing while dragging across screen [bool]$ShowContentWhileDragging = $true, #Enable data compression [bool]$DataCompression = $true, #Enable persistent bitmap caching [bool]$PersistentBitmapCaching = $true, #Enable bandwith autodetection [bool]$BandwidthAutoDetect = $true, [ValidateSet( [DefaultBoolean]::Default, [DefaultBoolean]::True, [DefaultBoolean]::False )] #Sets if addons load in embedded or not [DefaultBoolean]$LoadAddonsMode = [DefaultBoolean]::Default, [RDPClientSpec]$ClientSpec = [RDPClientSpec]::Default, [int]$KeepAliveInternal = 1000, <# -- User interface tab -- #> [ValidateSet( [ConnectionDisplayMode]::External, [ConnectionDisplayMode]::Embedded, [ConnectionDisplayMode]::Undocked )] #Display mode used by RDP [string]$DisplayMode = [ConnectionDisplayMode]::Embedded, #Display monitor used by RDP [DisplayMonitor]$DisplayMonitor = [DisplayMonitor]::Primary, #Virtual desktop used by RPD [DisplayMonitor]$DisplayVirtualDesktop = [DisplayVirtualDesktop]::Current, [Field[]]$NewFieldsList ) BEGIN { Write-Verbose '[New-DSRDPEntry] Beginning...' } PROCESS { try { #Default RDP entry, valid for all RDP type $RDPEntry = @{ connectionType = 1 group = $Group name = $Name displayMode = $DisplayMode DisplayMonitor = $DisplayMonitor displayVirtualDesktop = $DisplayVirtualDesktop data = @{ host = $HostName adminMode = $AdminMode rdpType = $RDPType username = $Username soundHook = $SoundHook audioQualityMode = $AudioQualityMode usesClipboard = $UsesClipboard usesDevices = $UsesDevices usesHardDrives = $UsesHardDrives usesPrinters = $UsesPrinters usesSerialPorts = $UsesSerialPorts usesSmartDevices = $UsesSmartDevices audioCaptureRedirectionMode = $AudioCaptureRedirectionMode connectionType = $NetworkConnectionType videoPlaybackMode = $RedirectVideoPlayback animations = $Animations loadAddOnsMode = $LoadAddonsMode keyboardHook = $KeyboardHook promptCredentials = $PromptCredentials clientSpec = switch ($ClientSpec) { { $_ -lt 0 } { $ClientSpec } { $_ -gt 1000 } { $ClientSpec } Default { $ClientSpec } } } events = @{ credentialViewedCommentIsRequired = $CredentialViewedCommentIsRequired ticketNumberIsRequiredOnCredentialViewed = $TicketNumberIsRequiredOnCredentialViewed credentialViewedPrompt = $CredentialViewedPrompt openCommentPrompt = $OpenCommentPrompt openCommentIsRequired = $OpenCommentIsRequired ticketNumberIsRequiredOnOpen = $TicketNumberIsRequiredOnOpen closeCommentPrompt = $CloseCommentPrompt closeCommentIsRequired = $CloseCommentIsRequired ticketNumberIsRequiredOnClose = $TicketNumberIsRequiredOnClose } repositoryID = $VaultID } #Create passwordItem if password is present and not null if (![string]::IsNullOrWhiteSpace($Password)) { $RDPEntry.data += @{ 'passwordItem' = @{ hasSensitiveData = $false sensitiveData = $Password } } } #Possible fields for RDP type "Azure" if ($RDPType -eq [RDPType]::Azure) { $RDPEntry.data += @{ 'azureInstanceID' = $AzureInstanceID } $RDPEntry.data += @{ 'azureRoleName' = $RoleName } } #Possible fields for RDP type "HyperV" if ($RDPType -eq [RDPType]::HyperV) { $RDPEntry.data += @{ 'hyperVInstanceID' = $HyperVInstance } $RDPEntry.data += @{ 'useEnhancedSessionMode' = $UseEnhancedSessionMode } } #After login program if (![string]::IsNullOrEmpty($AfterLoginProgram)) { $RDPEntry.data += @{ 'afterLoginExecuteProgram' = $true } $RDPEntry.data += @{ 'afterLoginProgram' = $AfterLoginProgram } $RDPEntry.data += @{ 'afterLoginDelay' = switch ($AfterLoginDelay) { { $_ -lt 0 } { 0 } { $_ -gt 60000 } { 60000 } Default { $AfterLoginDelay } } } } #Alternate shell/RemoteApp program. Prioritizing RemoteApp, as it's preferred over alternative shell if (![string]::IsNullOrEmpty($RemoteApplicationProgram)) { $RDPEntry.data += @{ 'remoteApp' = $true } $RDPEntry.data += @{ 'remoteApplicationProgram' = $RemoteApplicationProgram } $RDPEntry.data += @{ 'remoteApplicationCmdLine' = $RemoteApplicationCmdLine } } elseif (![string]::IsNullOrEmpty($AlternateShell)) { $RDPEntry.data += @{ 'useAlternateShell' = $true } $RDPEntry.data += @{ 'alternateShell' = $AlternateShell } $RDPEntry.data += @{ 'shellWorkingDirectory' = $ShellWorkingDirectory } } #Check for new parameters if ($NewFieldsList.Count -gt 0) { foreach ($Param in $NewFieldsList.GetEnumerator()) { switch ($Param.Depth) { 'root' { $RDPEntry += @{$Param.Name = $Param.Value } } default { if ($RDPEntry.($Param.Depth)) { $RDPEntry.($Param.Depth) += @{ $Param.Name = $param.value } } else { $RDPEntry += @{ $Param.Depth = @{ $Param.Name = $Param.Value } } } } } } } #Converts data to JSON, then encrypt the whole thing $RDPEntry.data = Protect-ResourceToHexString (ConvertTo-Json $RDPEntry.data) $res = New-DSEntryBase -JsonBody (ConvertTo-Json $RDPEntry) return $res } catch { Write-Error $_.Exception.Message } } END { if ($res.isSuccess) { Write-Verbose '[New-DSRPDEntry] Completed successfully!' } else { Write-Verbose '[New-DSRPDEntry] Ended with errors...' } } } |