Сегодня мы будем учиться писать троянчик. Небольшой, но СВОЙ! Почему? Конечно-конечно, троянов в сети навалом, но рано или поздно они =вдруг= начинают определяться антивирусами, приходиться ждать апдейта етц. Ожидание — самый скучный повод. Не знаю как вы, но я ждать не люблю, да и использовать чужие трояны это совсем не по->
После точки, как учили в школе, пишем с большой буквы. Так вот, о чем я? Писать я буду, как обычно, на своем любимом Builder C++. Если у вас руки растут не оттуда, откуда у меня ноги, то без проблем все переделаете под Дельфи, если припрет конечно.
Естественно, наш троян будет состоять из 2х частей =) Серверной (отправляемой как подарок ламерюге) и клиентской (оставим себе на память). Надо сказать, что я давно не юзал никакие трояны, так что не знаю что там сейчас они умеют делать, может уже и коврик под мышкой научились двигать или корпус компа открывать. Мы же пишем «троянчик», поэтому делать он будет только следующее:
1) читать, удалять, запускать файлы на удаленном компьютере
Удаленный рабочий стол средствами Python
2) работать с реестром на удаленном компьютере
3) ну и традиционный набор разных бесполезных функций, типа открытие CD-ROM’a, смена клавишей мышки etc.
Перекурили и поехали!
Использовать будем стандартные компоненты TClientSocket и TServerSocket.
Начнем с клиента. Набрасываем простенький интерфейс и приступаем к реализации. Управлять удаленным компьютером будем с помощью специальных команд. Для примера пускай структура их будет такая:
Nпараметры. N — цифра. Каждому действию присвоен свой код. Т.е. например 1 — перезагрузка, 2 — чтение файла и т.д. Главное чтоб было однозначное соответствие между тем что хотим сделать (команда передаваемая клиентом) и тем что выполняет программа (обработка команды на сервере).
С этим разобрались. Теперь параметры. Бывает мало передать только номер команды. Конечно, чтобы перезагрузить компьютер никаких параметров не надо (хотя можно и здесь передать параметры в функцию перезагрузки), но как например реализовать удаление файла не передавая параметра? Мы передаем команду на удаление файла, но какого?!
Для этого будем использовать параметры. В качестве параметра в данном случае будет передаваться имя файла. Бывает, что мало передать один параметр. Например надо прочитать n-строчек из file.txt. Здесь необходимо передать 2 параметра. В нашем примере параметры отделяются друг от друга комбинацией »
» — перевод каретки. Объясняется данная структура тем, что в сервере мы сначала помещаем полученную команду в TStringList и потом можем спокойно обращаться к любой строчке этого TStringList’а через свойство Strings[i], где i-номер строчки, а соответственно и номер параметра. В общем, это вещи достаточно очевидные.
Вот так, вроде бы только начав писать клиентскую часть мы ее уже почти и закончили! Ведь на самом деле ничего кроме отсылки команд и приема ответов от сервера она делать и не должна. Для приема ответов просто создадим поле TMemo и добавим обработчик события OnRead нашего компонента TClientSocket:
Удаленный доступ к компьютеру, как подключить удаленный рабочий стол Windows | Заработок в интернете
Вот и все. Клиент законен! Переходим к серверу.
Сервер будет чуть пообъемнее. Вначале определимся с задачами:
1) получение команд
2) их обработка и выполнение соответствующих действий
3) отсылка ответа клиенту (должны же мы знать что происходит на сервере)
Реализуем.
Во-первых, никакого визуального оформления естественно не будет =) Поэтому на форму поместим только 1 компонент: TServerSocket . Инициализацию его проведем в функции FormCreate(). Хотя можно было бы просто прописать 2 параметра в Object Inspector’е. Но раз уж сделали, так сделали =)
Итак, указали порт, активизировали сокет. Теперь обрабатываем событие ClientRead , т.е. получение данных сокетом. Комментирую на примере:
Теперь немного подробнее. Мы пишем специальный класс TTrojanUtilites , в котором реализуем все необходимые функции. В RecognizeCommand (String Directive) мы только отделяем команду от параметров и запускаем необходимые методы TTrojanUtilites, передавая по необходимости в них параметры.
Реализация TTrojanUtilites есть то, чем мы сейчас займемся. Класс оформим в отдельном модуле, не забудьте подключить его.
Поехали. Во-первых, подключаем #include — необходимо для реализации работы с CD-ROM’ом. Далее пишем все необходимые методы.
Краткие комментарии на примере:
Вот тут я не отвечаю за все ОСи, перезагрузка-то будет, но хотелось бы сделать ее как после нажатия кнопки RESET, а так будет послано сообщение WM_. ENDSESSION etc. Короче, пробуйте сами. Могу только подкинуть основные направления поиска: смотри функции ExitWindows(), ExitWindowsEx(), InitiateSystemShutdown() и AbortSystemShutdown(). Для особо продвинутых могу предложить вариант написать надежный ребут под определенную ось и чипсет =) Например, мой прошлый комп стабильно резетился (только в Win9x, в NT не работало) следующей вставочкой:
Откуда цифры? Читайте доки по чипсету =) Одним словом, универсального метода перезагрузить комп без WM_. ENDSESSION я не знаю. Если вы знаете — напишите пару строк, не в падлу =)
Запись в реестр аналогична, только используется метод WriteBool(TTSL->Strings[2], false ); для записи булевского значения, WriteInteger(TTSL->Strings[2], StrToInt(TTSL->Strings[4])); — для числового, WriteString(TTSL->Strings[2], TTSL->Strings[4]); — для строкового.
Для запуска файлов на удаленном компьютере используем следующую функцию:
Файл запускается в той программе, с которой ассоциирован запуск данного типа файлов, т.е. вы можете запускать не толкьо exe, com, bat, но и любые другие файлы. Html-файл откроется в Explorer’e, Opere, Netscape или еще в чем-то. Хрен знает чем там ламерюга пользуется. Можете запустить ему мп3-шку Децла послушать или Бритни какой-нить, пусть проблюется =)
Идем дальше. Парочка бесполезных функций:
Можно сделать переключение кнопок обратно (передайте в SwapMouseButton параметр false), но я бы посоветовал поставить таймер и каждую секунду переключать кнопки туда-сюда, веселее будет =) В падлу сейчас уже добавлять, но вкратце это будет так: добавляем TTimer на форму, устанавливаем необходимый интервал, и в обработчике события OnTimer прописываем вызов функции SwapMouseButton с параметром, противоположным прошлому вызову. Млин, все-таки все расписал =)
Теперь довольно важная функция:
Данная функция НЕ удаляет файл сразу. Это сделано специально, так как файлы могут использоваться системой и их удаление возможно только после перезагрузки, данная функция помечает файл к удалению, а удалиться он только после перезагрузки, которую вы легко можете вызвать.
Да, еще маленькое примечание: данная функция удаляет только 1 файл, если вы пометите второй файл к удалению — то будет удален только он. А первый останется нетронутым. Немного измените функцию — и можно будет удалять файлы пачками =) Могу еще добавить немного инфы на случай, если надо будет удалить целый каталог и вы точно знаете что в нем нет открытых файлов. Используйте стандартную API функцию SHFileOperation, установив тип операции wFunc в FO_DELETE. Пример:
Только внимательно все проверьте! Будет обломно если ламерюга «вдруг» увидит надпись «Папка голые тетки не может быть удалена, так как юзер активно смотрит сразу 10 порно-фильмов из нее!».
А вообще, если опять удалиться в теорию, то наш главный объект Application имеет несколько полезных событий, наиболее интересное для нас OnException происходит тогда, когда в приложении возникает необработанная исключительная ситуация (деление на ноль, удаление несуществующего файла etc). По умолчанию, обработчик этого события вызывает метод ShowException для отображения окна сообщения с пояснением причины ошибки (оно нам надо?! конечно, НЕТ!).
Но, вы можете изменить реакцию на событие onException, переписав его обработчик. Тут ничего трудного нет, просто я не ставил перед собой задачу написать офигенный троян, только подтолкнуть вас к этому =) Кто захочет — допишет все необходимое сам, если что — я подскажу =) Ну вот, вроде бы все функции реализовали. Теперь немного о том, что мы не сделали =) Мы не сделали: загрузку/закачку файла. Это все можно сделать подправив SendFile(). Стандартных функций для пересылки файлов через TClient(Server)Socket я не нашел, но впрочем, это не проблема — просто передавайте файлы фрагментами.
Теперь нам осталось только разобраться с автозагрузкой трояна. Сделаем следующее:
1) при запуске файл переписывается в папку, в которой установлены винды.
2) прописываем запуск нашего файла в реестре.
В принципе, это все. Троян готов! Конечно, он тяжеловат, малофункционален etc, НО все это можно исправить, творите =) Если сделаете что-нибудь интересное — скидывайте, с радостью опубликуем это для всех. А вообще, я хочу сейчас все это переделать под API Socket’ы, без всяких компонентов, тогда и файл exe гораздо меньше станет. Если у кого-нибудь есть интерес к этому делу — напишите пару строк в мыльницу.
Товарищи ламеры! Внимательно следите теперь за соединениями по порту 4321 =) Некоторые ведь ничего не перекомпиливают и не меняют =)
Тогда какие библиотеки использовать?
Как написать программу которая удаленно управляет windows?
Представьте, что вам звонит мама и говорит, что у неё не открываются сайты. Настоящий айтишник отвечает так: «Не трогай компьютер, сейчас подключусь и всё починю». Вот как этому научиться.
Что за удалённый доступ
Где-то стоит компьютер. Вы подключаетесь к нему с помощью специального софта и получаете доступ.
В одном случае доступ — это возможность исполнять команды. О таком мы писали в статье про SSH: у вас на экране командная строка, вы можете выполнять команды на другом компьютере, но не увидите его экрана.
В другом случае может быть доступ к файловой системе — то есть можно копировать и записывать файлы. Так работает, например, FTP: когда вы подключаетесь к FTP-серверу, то фактически получаете удалённый доступ к части его файловой системы.
В третьем случае можно прямо увидеть картинку с монитора другого человека и поработать за компьютером так, будто вы сами за ним сидите. Такие системы называют VNC, Remote Desktop, «Общий экран», «Удалённый рабочий стол» и другими мудрёными словами.
Что нужно для удалённого доступа
Чтобы подключиться к другому компьютеру, нужно:
- установить на удалённый компьютер программу, которая отвечает за управление (серверная часть) — например TeamViewer;
- запустить у себя аналогичную программу (клиентская часть);
- убедиться, что оба компьютера могут выйти в интернет;
- найти другой компьютер через интернет — по IP-адресу, через серверный софт или как-то ещё.
Если интернет не работает на одном из компьютеров, соединиться не получится. Поэтому если вам звонят и говорят: «У меня интернет не работает, можешь как-то починить?», то удалённый доступ тут не поможет.
Для чего можно применить
О, вариантов масса.
Техподдержка. Понятное дело, можно оказывать техподдержку детям и родителям. Вы видите их монитор, нажимаете клавиши и исправляете всё, что нужно исправить. Не поможет, если нет интернета или не загружается компьютер как таковой.
Облачный терминал. Допустим, у вас на работе стоит супермощный компьютер с профессиональным софтом и огромной памятью. А дома — маломощный ноутбук, который годится только для интернета. И вот вам нужно срочно доделать какую-то работу на рабочем компьютере.
Не нужно ехать в офис: подключаетесь к нему удалённо, делаете дела, отключаетесь. Потеет рабочая машина, а ваш домашний ноутбук используется скорее как монитор.
Подобным образом сейчас устроены сервисы стриминга игр: где-то далеко стоит супермощный компьютер с мощной видеокартой, а вы подключаетесь к нему со своего простого. Запускаете «Ведьмака» и наслаждаетесь графикой. Но играете вы не на своём компьютере, а как бы на удалённом, там происходят все вычисления, а к вам через интернет лишь прилетает картинка.
Медиацентр. Например, у вас есть старый компьютер или мини-ПК. К нему подключена аудиосистема. На компьютере работает приложение для стриминга музыки или торрент-клиент, который обменивается легальной музыкой с другими пользователями.
Вам не нужно постоянно смотреть в монитор этого компьютера — он работает как бы фоном. Отлично: убираете от него монитор и клавиатуру, включаете удалённый доступ и подсоединяетесь к этому компьютеру, когда нужно.
Видеонаблюдение. К медиацентру можно подключить веб-камеру и подсоединяться к ней, когда вы в отпуске или на работе. Будет видно, чем занимается кот в ваше отсутствие.
Информационный экран. У вас в офисе может лежать ненужный мини-ПК или системный блок. Можно подключить его к большой плазме, сам комп спрятать куда-нибудь под стол, а плазму повесить повыше. Включаете комп, подключаетесь к нему дистанционно и настраиваете, что нужно выводить на плазме. Отключаетесь.
Комп показывает что надо на экране, шурша где-то в углу.
Файловый сервер. Старый системный блок или мини-ПК может отлично работать файловым сервером, а с помощью удалённого доступа можно настраивать его работу, управлять файлами и давать задание на скачку новых файлов. Он стоит себе на антресолях, а его жёсткие диски наполняются полезным контентом.
Секретная рабочая станция. Вариант для хакеров. Например, вы решили написать сверхсекретную программу. Арендуете виртуальный сервер где-нибудь в Ирландии или Корее. Ставите на него свою любимую операционную систему и сервер удалённого доступа. Удалённо подключаетесь.
Действуете так, как будто это ваш компьютер: пишете там код, тестируете, в общем — работаете как за обычным компьютером. А на своём домашнем ничего не храните.
Как только омоновцы начинают пилить вам дверь, отключаетесь от удалённого компьютера и стираете его адрес из памяти. Даже если эксперты попытаются извлечь ваш секретный код с изъятой техники, они ничего не найдут — ведь секретный код весь хранится на удалённом компьютере, адрес которого они не знают.
Что конкретно делать
Если у вас есть родители с компьютерами, установите им приложение TeamViewer и убедитесь, что оно работает: им выдаётся имя пользователя, приложение запускается и не вешает комп. Поставьте ярлык приложения на видное место, чтобы родители могли его найти в любой ситуации. На своём компьютере тоже поставьте TeamViewer.
Когда родителям потребуется компьютерная помощь, попросите их продиктовать вам код и пароль из их TeamViewer, введите его в своём TeamViewer, и у вас откроется их компьютер, будто вы сидите рядом.
Если у вас несколько компьютеров дома, установите на них какое-нибудь приложение с названием VNC Server, а на свой планшет — VNC Viewer. Теперь вводите во вьюер адреса ваших домашних компьютеров, и вы сможете управлять ими удалённо из другой комнаты. Адреса должны быть локальными, типа 192.168.0.2. О них ещё напишем.
Если у вас есть Mac Mini, отключите его от монитора и поставьте на антресоль. Теперь с любого другого Mac в доме зайдите в «Сеть» — Ваш Mac Mini — нажмите кнопку «Общий экран. ». Введите логин и пароль от Mac Mini, и у вас запустится встроенная в Mac OS система удалённого доступа.
Если используете VNC или доступ через общий экран Mac, помните о такой особенности: эти протоколы работают только тогда, когда два компьютера могут напрямую дозвониться друг до друга через интернет. Если вы захотите залезть в свой удалённый компьютер извне домашней сети, вам придётся прокладывать до него особый маршрут. Как это сделать, мы ещё расскажем, а если вкратце — это непросто.
Источник: hololenses.ru
Создание удаленного сервера с помощью Visual C#
Эта статья поможет вам создать удаленный сервер, к которому другое приложение может получить доступ с помощью Visual C#.
Исходная версия продукта: Visual C #
Исходный номер базы знаний: 307445
Аннотация
В этой статье показано, как создать удаленный сервер, к которому может получить доступ другое приложение. Приложение, обращающееся к этому серверу, может находиться на том же компьютере, на другом компьютере или в другой сети. Удаленный сервер разбивается на две части: объект сервера и серверное приложение. Объект сервера — это объект, с которым взаимодействует клиент, и серверное приложение используется для регистрации объекта сервера в платформе удаленного взаимодействия .NET.
В этой статье рассматриваются следующие пространства имен библиотеки классов Microsoft платформа .NET Framework:
- System.Runtime.Remoting
- System.Runtime.Remoting.Channels
- System.Runtime.Remoting.Channels.Tcp
Требования
В этой статье предполагается, что вы знакомы со следующими разделами:
- Visual Studio .NET или Visual Studio
- Visual C# .NET или Visual C #
- Сеть
Создание объекта удаленного сервера
Первым шагом при создании серверного приложения является создание объекта сервера. Объект сервера — это то, что клиентское приложение создает экземпляр и взаимодействует с ним на серверном компьютере. Клиентское приложение делает это через прокси-объект, созданный на клиенте. В этом примере объект сервера находится в библиотеке классов (DLL) и называется myRemoteClass.
- Создайте приложение библиотеки классов в Visual C# .NET. Назовите проект ServerClass. Класс 1 создается по умолчанию.
- В Обозреватель решений переименуйте файл кода Class1.cs в ServerClass.cs.
- Откройте файл ServerClass.cs и переименуйте Class1 в myRemoteClass. Необходимо также переименовать конструктор по умолчанию для класса в , чтобы он соответствовал имени класса. класс myRemoteClass должен наследоваться MarshalByRefObject от класса . Теперь ваш класс должен выглядеть следующим образом:
public class myRemoteClass: MarshalByRefObject < public myRemoteClass() < // TO DO: Add constructor logic here. >>
public bool SetString(String sTemp) < try < Console.WriteLine(«This string » has a length of «, sTemp, sTemp.Length); return sTemp != «»; > catch < return false; >>
Создание удаленного серверного приложения
После создания объекта сервера, с которым будет взаимодействовать клиент, необходимо зарегистрировать этот объект в платформе удаленного взаимодействия. При регистрации объекта необходимо также запустить сервер и заставить сервер прослушивать порт, чтобы клиенты подключились к нему. Для этого требуется тип проекта, который выводит исполняемый файл.
Причина включения объекта сервера в отдельный проект заключается в том, что вы можете легко ссылаться на серверный объект из клиентского проекта. Если вы включите его в этот проект, вы не сможете ссылаться на него, так как ссылки могут быть заданы только для DLL-файлов.
- Создайте консольное приложение в Visual C# .NET, чтобы запустить удаленный сервер. Класс 1 создается по умолчанию.
- В Обозреватель решений переименуйте файл Class1.cs в RemoteServer.cs.
- Добавьте ссылку на System.Runtime.Remoting пространство имен.
- Добавьте ссылку на сборкуServerClass.dll , созданную в предыдущем разделе.
- Используйте инструкцию using для Remoting пространств имен , Remoting.Channels и Remoting.Channels.TCP , чтобы позже в коде не требовалось квалифицировать объявления в этих пространствах имен. Оператор необходимо использовать using перед любыми другими объявлениями.
using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Tcp;
TcpChannel chan = new TcpChannel(8085); ChannelServices.RegisterChannel(chan);
- Полное имя типа регистрируемого объекта (в этом примере — ServerClass.myRemoteClass ), за которым следует имя сборки ServerClass. Укажите здесь имя пространства имен, а также имя класса. Так как пространство имен не указано в предыдущем разделе, используется корневое пространство имен по умолчанию.
- Назовите конечную точку, где объект будет опубликован, как RemoteTest. Чтобы подключиться к объекту, клиенты должны знать это имя.
- SingleCall Используйте режим объекта, чтобы указать окончательный параметр. Режим объекта указывает время существования объекта при его активации на сервере. В случае SingleCall объектов создается новый экземпляр класса для каждого вызова, который выполняет клиент, даже если один и тот же клиент вызывает один и тот же метод несколько раз. С другой стороны, Singleton объекты создаются только один раз, и все клиенты взаимодействуют с тем же объектом.
RemotingConfiguration.RegisterWellKnownServiceType( System.Type.GetType(«ServerClass.myRemoteClass, ServerClass»), «RemoteTest», WellKnownObjectMode.SingleCall);
System.Console.WriteLine(«Hit to exit. «); System.Console.ReadLine();
Ссылки
- Класс TcpChannel
- Метод RemotingConfiguration.RegisterWellKnownServiceType
Общие сведения о удаленном взаимодействии .NET см. в документации по платформа .NET Framework руководства разработчика.
Источник: learn.microsoft.com
C# Разработка
(Пункт 1)
Использование скриншотов является самой простой в реализации, но достаточно трудоемкой операцией. Найденные примеры захвата снимка экрана и его обработка будет намного «тяжелее», чем используя обычный терминал удаленного рабочего стола. Попробуйте в Realtime поделать хотя бы 10 скриншотов и заметите, что ваше приложение будет активно отбирать ресурсы CPU. Да, сейчас компьютеры достаточно мощные и ваш компьютер может это не чувствовать, но клиенты могу сидеть и на Athlon II, имея загрузку в 30% процессорного времени, что неприемлемо. Выходом может стать нарезка скриншотов используя видео захват с дисплея через DirectX, но решения для copy+paste у меня нет.
(Пункт 2)
UltraVNC достаточно известное кросс платформенное приложение для демонстрации и управлением экраном. Находил обертки для .NET, поэтому, если все плохо, то можно посмотреть в эту сторону. Как мне известно, принцип работы VNC основан на захвате скриншотов клиента, и для того, что бы производить видео захват с дисплея, они используют свой драйвер, аккуратно подгружаемый при демонстрации. При этом сам драйвер идёт как отдельный устанавливаемый пакет и может быть скачан отдельно (искать UltraVNC Driver).
(Пункт 3)
Ну и наконец самый, но мой взгляд, простой способ реализовать демонстрацию удаленного экрана это использование нативного API под названием Windows Desktop Sharing (RDP). Используется стандартный механизм терминала удаленного рабочего стола, но в отличии от обычного подключения, удаленный компьютер не блокируется, как при терминале, и вы можете как в Teamviewer пользоваться одной мышкой и видеть экран одновременно. Далее я перечислю возможности, доступные при работе с Windows Desktop Sharing в формате плюсы и минусы:
- Демонстрацию удаленного экрана пользователя.
- Подключение больше одного человека (код примера надо немного доработать).
- Можно настраивать уровень взаимодействия для каждого подключающегося человека. Допустим одному дать полный доступ к управление, другому только для просмотра. За это отвечает CTRL_LEVEL выбор уровня.
- Мы можем в любой момент отключить пользователя, или приостановить показ.
- Самой интересной особенностью считаю возможность «Фильтрации списка окон». Таким образом мы можем дать возможность видеть только то, что мы хотим показать, скрывая остальные окна.
- Можно обеспечивать как прямое подключение клиента к серверу, так и сервера к клиенту. Тем самым можно решить проблему с NAT, инициируя подключение с другой стороны подсети.
- Для авторизации можно использовать схему с логином и паролем.
- Отображение идёт через ActiveX оснастку, которую можно разместить как на WPF, так и на WinForm.
- Проекты можно без потери функциональности конвертировать под работы с .NET Framework 3.5.
- Поддержка идет только начиная с Windows Vista.
Демонстрация работы описанного ниже функционала.
- Показ полного рабочего стола.
- Показ только тех окон, которые мы хотим показать. В моем случае я буду показывать только окно приложения
Внимание! Возможен еще вариант отображения определенного статического региона экрана, но я не добавлял этот функционал.
— Полный рабочий стол:
— Отображение конкретного окна:
Как с этом работать?
Всё API у Windows Desktop Sharing находится в библиотеке «C:WindowsSystem32RdpEncom.dll». Серверный хостинг осуществляется через RDPSession класс:
Для демонстрации стоит использовать IRDPSRAPIViewer, который представляет из себя ActiveX оснастку:
Поэтому, для того, что бы нам извлечь обертку для последующего использования, нам понадобится воспользоваться утилитой Aximp.exe (Windows Forms ActiveX Control Importer), которая извлекает AcitveX обертку (так же мы можем добавлять ActiveX control в Visual Studio Toolbox). К сожалению, сама утилита не входит в комплект поставки Visual Studio, но присутствует в Windows SDKs, поэтому, ради нее, придется поставить SDK. Версия не должна влияет, поэтому после того как установка завершится, переходите в папку «C:Program Files (x86)Microsoft SDKsWindows» и поиском находите этот файл.
Наконец то можно создать недостающие классы обертки и приступить к работе:
- AxRDPCOMAPILib.dll
- RDPCOMAPILib.dll
- _IRDPSessionEvents
- AxRDPViewer
- RDPSession
- IRDPSRAPIApplication
- _IRDPSessionEvents
- IRDPSRAPIApplicationFilter
- IRDPSRAPIApplicationList
- IRDPSRAPIAttendee
- IRDPSRAPIAttendeeDisconnectInfo
- IRDPSRAPIAttendeeManager
- IRDPSRAPIInvitation
- IRDPSRAPIInvitationManager
- IRDPSRAPISessionProperties
- IRDPSRAPISharingSession
- IRDPSRAPITcpConnectionInfo
- IRDPSRAPIViewer
- IRDPSRAPIVirtualChannel
- IRDPSRAPIVirtualChannelManager
- IRDPSRAPIWindow
- IRDPSRAPIWindowList
- А так же ClassInterface для каждого из интерфейсов выше.
Внимание! В этой схеме есть одно НО! Мы обязанный таскать с собой эти два файла, что, на мой взгляд, не очень удобно. А ведь в них содержатся только обертки для работы с Native API. Далее будет описано как избавить от них .
Архитектура модуля.
Теперь я хочу описать сделанный мной пример (ссылка на исходник в начале статьи), в котором я добавил некоторые упрощения для работы в WPF приложениях с шаблоном MVVM. Я постарался максимально отдалить вас от подготовки RDP описанной выше, доведя использование до простого размещения Control на форме и возможности сразу его использовать. А так же, что бы было еще быстрее понять как с ним работать, я разместил пример его использования.
Дерево иерархии:
Про все тонкости использования, и о том что где лежит, я напишу поподробнее:
Проект Rdp.Terminal.Core .
- ClientControlsRemoteTerminal.xml — служит для демонстрации удаленного рабочего стола на стороне клиента
- ServerRdpSessionServer.cs — содержит примитивные методы, для запуска серверной части.
- WinApi — что бы избавиться от потребности таскать с собой AxRDPCOMAPILib.dll и RDPCOMAPILib.dll я декомпилятором извлек все обертки и разместил их в модуле в папке winapi.
- WinApiSupportUtils.cs содержит метод проверки поддержки текущей версии Windows на возможность использования RDP.
Проект Rdp.Demostration.
- Prism — содержит нужные, для демонстрации использования MVVM шаблона, классы.
- ViewsMainWindow.xaml — главная View окна, выполняющая как роль серверной так и клиентской стороны.
- ViewModelsMainWindowViewModel.cs — содержащая всю логику для работы со viewMainWindow.xaml.
- Свойство SmartSizing. Если его значение True, тогда удаленный экран будет полностью растянут под размер доступной области. Иначе если False, тогда появятся два бегунка и картинка будет видна полностью, без растягивания.
Внимание! Для работы с RemoteTerminal, содержащим AxRDPViewer, необходимо создать во ViewModel свойство с типом RdpManager и произвести привязку на свойство с таким же названием у RemoteTerminal < controls : RemoteTerminal RdpManager color: #a31515;»>Binding RdpManager > » />. После чего, во ViewModel, через это объект можно управлять терминалом.
Процесс удаленного подключения.
При запуске сервера настраивается в каком режиме он будет запускать (с фильтрацией окон или без неё). Далее мы создаём так называемое «Приглашение» вызывая метод CreateInvitation. Оно представляет из себя XML, содержащий информацию доступных сетевых интерфейсах сервера, используемый порт для подключений, MAC и идентификатор зашифрованный паролем, который надо ввести клиенту.
Вся эта информацию поможет клиентам с подключением, так как вам не потребуется выяснять какой точно интерфейс доступен клиенту. В случае, если сервер закрыт NAT, клиент может выступить в качестве сервера обратно подключения, но при этом демонстрацию будет осуществлять серверный компьютер. В ситуации, когда когда обе стороны разделяет NAT соединение невозможно.
После подключения модуля удаленного управление вам необходимо будет позаботиться о доставке строки подключения между клиентом и сервером.
Внимание! Не все методы имеются в RdpManager, поэтому в зависимости от потребности придётся их пробросить вам самим.
Источник: www.devowl.net