$Password=Read-Host-AsSecureStringNew-LocalUser"RDPUser"-Password$PasswordAdd-LocalGroupMember-Group"Remote Desktop Users"-Member"RDPUser"Add-LocalGroupMember-Group"Administrators"-Member"RDPUser"# List UserGet-LocalUser
# Make sure AWS CLI is set in UTF8$env:PYTHONUTF8="1"# --------------------------------------# Function to get all running and stopped EC2 instances# --------------------------------------functionGet-EC2Instances{$instances=awsec2describe-instances--filters"Name=instance-state-name,Values=running,stopped"--query"Reservations[*].Instances[*].{InstanceId:InstanceId,Name:Tags[?Key=='Name']|[0].Value,State:State.Name,Platform:Platform}"--outputjson|ConvertFrom-Jsonreturn$instances}# --------------------------------------# Function to display a menu and get user selection# --------------------------------------functionShow-MenuAndGetSelection{param([array]$items)Write-Host"No. | Instance ID | State | OS Type | Name "Write-Host"----|---------------------|---------|---------|----------------------------"$i=1foreach($itemin$items){$name=if($item.Name){$item.Name}else{"N/A"}$platform=if($item.Platform){$item.Platform}else{"Linux "}Write-Host("{0,-3} | {1,-17} | {2,-7} | {3} | {4,-26}"-f$i,$item.InstanceId,$item.State,$platform,$name)$i++}$selection=Read-Host"Please select an instance by entering the corresponding number"return$items[$selection-1].InstanceId}# --------------------------------------# Function to run a PowerShell script on the remote instance# --------------------------------------functionRun-RemoteScript{param([string]$instanceId,[string]$script)Write-Host"Running Remote Script on $instanceId"# Write-Host "Script: $script"$commandId=awsssmsend-command--instance-ids$instanceId--document-name"AWS-RunPowerShellScript"--parameters"commands=['$script']"--query"Command.CommandId"--outputtextWrite-Host("Running command with ID : $commandId")Start-Sleep-Seconds1$status=awsssmlist-command-invocations--command-id$commandId--details--query"CommandInvocations[*].Status"--outputtextwhile($status-eq"InProgress"){Write-Host(".")Start-Sleep-Seconds5$status=awsssmlist-command-invocations--command-id$commandId--details--query"CommandInvocations[*].Status"--outputtext}if($status-ne"Success"){Write-Host"FAILED to run the script on the remote instance."Write-Host"------------------------------"awsssmget-command-invocation--command-id$commandId--instance-id$instanceId--query"StandardErrorContent"--outputtextWrite-Host"------------------------------"exit}Write-Host"ERRORS ------------------------------"awsssmget-command-invocation--command-id$commandId--instance-id$instanceId--query"StandardErrorContent"--outputtextWrite-Host"OUTPUT ------------------------------"awsssmget-command-invocation--command-id$commandId--instance-id$instanceId--query"StandardOutputContent"--outputtext}# --------------------------------------# Function to generate a password# --------------------------------------functionGet-RandomPassword{param([int]$length=12)if($length-lt4){throw"Password length must be at least 4 characters."}$LowerCase='abcdefghijklmnopqrstuvwxyz'$UpperCase='ABCDEFGHIJKLMNOPQRSTUVWXYZ'$Numbers='0123456789'$SpecialCharacters='!#$%&*()-_=+[]{}|;:,.<>?'$AllCharacters=$LowerCase+$UpperCase+$Numbers+$SpecialCharacters$Password=''$Password+=$LowerCase|Get-Random-Count1$Password+=$UpperCase|Get-Random-Count1$Password+=$Numbers|Get-Random-Count1$Password+=$SpecialCharacters|Get-Random-Count1for($i=4;$i-lt$length;$i++){$Password+=$AllCharacters|Get-Random-Count1}$Password=($Password.ToCharArray()|Sort-Object{Get-Random}).ToString()return$Password}# Get all running and stopped EC2 instances$instances=Get-EC2Instances# Check if there are any instancesif($instances.Count-eq0){Write-Host"No EC2 instances found."exit}# Show menu and get the selected instance ID$instanceId=Show-MenuAndGetSelection-items$instances# Output selected instance IDWrite-Host"Selected Instance ID: $instanceId"# Define User and Password$username='RDPUserAuto'$password=Get-RandomPassword-length15Write-Host"$username password: $password"# Define Script to set up RDP User$rdpUserScript1=@"if (-not (Get-LocalUser -Name $username -ErrorAction SilentlyContinue)) { Write-Host \"Create New RDP User\" New-LocalUser -Name $username -Password (ConvertTo-SecureString -AsPlainText $password -Force) -FullName \"RDP User\" -Description \"User for RDP access\" Add-LocalGroupMember -Group \"Remote Desktop Users\" -Member $username Add-LocalGroupMember -Group \"Administrators\" -Member $username Add-LocalGroupMember -Group \"Utilisateurs du Bureau à distance\" -Member $username Add-LocalGroupMember -Group \"Administrateurs\" -Member $username} else { Write-Host \"Setting New Password on existing RDP User\" Set-LocalUser -Name $username -Password (ConvertTo-SecureString -AsPlainText $password -Force)}Get-LocalUser"@$rdpUserScript2=@"Get-Disk"@# Run the script on the remote instanceRun-RemoteScript-instanceId$instanceId-script$rdpUserScript1Write-Host"Press any key to Open Tunnel"$null=Read-Host# Start a session using AWS Systems Manager Session Manager$sessionCommand="aws ssm start-session --target $instanceId --document-name AWS-StartPortForwardingSession --parameters portNumber=3389,localPortNumber=3390"# Start the sessionStart-Process-NoNewWindow-FilePath"cmd.exe"-ArgumentList"/c $sessionCommand"# Wait for the session to startStart-Sleep-Seconds5Write-Host"Press any key Start RDP Window"$null=Read-Host$securePassword=ConvertTo-SecureString-String$password-AsPlainText-Force$encryptedPassword=$securePassword|ConvertFrom-SecureString# Define the RDP connection parameters$rdpFilePath="$env:TEMP\rdp_connection.rdp"$rdpContent=@"full address:s:localhost:3390username:s:$usernamedomain:s:password 51:b:$encryptedPassword"@# Save the RDP connection parameters to a file$rdpContent|Out-File-FilePath$rdpFilePath-EncodingASCII# Start the Remote Desktop Connection application with the RDP fileStart-Process-FilePath"mstsc.exe"-ArgumentList$rdpFilePath