Public/Connect-RDP.ps1

#requires -Version 2
function Connect-RDP
{
    [CmdletBinding()]

    Param(
        [Parameter(Mandatory = $False,Position = 0,ValueFromPipelineByPropertyName = $True)]
        [Alias('PSComputerName')]
        [string[]]$ComputerName = $null,
        
        [Parameter(Mandatory = $False)]
        [switch]$Force
    )
    
    DynamicParam{
        If($ComputerName)
        {
            New-DynamicParameter -Name Credential -TypeConstraint ([pscredential])
        }
    }
    
    Begin{
        If($PSBoundParameters.ContainsKey('Credential'))
        {
            $Credential = $PSBoundParameters.Credential
            $User = $Credential.UserName
            $Password = $Credential.GetNetworkCredential().Password

            If($User -like "$env:USERDOMAIN*")
            {
                Add-Type -AssemblyName System.DirectoryServices.AccountManagement
                $Domain = $env:USERDOMAIN
                $ContextType = [System.DirectoryServices.AccountManagement.ContextType]::Domain
                $PrincipalContext = New-Object -TypeName System.DirectoryServices.AccountManagement.PrincipalContext -ArgumentList $ContextType, $Domain
                $CredentialValidity = $PrincipalContext.ValidateCredentials($User,$Password)
                If(-not $CredentialValidity)
                {
                    Write-Warning -Message 'Logon failure: Unknown username or bad password.' 
                    Break
                }
            }
        }
    }

    Process{
        If($PSBoundParameters.ContainsKey('ComputerName'))
        {
            Foreach($Computer in $ComputerName)
            {
                If((Test-Connection -ComputerName $ComputerName -Count 1 -Quiet) -or $Force)
                {
                    If($PSBoundParameters.ContainsKey('Credential'))
                    {
                        Start-Process -FilePath $env:windir\System32\cmdkey.exe -ArgumentList "/generic:$Computer /user:$User /pass:$Password"
                    }

                    Start-Process -FilePath $env:windir\System32\mstsc.exe -ArgumentList "/v:$Computer /f" -WindowStyle Normal
                }
                Else
                {
                    Write-Warning -Message "Cannot contact $Computer."
                }
            }
        }
        Else
        {
            Start-Process -FilePath $env:windir\System32\mstsc.exe
        }
    }

    End{}
}