One of the functionality changes in Windows 7 was to Remote Assistance. In XP, you got a nice GUI to input the machine name or IP address of the target machine. In Windows 7, this was changed in a way where it was difficult to do this. You could do it via the command line. As an academic exercise I wanted to create a graphical wrapper for this that duplicated the XP Remote Assistance experience for service desk.
[void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") [void][System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") #endregion #region Post-Constructor Custom Code #endregion #region Form Creation #Warning: It is recommended that changes inside this region be handled using the ScriptForm Designer. #When working with the ScriptForm designer this region and any changes within may be overwritten. #~~< form1 >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ $form1 = New-Object System.Windows.Forms.Form $form1.Text = "ASG Remote Assistance" #~~< btnStartRA >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ $btnStartRA = New-Object System.Windows.Forms.Button $btnStartRA.Location = New-Object System.Drawing.Point(13, 219) $btnStartRA.Size = New-Object System.Drawing.Size(230, 23) $btnStartRA.TabIndex = 4 $btnStartRA.Text = "Start Remote Assistance" $btnStartRA.UseVisualStyleBackColor = $true $btnStartRA.Enabled = $false $btnStartRA.Add_Click({ StartRA }) #~~< lstCompInfo >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ $lstCompInfo = New-Object System.Windows.Forms.ListBox $lstCompInfo.FormattingEnabled = $true $lstCompInfo.Location = New-Object System.Drawing.Point(13, 86) $lstCompInfo.SelectedIndex = -1 $lstCompInfo.Size = New-Object System.Drawing.Size(259, 108) $lstCompInfo.TabIndex = 3 #$lstCompInfo.Text = "" #~~< btnConnect >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ $btnConnect = New-Object System.Windows.Forms.Button $btnConnect.Location = New-Object System.Drawing.Point(197, 37) $btnConnect.Size = New-Object System.Drawing.Size(75, 23) $btnConnect.TabIndex = 2 $btnConnect.Text = "Connect" $btnConnect.UseVisualStyleBackColor = $true #$btnConnect.Add_Click({ $lstCompInfo.Items.Add("This is a test") }) $btnConnect.Add_Click({ GetDetails }) #~~< txtCompName >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ $txtCompName = New-Object System.Windows.Forms.TextBox $txtCompName.Location = New-Object System.Drawing.Point(13, 39) $txtCompName.Size = New-Object System.Drawing.Size(168, 20) $txtCompName.TabIndex = 1 $txtCompName.Text = "" #~~< Label1 >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ $Label1 = New-Object System.Windows.Forms.Label $Label1.Location = New-Object System.Drawing.Point(13, 13) $Label1.Size = New-Object System.Drawing.Size(215, 23) $Label1.TabIndex = 0 $Label1.Text = "Enter Computer Name or IP Address:" $form1.Controls.Add($btnStartRA) $form1.Controls.Add($lstCompInfo) $form1.Controls.Add($btnConnect) $form1.Controls.Add($txtCompName) $form1.Controls.Add($Label1) #endregion #region Custom Code #endregion #region Event Loop function Main{ [System.Windows.Forms.Application]::EnableVisualStyles() [System.Windows.Forms.Application]::Run($form1) } function GetDetails { $strComputer = $txtCompName.Text $strConnStatus = test-connection -computername $strComputer -quiet if ($strConnStatus -eq $true) { # connection worked, continue script $lstCompInfo.Items.Add("Connection successful...") $objUsername = gwmi -computer $strComputer Win32_ComputerSystem | select username, model $strUserName = $objUsername.Username $strModelName = $objUsername.Model $lstCompInfo.Items.Add("Current User is $strUserName") $lstCompInfo.Items.Add("The target computer is a $strModelName") $btnStartRA.Enabled = $true $btnStartRA.Text = "Start Remote Assistance for $strComputer" } else { # connection failed #Write-Host "Connection failed with status " $lstCompInfo.Items.Add("Connection failed.") $btnStartRA.Enabled = $false #$strConnStatus | select * } } function StartRA { $RAconName = $txtCompName.Text $lstCompInfo.Items.Add("Attempting to connect to $RAconName" ) cmd /c msra /offerRA $RAconName } #endregion #endregion #region Event Handlers Main #This call must remain below all other event functions #endregion
Some of the lines are note are:
- Line 24 – The Add_Click will call the function that performs the Remote Assistance connection
- Line 76 – The script performs a test to see if the system name is responding
- Line 87 – As part of the IF…THEN statement, if the connection status is true, the connect button is enabled by this line.
- Line 106 – This line performs the command line version of the Remote Assistance connection, using the supplied computer name in the command