New-ISERemoteTabForm.ps1

#requires -version 4.0
#requires -module ISE

Function New-ISERemoteForm {


[cmdletbinding()]
Param()

Add-Type -AssemblyName PresentationFramework
Add-Type -AssemblyName PresentationCore
Add-Type -AssemblyName WindowsBase

#define the form XAML
[xml]$xaml=@"
<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication3"
        Title="New Remote Tab" Height="350" Width="525">
    <Grid HorizontalAlignment="Left" Height="316" VerticalAlignment="Top" Width="521" Margin="0,0,-2.333,0">
        <GroupBox x:Name="ComputerGroup" Header="Computer" HorizontalAlignment="left" Margin="15,12,0,0" VerticalAlignment="Top" Height="116" Width="490">
            <Grid HorizontalAlignment="Left" Height="90" Margin="3,7,0,0" VerticalAlignment="Top" Width="472">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="89*"/>
                    <ColumnDefinition Width="383*"/>
                </Grid.ColumnDefinitions>
                <Label x:Name="label" Content="Computername" HorizontalAlignment="Left" Margin="12,0,0,0" VerticalAlignment="Top" Grid.ColumnSpan="2"/>
                <TextBox x:Name="textComputername" HorizontalAlignment="Left" Height="20" Margin="20,3,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="170" Grid.Column="1" ToolTip="Enter a computername or a comma separated list" TabIndex="0"/>
                <Label x:Name="label1" Content="Username" HorizontalAlignment="Left" Margin="14,61,0,0" VerticalAlignment="Top"/>
                <TextBox x:Name="textUserName" HorizontalAlignment="Left" Height="20" Margin="20,65,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="170" Grid.Column="1" ToolTip="Enter a username in the format domain\user or machine\user" TabIndex="3"/>
                <Label x:Name="label2" Content="Password" HorizontalAlignment="Left" Margin="190,61,0,0" VerticalAlignment="Top" RenderTransformOrigin="3.926,-1.387" Grid.Column="1"/>
                <PasswordBox x:Name="textPassword" HorizontalAlignment="Left" Margin="250,65,0,0" VerticalAlignment="Top" Width="116" Height="20" Grid.Column="1" TabIndex="4"/>
                <Label x:Name="label7" Content="Configuration" HorizontalAlignment="Left" Margin="15,32,0,0" VerticalAlignment="Top" Grid.ColumnSpan="2" Width="90"/>
                <TextBox x:Name="textConfiguration" Grid.Column="1" HorizontalAlignment="Left" Height="20" Margin="20,35,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="170" ToolTip="Enter an alternate configuration name" TabIndex="2"/>
                <CheckBox x:Name="checkPromptCredential" Content="Prompt Credential" Grid.Column="1" HorizontalAlignment="Left" Margin="248.667,5,0,0" VerticalAlignment="Top" ToolTip="Prompt for a credential for each connection" TabIndex="1"/>
            </Grid>
        </GroupBox>
         <Label x:Name="version" Content="version" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="15,283,0,0"/>
        <Button x:Name="btnConnect" Content="_Connect" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Margin="428,283,0,0" TabIndex="12"/>
        <GroupBox x:Name="OptionsGroup" Header="Options" HorizontalAlignment="Left" Height="135" Margin="15,137,0,0" VerticalAlignment="Top" Width="490 ">
            <Grid HorizontalAlignment="Left" Height="124" Margin="-1,3,-2,-41" VerticalAlignment="Top" Width="481">
                <CheckBox x:Name="checkSSL" Content="Use SSL" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="6,1,0,0" TabIndex="5"/>
                <Label x:Name="label3" Content="Use Port" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="3,30,0,0"/>
                <TextBox x:Name="textPort" HorizontalAlignment="Left" Height="20" Margin="60,34,0,0" TextWrapping="Wrap" Text="5985 " VerticalAlignment="Top" Width="120" ToolTip="What port do you want to connect to?" TabIndex="7"/>
                <Label x:Name="label4" Content="Authentication" HorizontalAlignment="Left" Margin="223,30,0,0" VerticalAlignment="Top" />
                <Label x:Name="label5" Content="Certificate Thumbprint" HorizontalAlignment="Left" Margin="71,-4,0,0" VerticalAlignment="Top" />
                <TextBox x:Name="textCertThumb" HorizontalAlignment="Left" Height="20" Margin="201,1,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="275" ToolTip="Enter the certificate thumbprint for SSL connections" TabIndex="6"/>
                <Label x:Name="label6" Content="Profile Script" HorizontalAlignment="Left" Margin="3,65,0,0" VerticalAlignment="Top" />
                <TextBox x:Name="textScript" HorizontalAlignment="Left" Height="20" Margin="86,65,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="310" ToolTip="Enter the path to a PowerShell script to be invoked remotely" TabIndex="9"/>
                <Button x:Name="btnBrowse" Content="Browse" HorizontalAlignment = "Left" Margin="405,65,0,0" VerticalAlignment="Top" Width="75" TabIndex="10"/>
                <CheckBox x:Name="checkScript" Content="Save script setting" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="5,95,0,0" TabIndex="11" ToolTip="Save the current script setting to `$ISERemoteProfile"/>
            </Grid>
        </GroupBox>
        <ComboBox x:Name="comboAuthentication" HorizontalAlignment="Left" Margin="336,190,0,0" VerticalAlignment="Top" Width="120" TabIndex="8">
            <ComboBoxItem Content="Default" IsSelected="True"/>
            <ComboBoxItem Content="Basic"/>
            <ComboBoxItem Content="Kerberos"/>
            <ComboBoxItem Content="CredSSP"/>
            <ComboBoxItem Content="Negotiate"/>
            <ComboBoxItem Content="NegotiatewithImpliedCredential"/>
            <ComboBoxItem Content="Digest"/>
        </ComboBox>
    </Grid>
</Window>
"@


#create something to read the XAML
$reader = New-Object system.xml.xmlnodereader $xaml

#load the form XAML into the reader
$form = [windows.markup.xamlreader]::Load($reader)

#get elements

#go through a list of form elements and create a variable using the name to
#btnBrowse can be referenced as $btnBrowse
'textComputername','textUserName','textConfiguration','textPort','textCertThumb',
'textScript','textPassword','checkPromptCredential','checkSSL','comboAuthentication',
'btnBrowse','checkScript','version','btnConnect' |
Foreach {
  Set-Variable -Name $_ -Value ($form.FindName($_))
}

#set the version label
$version.content = "v$((get-module ISERemoteTab).Version.ToString())"
#set remote script from variable if found
if ($ISERemoteProfile -AND (Test-Path -path $ISERemoteProfile)) {
    $textScript.Text = $ISERemoteProfile
}

$checkPromptCredential.Add_Checked({
$textUserName.Clear()
$textPassword.Clear()
$textUserName.IsEnabled = $False
$textPassword.IsEnabled = $False
})

$checkPromptCredential.Add_Unchecked({
$textUserName.IsEnabled = $True
$textPassword.IsEnabled = $True
})

$btnBrowse.add_Click({
    $dlg = New-object Microsoft.Win32.OpenFileDialog
    $dlg.DefaultExt = ".ps1"
    $dlg.Filter = "PowerShell Scripts (*.ps1)|*.ps1"
    If ($dlg.ShowDialog()) {
        $textScript.text = $dlg.FileName
    }
})

$btnconnect.Add_Click({

  #Throw an error if no computername
  if (-Not $textComputername.Text) {
    Write-Warning "You must enter a computername"
    #bail out
    Return
  }
  
  #uncomment for troubleshooting
  #Write-Host "Connecting to $($textComputername.Text)" -ForegroundColor Cyan

  $nrtParams = @{
  Computername = $($textComputername.Text).Trim() -split ","
  Port = $textPort.Text.trim()
}

if ($textConfiguration.text) {
    $nrtParams.Add("ConfigurationName",$textConfiguration.Text.trim())
}
If ($checkPromptCredential.IsChecked) {
  $nrtParams.Add("PromptForCredential",$True)
}
elseif ($textUsername.Text -AND $textPassword.Password) {
    #create a credential object
    $cred =  New-Object System.Management.Automation.PSCredential $textUsername.Text,$textPassword.SecurePassword
    $nrtParams.Add("Credential",$cred)
  }

  if ($textScript.Text) {
    $nrtParams.Add("Profile",$textScript.text)
  }

  $nrtParams.Add("Authentication",$comboAuthentication.Text)
  
  if ($checkSSL.IsChecked) {
    $nrtParams.Add("UseSSL",$True)
  } 

  if ($textCertThumb.Text) {
    $nrtParams.Add("CertificateThumbprint",$textCertThumb.Text.trim())
  }

  #uncomment for troubleshooting
  #write-host ($nrtparams | out-string) -foregroundcolor yellow
  
  #invoke the new remote tab function
  New-ISERemoteTab @nrtParams

}) #click

#display the form
$textComputername.focus() | OUt-Null

$form.showDialog() | Out-Null

#save last script used to a global variable
if ($checkScript.IsChecked) {
    $global:ISERemoteProfile = $textScript.text
}


} #close function