# Define directories $remoteAppProfilesFolder = "C:\RemoteAppProfiles" $iconDirectory = "C:\RemoteAppProfiles\Icons" $logDirectory = "C:\Temp\Logs" # Base64 strings for icons - replace these with actual base64 encoded icon data $base64StringIcon1 = "base64string_for_icon1" # Placeholder for first .ico base64 $base64StringIcon2 = "base64string_for_icon2" # Placeholder for second .ico base64 # Ensure necessary directories exist function CheckCreateDirectory { param([string]$Path) if (-not (Test-Path -Path $Path)) { New-Item -Path $Path -ItemType Directory | Out-Null Write-Host "Created directory: $Path" Write-DebugLog "Created directory: $Path" } } function Write-DebugLog { param([string]$Message) $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss" $logMessage = "${timestamp}: ${Message}" $logMessage | Out-File -FilePath "${logDirectory}\debug.log" -Append Write-Host $logMessage } function ConvertBase64ToIcon { param([string]$base64, [string]$outputPath) try { $bytes = [Convert]::FromBase64String($base64) [System.IO.File]::WriteAllBytes($outputPath, $bytes) Write-DebugLog "Icon created at $outputPath" } catch { Write-Host "Error converting base64 to icon: $_" Write-DebugLog "Error converting base64 to icon: $_" } } # Create logs and icons directories CheckCreateDirectory -Path $logDirectory CheckCreateDirectory -Path $iconDirectory CheckCreateDirectory -Path $remoteAppProfilesFolder # Convert base64 strings to .ico files and save them in the icons directory $iconPaths = @() $iconPaths += Join-Path -Path $iconDirectory -ChildPath "rdp-ico-1.ico" $iconPaths += Join-Path -Path $iconDirectory -ChildPath "rdp-ico-2.ico" ConvertBase64ToIcon -base64 $base64StringIcon1 -outputPath $iconPaths[0] ConvertBase64ToIcon -base64 $base64StringIcon2 -outputPath $iconPaths[1] # RDP Profiles $rdpProfiles = @( @{ Name = "RDP Profile 1 Name" IconPath = $iconPaths[0] ConfigurationContent = @" screen mode id:i:1 use multimon:i:1 desktopwidth:i:1920 desktopheight:i:1080 session bpp:i:32 winposstr:s:0,1,260,26,1578,1032 compression:i:1 keyboardhook:i:2 audiocapturemode:i:0 videoplaybackmode:i:1 connection type:i:7 networkautodetect:i:1 bandwidthautodetect:i:1 displayconnectionbar:i:1 enableworkspacereconnect:i:0 disable wallpaper:i:0 allow font smoothing:i:0 allow desktop composition:i:0 disable full window drag:i:1 disable menu anims:i:1 disable themes:i:0 disable cursor setting:i:0 bitmapcachepersistenable:i:1 full address:s:127.0.0.1 audiomode:i:0 redirectprinters:i:1 redirectcomports:i:1 redirectsmartcards:i:1 redirectclipboard:i:1 redirectposdevices:i:0 autoreconnection enabled:i:1 authentication level:i:2 prompt for credentials:i:1 negotiate security layer:i:1 remoteapplicationmode:i:1 alternate shell:s: shell working directory:s: gatewayhostname:s: gatewayusagemethod:i:4 gatewaycredentialssource:i:4 gatewayprofileusagemethod:i:0 promptcredentialonce:i:0 gatewaybrokeringtype:i:0 use redirection server name:i:0 rdgiskdcproxy:i:0 kdcproxyname:s: drivestoredirect:s:* redirectlocation:i:1 smart sizing:i:1 redirectwebauthn:i:1 enablerdsaadauth:i:0 camerastoredirect:s:* devicestoredirect:s:* remoteapplicationname:s:RemoteApp Name 1 remoteapplicationprogram:s:C:\RemoteAppDirectory1 remoteapplicationcmdline:s: remoteapplicationicon:s: "@ }, @{ Name = "RDP Profile Name" IconPath = $iconPaths[1] ConfigurationContent = @" screen mode id:i:1 use multimon:i:1 desktopwidth:i:1920 desktopheight:i:1080 session bpp:i:32 winposstr:s:0,1,260,26,1578,1032 compression:i:1 keyboardhook:i:2 audiocapturemode:i:0 videoplaybackmode:i:1 connection type:i:7 networkautodetect:i:1 bandwidthautodetect:i:1 displayconnectionbar:i:1 enableworkspacereconnect:i:0 disable wallpaper:i:0 allow font smoothing:i:0 allow desktop composition:i:0 disable full window drag:i:1 disable menu anims:i:1 disable themes:i:0 disable cursor setting:i:0 bitmapcachepersistenable:i:1 full address:s:127.0.0.1 audiomode:i:0 redirectprinters:i:1 redirectcomports:i:1 redirectsmartcards:i:1 redirectclipboard:i:1 redirectposdevices:i:0 autoreconnection enabled:i:1 authentication level:i:2 prompt for credentials:i:1 negotiate security layer:i:1 remoteapplicationmode:i:1 alternate shell:s: shell working directory:s: gatewayhostname:s: gatewayusagemethod:i:4 gatewaycredentialssource:i:4 gatewayprofileusagemethod:i:0 promptcredentialonce:i:0 gatewaybrokeringtype:i:0 use redirection server name:i:0 rdgiskdcproxy:i:0 kdcproxyname:s: drivestoredirect:s:* redirectlocation:i:1 smart sizing:i:1 redirectwebauthn:i:1 enablerdsaadauth:i:0 camerastoredirect:s:* devicestoredirect:s:* remoteapplicationname:s:RemoteAppName 2 remoteapplicationprogram:s:C:RemoteAppDirectory2 remoteapplicationcmdline:s: remoteapplicationicon:s: "@ } ) # Process each RDP profile foreach ($profile in $rdpProfiles) { try { $fileName = "$($profile.Name).rdp" $iconPath = $profile.IconPath $rdpFilePath = Join-Path -Path $remoteAppProfilesFolder -ChildPath $fileName # Write the RDP configuration content to the file $profile.ConfigurationContent | Out-File -FilePath $rdpFilePath -Force Write-Host "RDP profile '$($profile.Name)' created at: $rdpFilePath" # Creating shortcut on Desktop $desktopPath = [System.Environment]::GetFolderPath('Desktop') $shortcutPath = Join-Path -Path $desktopPath -ChildPath ("$($profile.Name).lnk") $shortcut = (New-Object -ComObject WScript.Shell).CreateShortcut($shortcutPath) $shortcut.TargetPath = $rdpFilePath $shortcut.IconLocation = $iconPath $shortcut.Save() Write-Host "Shortcut for '$($profile.Name)' created at: $shortcutPath" } catch { Write-Host "Error processing profile '$($profile.Name)': $_" } }