Перейти к содержимому

Фотография

C# Создание подключения по RDP


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 4

#1 Dr_Shadow

Dr_Shadow

    Новый участник

  • Members
  • Pip
  • 40 сообщений
  • ФИО:Doctor Shadow

Отправлено 23 июля 2013 - 15:05

Всем привет!
Занимаюсь тестирвоние распределенной системы и мне нужен совет знающего человека. У меня есть 2 компьютера, на одном запускаються авто-тесты, на втором работает определенная программа, с интерфейсом которой время от времени нужно взаимодействовать из авто-теста. Это взамоидействие осуществляеться через программу. Проблема в том, что Twin можетработать только в том случае, если на машине прошла авторизация, то есть пользователь зашел и интерфейс отрисовывается. Постойнно держать окно RDP открытым не слишком удобно. Возникла идея подключаться к машине через MSTSCLib, но компонент AxMsRdpClient5 сам по себе предназначен для работы с оконными формами System.Windows.Forms.
Возможно ли скрыть эту форму, что бы весь процесс происходил фоном? Как вариант
this.Visible = false;
Готов рассмотреть альтернативные варианты.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using AxMSTSCLib;
using MSTSCLib;
using System.Runtime.InteropServices;



namespace AutoLogin
{
    public partial class Form1 : Form
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
             Application.SetCompatibleTextRenderingDefault(false);
             Form1 f = new Form1();
             
             Application.Run(f);
            Console.ReadLine();
 
        }

        private AxMSTSCLib.AxMsRdpClient5 rdpClient;
        public Form1()
        {
            rdpClient = new AxMSTSCLib.AxMsRdpClient5();
            ((ISupportInitialize)rdpClient).BeginInit();
            rdpClient.Enabled = true;
            rdpClient.Location = new System.Drawing.Point(0, 0); 
            rdpClient.Name = "MsRdpClient"; 
            rdpClient.Size = ClientSize; 
            rdpClient.TabIndex = 1; 
            rdpClient.Anchor = (AnchorStyles)(AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right); 
            Controls.Add(rdpClient); ((ISupportInitialize)rdpClient).EndInit();
            Form1_Load();
        }


        void axRemoteDesktop_OnDisconnected
            (object sender, IMsTscAxEvents_OnDisconnectedEvent e)
        {
            Application.Idle += ExitTimerEvent;
        }

        public void ExitTimerEvent(object source, EventArgs e)
        {
            Application.Idle -= ExitTimerEvent;
            if (rdpClient.Connected == 1)
            {
                rdpClient.Disconnect();
            }
            LogoffDisconnectedSessions();
            Close();
        }

        private Timer logoffTimer;
        private void Form1_Load()
        {
            LogoffDisconnectedSessions();

            String username = "user";
            String password = "pass";
            rdpClient.Server = "ыукмук";
            rdpClient.UserName = username;
            rdpClient.AdvancedSettings2.ClearTextPassword = password;
            rdpClient.Domain = "domen";
            rdpClient.FullScreen = false;
            rdpClient.AdvancedSettings2.RedirectDrives = false;
            rdpClient.AdvancedSettings2.RedirectPrinters = false;
            rdpClient.AdvancedSettings2.RedirectPorts = false;
            rdpClient.AdvancedSettings2.RedirectSmartCards = false;
            rdpClient.AdvancedSettings6.RedirectClipboard = false;
            rdpClient.AdvancedSettings6.MinutesToIdleTimeout = 1;
            rdpClient.Size = new System.Drawing.Size(1000, 1000);
            rdpClient.OnDisconnected += new
                AxMSTSCLib.IMsTscAxEvents_OnDisconnectedEventHandler
                    (axRemoteDesktop_OnDisconnected);

            rdpClient.Connect();
            Console.WriteLine(rdpClient.Connected);
            logoffTimer = new Timer();
            logoffTimer.Tick += new EventHandler(LogoutTimerEvent);
            logoffTimer.Interval = 150000;
            logoffTimer.Start();
        }

        private void Form1_Close(object sender, FormClosedEventArgs e)
        {
            Application.Idle -= ExitTimerEvent;
            if (rdpClient.Connected == 1)
            {
                rdpClient.Disconnect();
            }
        }

        public void LogoutTimerEvent(object source, EventArgs e)
        {
            logoffTimer.Stop();
            rdpClient.Disconnect();
        }

        enum WTS_CONNECTSTATE_CLASS
        {
            WTSActive,
            WTSConnected,
            WTSConnectQuery,
            WTSShadow,
            WTSDisconnected,
            WTSIdle,
            WTSListen,
            WTSReset,
            WTSDown,
            WTSInit
        };

        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
        struct WTS_SESSION_INFO
        {
            public int SessionId;
            public string pWinStationName;
            public WTS_CONNECTSTATE_CLASS State;
        }

        [DllImport("wtsapi32.dll")]
        private static extern bool WTSLogoffSession(IntPtr hServer, int SessionId, bool bWait);
        private static IntPtr WTS_CURRENT_SERVER_HANDLE = IntPtr.Zero;

        [DllImport("wtsapi32.dll", CharSet = CharSet.Auto)]
        private static extern bool WTSEnumerateSessions(
                IntPtr hServer,
                [MarshalAs(UnmanagedType.U4)]
            int Reserved,
                [MarshalAs(UnmanagedType.U4)]
            int Version,
                ref IntPtr ppSessionInfo,
                [MarshalAs(UnmanagedType.U4)]
            ref int pCount);

        [DllImport("wtsapi32.dll")]
        private static extern void WTSFreeMemory(IntPtr pMemory);

        private void LogoffDisconnectedSessions()
        {
            IntPtr buffer = IntPtr.Zero;
            int count = 0;
            if (WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE, 0, 1,
                                     ref buffer, ref count))
            {
                WTS_SESSION_INFO sessionInfo = new WTS_SESSION_INFO();

                for (int index = 0; index < count; index++)
                {
                    sessionInfo = (WTS_SESSION_INFO)Marshal.PtrToStructure(
                       new IntPtr(buffer.ToInt32() +
                                  (Marshal.SizeOf(sessionInfo) * index)),
                       typeof(WTS_SESSION_INFO));

                    WTS_CONNECTSTATE_CLASS state = sessionInfo.State;
                    if (state == WTS_CONNECTSTATE_CLASS.WTSDisconnected)
                    {
                        WTSLogoffSession(WTS_CURRENT_SERVER_HANDLE,
                                         sessionInfo.SessionId, true);
                    }
                }
            }
            WTSFreeMemory(buffer);
        }
    }
}

  • 0

