Программно создать и запустить сеанс RDP (без графического интерфейса) - PullRequest
6 голосов
/ 04 мая 2010

Я хотел бы знать, есть ли способ создать и запустить сеанс удаленного рабочего стола на Windows Server программным путем.

Я пытаюсь создать автоматический инструмент для создания локальных пользователей, а затем запустить соответствующий сеанс RDP. Я уже создал LocalUser и добавил их в Remote Desktop Users (используя net.exe). Но меня поразил следующий шаг: создать и запустить rdp-сессию пользователя. Я не знаю, как решить эту проблему, не имея клиентского интерфейса удаленного рабочего стола.

Я работаю на Windows Server 2003 и использую VS2008 с .NET 3.5.

Привет.

Ответы [ 4 ]

15 голосов
/ 04 мая 2010

Вы можете вызвать mstsc.exe и передать параметры в командной строке, чтобы указать, к чему подключаться.

mstsc.exe документация по MSDN

1 голос
/ 14 октября 2018

Я написал простую утилиту для использования элемента управления 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);
        }
    }
}
1 голос
/ 05 мая 2010

Во-первых, я обнаружил, что на сервере необходима опция для включения автоматического запуска службы терминалов.

  1. На Сервере терминалов нажмите Пуск, выберите Программы, укажите Администрирование, а затем нажмите Подключение к серверу терминалов Конфигурация.
  2. Дважды щелкните подключение rdp-tcp, а затем нажмите кнопку «Дополнительно». Если вы хотите изменить свойства для Клиенты ICA, дважды щелкните по ica-rdp вместо подключения, а затем нажмите Свойства.
  3. В разделе AutoLogon нажмите, чтобы снять проверку «Запросить пароль» коробка.
  4. Нажмите OK, нажмите OK, а затем нажмите Выход в меню Соединение.

источник: support.microsoft.com/kb/260711

После этого я сделал кое-что на основе этого проекта: codeproject.com/KB/cs/RemoteDesktop_CSharpNET.aspx Из того, что я тестировал, я думаю, что невозможно пропустить соединение RDP Client (MsTscLib или mstsc.exe) У меня что-то работает, но это, конечно, плохой стиль. Я использую ActiveX Component Events, чтобы узнать результат соединения. Т.е.: OnLogonError и OnLoginComplete.

вот мой источник: http://codepaste.net/uiuuxc

Я жду ваших комментариев.

1 голос
/ 04 мая 2010

Вы можете использовать элемент управления ActiveX для удаленного рабочего стола для подключения, вам нужно будет разместить его в форме, но форма не должна быть видимой. Пример см. http://www.codeproject.com/KB/cs/RemoteDesktop_CSharpNET.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...