Tuesday, November 03, 2009

Remote Desktop using C#.Net

Overview:
Remote Desktop Services is one of Microsoft Windows components to access a remote computer through network. Only the user interface of the application is presented at the client. Any input is redirected over to the remote computer over the network. At work we use Remote Desktop a great deal. It allows us to login to a remote server to perform health checks, deploy applications, troubleshoot problems, etc. We also use remote desktop often when we do WFH (work from home :)).

Why do we want to write a .Net application to do this when you have the MS Terminal Services client available from OS? Well, consider if you want to work on 3 different application servers at the same time and want to toggle between these 3 servers quite often. With the MSTSC, we will be running 3 different clients for the 3 servers and it is difficult to manage the working environment. In .Net you can develop an application with tab control to load remote desktop sessions in different tabs in one window.However, tab control is not in scope of this article. That gives me an idea for my next article :)

Microsoft Terminal Services Control

We will be using AxMSTSCLib an ActiveX component in our program to connect to the remote computer. It's not that hard to build a remote desktop application in .Net.
Microsoft has a "Microsoft RDP client control" ActiveX control that we will be using in our application.

This is how we do it

We will start by creating a windows application in the Visual Studio IDE.
Add reference to "Microsoft Terminal Services Control Type Library" from the COM tab. This will add MSTSCLib.dll to the project.





To add MSTSC to the toolbox, right click the toolbox and select "Choose Items…". Now add "Microsoft Terminal Services control from the COM tab.





Drag the newly added control from toolbox to the form.
Add 3 textbox and 2 button controls to the form.


Connect Button - Click Event:
Here is how we write the Connect button click event.

rdp.Server = txtServer.Text;
rdp.UserName = txtUserName.Text;

IMsTscNonScriptable secured = (IMsTscNonScriptable)rdp.GetOcx();
secured.ClearTextPassword = txtPassword.Text;
rdp.Connect();


Now assign the properties (Server, UserName) of RDP control with the textbox values.
Here's how easy to login to remote machine. However there is one catch, there is no direct method in RDP control through which you can pass the username and password to login to the remote desktop.
Due to security reasons you have to implement an interface (IMsTscNonScriptable) to cast it separately.

IMsTscNonScriptable secured = IMsTscNonScriptable)rdp.GetOcx();
secured.ClearTextPassword = txtPassword.Text;


Disconnect Button - Click Event:

To disconnect from the remote desktop session, we just need to call the Disconnect() method.
Before disconnecting, we want to ensure that the connection is still available. We don't want to disconnect if it is already disconnected (very clever huhJ)

if (rdp.Connected.ToString() == "1")
rdp.Disconnect();


Check the full source code here. Please leave your valuable comments and questions.
That's all folks! Happy Coding!

26 comments:

RRave said...

Hi,
I have read your blog, its cool and i think you are tamil.i would like to contact u. how can

tnx

Abdul Hakim said...

HI,
Please tell me, how you can use this for Smart Projects summary?
I need to do to connect to remote desktop to Pocket PC

manojkumar (John) said...

I have downloaded this code and i tryed to run it.But i don't know what i have to give in Server Name:, and UserName:,Password: ?
What i have to give here?
I am using LAN.

Please respond me as soon as possible.It is very urgent to me.
If possible try to send C# code.

Advance Thanks.

manojkumar (John) said...

I have downloaded this code and i tryed to run it.But i don't know what i have to give in Server Name:, and UserName:,Password: ?
What i have to give here?
I am using LAN.

Please respond me as soon as possible.It is very urgent to me.
If possible try to send C# code.

Advance Thanks.

דרגון טריפ ישראל said...

I'm trying to achive exactly what you did in:
http://www.codeproject.com/KB/cs/RemoteDesktop_CSharpNET.aspx

After I have downloaded your code project I see he reference a AxMSTSCLib dll (which you have to create manually for your pc).


I have tried to create my own AxMSTSCLib dll following this link:
http://bytes.com/topic/c-sharp/answers/684780-axmstsclib-axmstscax-known-issue