#2 sawoy

sawoy

    Новый участник

  • Members
  • Pip
  • 51 сообщений
  • ФИО:Alex Savchuk

Отправлено 23 июля 2013 - 17:41

Привет!

Почему просто не запустить на машине tigthvnc server и залогиниться через viewer на машине ?
Или нужно использовать именно программное, а не конфигурационное решение?
  • 0

#3 Dr_Shadow

Dr_Shadow

    Новый участник

  • Members
  • Pip
  • 40 сообщений
  • ФИО:Doctor Shadow

Отправлено 24 июля 2013 - 05:26

Привет!

Почему просто не запустить на машине tigthvnc server и залогиниться через viewer на машине ?
Или нужно использовать именно программное, а не конфигурационное решение?

Привет!
Хотелось бы все организовать без использованиея дополнительных программ, незачем использовать tigthvnc server если есть уже родной сервис винды.
  • 0

#4 checo

checo

    Опытный участник

  • Members
  • PipPipPipPip
  • 400 сообщений
  • Город:Н.Новгород

Отправлено 31 июля 2013 - 14:53

Возможно ли скрыть эту форму, что бы весь процесс происходил фоном? Как вариант

this.Visible = false;


Ну как бы да, компонент RDP по определению должен быть визуальным и открываться на форме или в веб-странице. Хотя, если не жалко времени, можно разобраться с протоколом )) http://www.freerdp.com/


Если есть какие-то проблемы со свойством Visible, возможно, следует попробовать дополнительные параметры.
Например, хорошая программка VirtuaWin, чтобы прятать окна, использует винапишный вызов SetWindowLong(). В .NET можно либо напрямую подтянуть из библиотеки, либо оверрайдить CreateParams у формы. вот тут еще несколько советов по прятанью формы.


  • 1

#5 Dr_Shadow

Dr_Shadow

    Новый участник

  • Members
  • Pip
  • 40 сообщений
  • ФИО:Doctor Shadow

Отправлено 05 августа 2013 - 06:31

Скрыть окно клиента получилось, но все равно как то смущает наличие в тестовом проекте скрытой формы.
Появился еще один вопрос, можно ли при наличии подключения к компьютеру, описанным выше способом, отправлять команды на удаленный компьютер, например запустить приложение или отправить сочетание клавиш?
  • 0


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных