Connect-RemoteDesktop.ps1
#function Connect-RemoteDesktop { <# .SYNOPSIS Connect an RDP session with PSCredentials .DESCRIPTION Calls BetterCredentials\Set-Credential to store the credential in a way that RemoteDesktop will recognize .NOTES Inspired by Connect-Mstsc from Jaap Brasser http://www.jaapbrasser.com .EXAMPLE Connect-RemoteDesktop -ComputerName server01 Creates a remote desktop session to server01 .EXAMPLE $Cred = BetterCredentials\Get-Credential Jaykul@HuddledMasses.org -Store New-RemoteDesktop server01, server02 $Cred Creates an RDP session to each of server01 and server02, using the specified credentials .EXAMPLE Get-ADComputer -Filter { Name -like *SQL* } | New-RemoteDesktop -Credential Jayku@HuddledMasses.org -Width 1024 Creates an RDP session to each server with a name that has "SQL" in it, using the stored credentials for Jaykul .EXAMPLE $Cred = BetterCredentials\Find-Credential -Target ContosoAzureRDP C:\PS> Get-AzureVM | Get-AzureEndPoint -Name 'Remote Desktop' | New-RemoteDesktop -ComputerName {$_.Vip,$_.Port -join ':'} -Credential $Cred First retrieves credentials for ContosoAzureRDP. You might have stored these previously by running a command like: C:\PS> BetterCredentials\Set-Credential -Target ContosoAzureRDP -Credential contoso\joel Then, starts an RDP session for each Azure Virtual Machine with those credentials #> [cmdletbinding(SupportsShouldProcess, DefaultParametersetName = 'UserPassword')] param ( # This can be a single computername or an array of computers to which RDP session will be opened [Parameter(Mandatory = $true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true, Position = 0)] [Alias('CN','IPAddress')] [string[]]$ComputerName, # The credential for the remote system [Parameter(ValueFromPipelineByPropertyName = $true, Position = 1)] [PSCredential]$Credential, # Sets the /admin switch on the mstsc command: Connects you to the session for administering a server [switch]$Admin, # Sets the /multimon switch on the mstsc command: Configures the Remote Desktop Services session monitor layout to be identical to the current client-side configuration [Parameter(ParameterSetName="MultiMonitorFullScreen")] [switch]$MultiMon, # Sets the /f switch on the mstsc command: Starts Remote Desktop in full-screen mode [Parameter(ParameterSetName="FullScreen")] [switch]$FullScreen, # Sets the /public switch on the mstsc command: Runs Remote Desktop in public mode [switch]$Public, # Sets the /w:<width> parameter on the mstsc command: Specifies the width of the Remote Desktop window [Parameter(ParameterSetName="Size")] [Alias('W','X')] [int]$Width, # Sets the /h:<height> parameter on the mstsc command: Specifies the height of the Remote Desktop window [Parameter(ParameterSetName="Size")] [Alias('H','Y')] [int]$Height, [switch]$Wait ) begin { [string]$MstscArguments = -join $( switch ($true) { {$Admin} { '/admin ' } {$MultiMon} { '/multimon ' } {$FullScreen} { '/f ' } {$Public} { '/public ' } {$Width} { "/w:$Width " } {$Height} { "/h:$Height " } } ) } process { foreach ($Computer in $ComputerName) { $ProcessInfo = New-Object System.Diagnostics.ProcessStartInfo $Process = New-Object System.Diagnostics.Process # Remove the port number for CmdKey otherwise credentials are not entered correctly if ($Computer.Contains(':')) { $ComputerCmdkey = ($Computer -split ':')[0] } else { $ComputerCmdkey = $Computer } Set-Credential -Target TERMSRV/$ComputerCmdkey -Credential $Credential -Type DomainPassword $ProcessInfo.FileName = "$($env:SystemRoot)\system32\mstsc.exe" $ProcessInfo.Arguments = "$MstscArguments /v $Computer" $ProcessInfo.WindowStyle = [System.Diagnostics.ProcessWindowStyle]::Normal $Process.StartInfo = $ProcessInfo if ($PSCmdlet.ShouldProcess($Computer, 'Connecting mstsc')) { [void]$Process.Start() if ($Wait) { $null = $Process.WaitForExit() } } } } |