Я написал простую утилиту для использования элемента управления ActiveX для удаленного рабочего стола, как упомянуто @tyranid. Я попробовал ссылку на проект кода в его посте, и у меня возникли проблемы с тем, чтобы она работала в Windows 10, хотя она может хорошо работать для вас на Server 2003. Также код в этом примере не полностью автоматизирован, так как вам все равно придется взаимодействовать графический интерфейс, чтобы получить его для создания сеанса. В этом коде вы можете просто вызвать утилиту, указав сервер, имя пользователя, домен и пароль, и все будет сделано за вас.
Вот ссылка на мой вопрос, которая содержит несколько требований / подробностей, чем этот вопрос.
Создание сеанса Windows программно из консоли или службы Windows
А вот и моя утилита RDP. Если вы поместите этот код в библиотеку классов, вы сможете вызывать его из консольного приложения, приложения WinForms или из службы Windows.
ПРИМЕЧАНИЕ. Возможно, вам придется немного изменить этот код, чтобы он работал с более ранними ссылками и .NET 3.5. Я думаю, что все, что потребуется, - это ссылаться на более раннюю версию вызовов API. Звонки, которые я использовал, являются самыми последними на данный момент.
using System;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using AxMSTSCLib;
namespace Utility.RemoteDesktop
{
public class Client
{
private int LogonErrorCode { get; set; }
public void CreateRdpConnection(string server, string user, string domain, string password)
{
void ProcessTaskThread()
{
var form = new Form();
form.Load += (sender, args) =>
{
var rdpConnection = new AxMSTSCLib.AxMsRdpClient9NotSafeForScripting();
form.Controls.Add(rdpConnection);
rdpConnection.Server = server;
rdpConnection.Domain = domain;
rdpConnection.UserName = user;
rdpConnection.AdvancedSettings9.ClearTextPassword = password;
rdpConnection.AdvancedSettings9.EnableCredSspSupport = true;
if (true)
{
rdpConnection.OnDisconnected += RdpConnectionOnOnDisconnected;
rdpConnection.OnLoginComplete += RdpConnectionOnOnLoginComplete;
rdpConnection.OnLogonError += RdpConnectionOnOnLogonError;
}
rdpConnection.Connect();
rdpConnection.Enabled = false;
rdpConnection.Dock = DockStyle.Fill;
Application.Run(form);
};
form.Show();
}
var rdpClientThread = new Thread(ProcessTaskThread) { IsBackground = true };
rdpClientThread.SetApartmentState(ApartmentState.STA);
rdpClientThread.Start();
while (rdpClientThread.IsAlive)
{
Task.Delay(500).GetAwaiter().GetResult();
}
}
private void RdpConnectionOnOnLogonError(object sender, IMsTscAxEvents_OnLogonErrorEvent e)
{
LogonErrorCode = e.lError;
}
private void RdpConnectionOnOnLoginComplete(object sender, EventArgs e)
{
if (LogonErrorCode == -2)
{
Debug.WriteLine($" ## New Session Detected ##");
Task.Delay(10000).GetAwaiter().GetResult();
}
var rdpSession = (AxMsRdpClient9NotSafeForScripting)sender;
rdpSession.Disconnect();
}
private void RdpConnectionOnOnDisconnected(object sender, IMsTscAxEvents_OnDisconnectedEvent e)
{
Environment.Exit(0);
}
}
}