The problem is that the dll differs from wahat actually needed (see my thread below)

As seen in the attached print-screen my dll doesn't contain an AxHost that is used to execute the command:


IMsTscNonScriptable secured = (IMsTscNonScriptable)rdp.GetOcx();

Any idea how to solve this?



photos attached:

http://drop.io/hidden/eopb4tphk8qekl/asset/bm8tZ2V0LW9jeC1qcGc%253D

http://drop.io/hidden/eopb4tphk8qekl/asset/Z2V0b2N4LTEtanBn

דרגון טריפ ישראל said...
This comment has been removed by the author.
Nanung said...

hi, this is great article. i'm really interested.
my question is, should we configure something on the server so that client can monitor it? can this application used for client-client monitoring (not always client-server monitoring)? i need to learn this remote desktop because now i have to develop an educational application which teacher computer can monitor student's computer. any idea? thank you very much.

vishaldahuja said...

hey i got a bit confusion...what to do on client side for accessing it after i have filled the fields username password sever name etc. with the client's credentials.

Nazmul Hossain Bilash said...

I have downloaded this code and i tryed to run it.But i don't know what i have to give in Server Name:, and UserName:,Password: ?
What i have to give here?
I am using LAN.

Please respond me as soon as possible.It is very urgent to me.
If possible try to send C# code.

Nazmul Hossain Bilash said...

Can anyone tell me about Server Name, and UserName,Password of this code?plz help me.....

Unknown said...

client ip contains the ip of the pc u want to connect with on LAN
user name must contain th comp name
and password contains the password of the comp. u want to access means the remote one

Hemali Jayswal said...

i using this code but i can;t connect with remote desktop. and no any error msg nthing to dipsly plz sugeest me .. asap. its urgent for me..

javacafe said...

I am getting "connection cannot proceed authentication not enabled error while trying to connect to the server"
kindly advice
me

javacafe said...

Hi I am getting the below error
" the connection cannot proceed because authentication is not enabled "

kindly advice me

Daniel Dinu said...

Hi there , I need your help if you are kind. please tell me a way to contact you! thanks

Unknown said...

Hi I really need your help see http://stackoverflow.com/questions/10423779/casting-error-while-creating-rdp-connection

Anonymous said...

How to add audio files in a folder within my c# windows application.If i will create exe file ,it must run on another system.Please send me the coding.

JohnSmith said...

good blog :) I also write articles about .NET developing

JohnSmith said...

good blog :) I also write articles about .NET developing

User said...

rdp.Disconnect() only closes the remote window? But this is not correct logoff.
With logoff over MS RDP will data to be used for a new user, such as saved the Desktop directory on your hard drive!
How can I logoff with object rdp? The calling of the method Disconnect () is not enough!

User said...

rdp.Disconnect() only closes the remote window? But this is not correct logoff.
With logoff over MS RDP will data to be used for a new user, such as saved the Desktop directory on your hard drive!
How can I logoff with object rdp? The calling of the method Disconnect () is not enough!

User said...

rdp.Disconnect() only closes the remote window? But this is not correct logoff.
With logoff over MS RDP will data to be used for a new user, such as saved the Desktop directory on your hard drive!
How can I logoff with object rdp? The calling of the method Disconnect () is not enough!

User said...

Where is the method Logout()?

The Method Disconnect() is NOT Logout()!

Unknown said...

what is servername,user name and password,pls explain which servername,which password and which username we have to provide

Unknown said...

Dear Thiagarajan.A
your article is good but it did not reached it target ... we are the hangury programmer ,time is important to all of us would you kindley reveal the complete code
khalid sabtan
from saudi arabia

daelinbaars said...

nano titanium | TITanium Art
nanotanium art | TITanium Art ti89 titanium calculator | 2019 ford edge titanium for sale TITanium Art - Online Art of titanium granite Design | black titanium wedding bands TITanium Art at TITaniumArt. titanium exhaust tips