Как сделать программу удаленного доступа

Сегодня мы будем учиться писать троянчик. Небольшой, но СВОЙ! Почему? Конечно-конечно, троянов в сети навалом, но рано или поздно они =вдруг= начинают определяться антивирусами, приходиться ждать апдейта етц. Ожидание — самый скучный повод. Не знаю как вы, но я ждать не люблю, да и использовать чужие трояны это совсем не по->

После точки, как учили в школе, пишем с большой буквы. Так вот, о чем я? Писать я буду, как обычно, на своем любимом 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.

  1. Создайте приложение библиотеки классов в Visual C# .NET. Назовите проект ServerClass. Класс 1 создается по умолчанию.
  2. В Обозреватель решений переименуйте файл кода Class1.cs в ServerClass.cs.
  3. Откройте файл 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-файлов.

  1. Создайте консольное приложение в Visual C# .NET, чтобы запустить удаленный сервер. Класс 1 создается по умолчанию.
  2. В Обозреватель решений переименуйте файл Class1.cs в RemoteServer.cs.
  3. Добавьте ссылку на System.Runtime.Remoting пространство имен.
  4. Добавьте ссылку на сборкуServerClass.dll , созданную в предыдущем разделе.
  5. Используйте инструкцию 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# Разработка

https://bitbucket.org/sergey_vaulin/remotedesktopterminalservice/src

(Пункт 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.

Демонстрация работы описанного ниже функционала.

  1. Показ полного рабочего стола.
  2. Показ только тех окон, которые мы хотим показать. В моем случае я буду показывать только окно приложения

Внимание! Возможен еще вариант отображения определенного статического региона экрана, но я не добавлял этот функционал.

— Полный рабочий стол:

— Отображение конкретного окна:

Как с этом работать?

Всё 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» и поиском находите этот файл.

Наконец то можно создать недостающие классы обертки и приступить к работе:

  1. AxRDPCOMAPILib.dll
  2. 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

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru