«Система удаленного администрирования»
СОДЕРЖАНИЕ: Цель курсовой работы изучить сетевое программирование на примере работы программы удаленного администрирования с элементами управления. Для достижения этой цели необходимо выполнить следующие задачиТюменский государственный университет
Институт математики и компьютерных наук
Кафедра информационной безопасности
Курсовая работа
по специальности
на тему «Система удаленного администрирования»
Выполнил:
Студент группы № 367
Колесников Евгений Николаевич
Руководитель:
Доцент кафедры
Широких Андрей Валерьевич
Дата сдачи: ___________
Оценка : ______________
Тюмень 2009 г.
Оглавление
Введение
Цель курсовой работы изучить сетевое программирование на примере работы программы удаленного администрирования с элементами управления. Для достижения этой цели необходимо выполнить следующие задачи:
- Разработать приложение со следующим набором функций:
- Работа как клиент серверное приложение
- Стандартный протокол TCP/IP
- Поддержка авторизации через логин/пароль;
- Передаваться будут снимки экрана;
- Работа с файловой системой удаленного компьютера;
- Работа с процессами приложений.
Специфика программы заключается в том, что администратор или администраторы (количество не ограничено) смогут контролировать действия удаленных пользователей, путем просмотра копии экрана, просматривать список процессов запущенных на удаленном хосте, с помощью файл-менеджера иметь представление обо всех дисках, файлах и папках, а так же возможность обмена сообщениями в общем чате. При необходимости возможно частичное управление удаленного компьютера путем добавления, завершения необходимых процессов, запуск и удаление любых файлов. Программа будет особенно полезна руководителям - проследить, чем же занимаются сотрудники в рабочее время. Программа пригодится преподавателям для экономии времени по проверке заданий. Встроенный чат будет удобен для оперативного обращения к администратору программы, да и в целом для общения между клиентами. Программа специально создана, чтобы решать конкретные задачи по обслуживанию пользователей.Теоретическая часть
Microsoft .NET Framework
Microsoft .NET Framework — программная технология, предназначенная для создания как обычных программ, так и веб-приложений (в качестве платформы для разработок впервые предложена корпорацией Microsoft).
Одной из основных идей Microsoft .NET является совместимость различных служб, написанных на разных языках. Например, служба, написанная на C++ для Microsoft .NET, может обратиться к методу класса из библиотеки, написанной на Delphi; на C# можно написать класс, наследованный от класса, написанного на Visual Basic .NET, а исключение, созданное методом, написанным на C#, может быть перехвачено и обработано в Delphi. Каждая библиотека (сборка) в .NET имеет сведения о своей версии, что позволяет устранить возможные конфликты между разными версиями сборок.
.NET является патентованной технологией корпорации Microsoft. Тем не менее, после заключения договоренности с компанией Novell, была признана технология Mono как реализация .NET на Unix-подобных системах (GNU/Linux, Mac OS X).
Сокеты
Сокет – это один конец двухстороннего канала связи между двумя программами, работающими в сети. Соединяя два сокета, можно передавать данные между разными процессами. Реализация сокетов обеспечивает инкапсуляцию протоколов сетевого и транспортного уровней.
Порт определен, чтобы разрешить задачу одновременного взаимодействия с несколькими приложениями. По существу с его помощью расширяется понятие IP-адреса. Компьютер, на котором в одно время выполняется несколько приложений, получая пакеты из сети, может идентифицировать целевой процесс, пользуясь канальным номером порта определенным при установлении соединения.
Сокет состоит из IP-адреса машины и номера порта, используемого приложением TCP. Поскольку IP-адрес уникален в Интернете, а номера портов уникальны на отдельной машине, номера сокетов также уникальны во всем Интернете. Эта характеристика позволяет процессу общаться через сеть с другим процессом исключительно на основании номера сокета.
Поддержку сокетов в .NET обеспечивают классы в пространстве имен System.Net.Soscet.
TCP или Transmission Control Protocol, используется как надежный протокол, обеспечивающий взаимодействие через взаимосвязанную сеть компьютеров. TCP- это ориентированный на соединение протокол, предназначенный для обеспечения надежной передачи данных между процессами, выполняемыми или на одном и том же компьютере или на разных компьютерах.
Криптография – она нужна для обеспечения безопасности передаваемых через сокет данных. При шифровании и дешифровании информации в симметричных алгоритмах используется один и тотже ключ.
Пространство имен System.Security.Cryptography обеспечивает простой способ реализации средств безопасности в .NET-приложениях при помощи криптографических классов.
Захват изображения BitBlt
Вы можете использовать точечный рисунок, чтобы захватить изображение, сохранить захваченное изображение в памяти, показать его на экране в другом месте окна вашего приложения, или показать его на экране в другом окне.
В некоторых случаях, можете возникнуть необходимость, чтобы ваше приложение захватывало изображения и сохраняло их только временно. Например, когда Вы масштабируете или увеличивайте (уменьшайте) рисунок, созданный в прикладной программе рисования, приложение должно временно сохранить нормальный вид изображения и показать на экране измененный в масштабе вид. Позже, когда пользователь выбирает нормальный вид, приложение должно заменить масштабированное изображение на копию нормального вида, который оно временно сохранило.
Чтобы временно сохранить изображение, ваше приложение должно вызвать функцию CreateCompatibleDC, чтобы создать контекст устройства (DC), который является совместимым с текущим контекстом устройства окна. После того, как Вы создадите совместимый контекст устройства, создайте точечный рисунок с соответствующими размерами при помощи вызова функции CreateCompatibleBitmap, а затем выберите его в этот контекст устройства при помощи вызова функции SelectObject.
После того, как совместимый контекст устройства будет создан, а соответствующий точечный рисунок выбран в него, Вы можете сделать захват изображения. Функция BitBlt захватывает изображение. Эта функция выполняет пересылку блока битов - то есть она копирует данные с исходного точечного рисунка в принимающий точечный рисунок. Однако, эти два параметра функции - не дескрипторы точечного рисунка. Вместо этого, BitBlt принимает дескрипторы, которые идентифицируют два контекста устройства и копирует растровые данные с точечного рисунка, выбранного в источниковом DC в точечный рисунок, выбранный в целевом DC. В данном случае, целевой DC - совместимый контекст устройства, таким образом когда BitBlt завершает передачу, изображение сохраняется в памяти. Чтобы восстановить на экране изображение, вызовите BitBlt второй раз, устанавливая совместимый контекст устройства как источниковый DC, а контекст устройства окна (или принтера) как целевой DC.
Код примера ниже из приложения, которое захватывает изображение всего рабочего стола, создает совместимый контекст устройства и точечный рисунок с соответствующими размерами, выбирает точечный рисунок в совместимый контекст устройства (DC), а затем копирует изображение, используя функцию BitBlt.
Класс NetworkStream
Данные передаются по сети между двумя узлами в форме непрерывного потока. Для обработки таких потоков в платформе .NET имеется специальный класс NetworkStream, который входит в пространство имен System.Net.Sockets и используется для отправки и получения данных через сетевые сокеты.
Объект NetworkStream – это небуферизированный поток, который не поддерживает произвольный доступ к данным. Невозможно изменить позицию внутри потока, и, следовательно, использование метода Seek() и свойства Position() порождает исключение.
Класс FileStream
Класс FileStrem удобен для выполнения операций ввода/вывода для файлов. При передаче файлов по сети на стороне сервера с помощью это класса возможно записать содержимое файла в поток, а на клиентской стороне воссоздать снова и сохранить полученный поток в формате исходного файла.
Класс MemoryStream
Бывают такие ситуации, когда приложениям часто требуется данные, например, поиск справочных данных в таблице. Тогда сохранение данных в файле может привести к задержкам и снизить производительность приложения. Решение таких случаев предоставляет класс MemoryStream, с помощью которого данные можно сохранять в памяти.
Класс MemoryStream полезен для быстрого временного сохранения данных. Хороший пример его применения – передача сериализованных объектов внутри процесса, можно использовать MemoryStream для временного сохранения сериализованных объектов. Такой подход улучшает производительность по сравнению с использованием классов FileStream или BufferedStream. В нашем приложении MemoryStream используется для максимально производительной передачи изображений с удаленного компьютера. Массив байтов минует сохранение в файл а загружается сразу в виртуальную, после чего сразу отображается в компоненте Image. Так же для обработки сериализованных массивов данных.
Сериализация
Сериализация – это процесс выбора объектов и преобразования информации об их состоянии в форму, которая может сохранятся или переносится. Сохраненный или перенесенный объект затем десериализуем, чтобы воссоздать его исходное состояние. Таким образом, вы можете, сериализовать объект, передать полученную информацию по сети и восстановить объект и его исходное состояние из другого приложения или системы.
Вот некоторые основные области, где сериализация дает преимущества:
1. Доступность – компонент можно сохранить в файле и обращаться к нему в любое время.
2. Время жизни – сохранение объекта с его состоянием продлевает ему жизнь. Обычно, когда вы закрываете приложение, все связанные с ним объекты автоматически уничтожаются.
3. Использование в сетевых приложениях – сложная форма объекта была преобразована в формат, подходящий для передачи через сеть и, возможно, через брандмауэры.
4. Надежность – сохраненный объект можно воссоздать «как он есть»
С помощью сериализации в приложении осуществляется передача с сервера клиентам информации обо всех пользователях в сети, так же на сервере происходит сериализация списков процессов и файлов. После передачи данные десериализуются в исходный тип данных.
Практическая часть
Описание сервера
Внешний вид сервера добавление нового пользователя
Чтобы воспользоваться всеми функциями сервера необходимо ввести пароль, после чего можно запускать, отключать сервер, так же добавлять удалять пользователей имеющих право на подключение к нему, разграничивать их права доступа.
Сервер в данном приложении служит для аутентификации пользователей. Это происходит следующим образом:
1. Администратор добавляет пользователя на сервере, если выбирает Free User, то пользователь данной системы имеет право только на общий чат, если выбирает Main User, то пользователь имеет право просматривать копию экрана, список процессов, список файлов у Free User.
2. На любом другом компьютере, находящемся в той же сети, что и компьютер где запущен сервер, запускается клиентское приложение.
3. После чего необходимо пройти авторизацию. Для этого необходимо ввезти логин и пароль и нажать на кнопку “Go”. После чего эти данные передаются на сервер, где обрабатываются и возвращают команды, дающие понять клиентскому приложению, какие права имеет пользователь.
Описание клиента
Внешний вид
В зависимости от вида пользователей меняется вид клиентского приложения:
Главный пользователь свободный пользователь
Как хорошо видно у главного пользователя слева имеется множество вкладок, функциональность которых будет описана ниже. А у свободного пользователя имеется только общий чат, в котором он может общаться со всеми пользователями, подключенными к серверу. При подключении нового пользователя в чате отобразится время подключения, имя подключившегося пользователя, а так же его статус.
Функционал клиентского приложения
На второй вкладке отображается список всех подключенных к серверу пользователей. В списке отображается информация о виде пользователя(Admin, Free User), имя пользователя, имя компьютера и IP адрес компьютера. Для обновления списка пользователей необходимо использовать кнопку “Refresh”.
При нажатии правой кнопкой мыши на любом из пользователей, откроется контекстное меню с операциями которые можно применить к данному пользователю: File Manager – Файловый менеджер, Program Manager – Диспетчер задач и Screen – возможность просмотра экрана удаленного компьютера.
File Manager
При выборе пункта File Manager, открывается новая вкладка, на ней находится ComboBox, в который автоматически добавляются все имеющиеся на удаленном компьютере диски или разделы. Так же на вкладке имеются один Label, в котором отображается текущий адрес, пару ListBox в первом отображаются все папки текущего раздела, во втором все файлы. При нажатии правой кнопкой на любом файле появится контекстное меню в котором можно выбрать либо удаление, либо запуск выделенного файла.
Program Manager
При выборе пункта Program Manager, открывается новая вкладка, на ней находится ListBox со списком всех процессов запущенных на удаленном хосте. При нажатии правой кнопкой на любом из процессорово появится контекстное меню в котором можно выбрать завершение выделенного процесса.
Screen
При выборе пункта Screen, форма увеличивается в размерах, открывается новая вкладка, на ней отображается копия экрана удаленно компьютера. Ее можно обновлять в любой момент для этого достаточно нажать на кнопку “Refresh”.
Заключение
В курсовой работе «Система удаленного администрирования» было разработано клиент серверное приложение для удаленного администрирования и управления компьютеров, используя стандартный протокол TCP/IP, с поддержкой авторизации через логин/пароль. Со следующим набором функции: передачей снимков экрана, работа с файловой системой, работа с процессами приложений.
Все поставленные задачи выполнены, было изучено сетевое программирование в среде FrameWork .NET на сокетах и потоках – цель выполнена.
Список литературы
1. Эндрю Кровчик, Винод Кумар «. NET Сетевое программирование для профессионалов» издательство « Wrox Press Ltd »,русс.«Лори» ISBN 5-85582-170-2 2007 год
2. Программирование для Microsoft Windows на С#. В 2-х томах. Пер. с англ. — М.: Издательско-торговый дом «Русская Редакция», 2002- 576 с.: ил. ISBN 5-7502-0210-0
3. Культин Н.Б. « C # в задачах и примерах» БХВ-Петербург, 2007 – 240с. ISBN 978-5-9775-0115-6
4. Агуров П.В. «C#. Разработка компонентов в MS Visual Studio 20052008» БХВ-Петербург,2008 – 480с. ISBN 978-5-9775-0295-5
Приложение
Краткий обзор существующих продуктов
Radmin - это одна из самых популярных программ для наблюдения за удаленным компьютером среди русскоязычных пользователей. Причин тому несколько: во-первых, программа разработана российской компанией и потому имеет полноценный русский интерфейс. Во-вторых, Radmin имеет только самые необходимые средства для управления удаленным ПК и очень проста в настройке. Благодаря этому ее несложно освоить. Наконец, в третьих, программа имеет небольшой размер дистрибутива, который можно легко переслать по почте.
Radmin работает в нескольких режимах: передача файлов, полное управление, только просмотр, телнет и выключение. Есть встроенный файловый менеджер, при помощи которого файлы передаются с одного ПК на другой. Программа ведет статистику используемого трафика и может шифровать данные.
Symantec pcAnywhere, без всякого сомнения, можно назвать мечтой системного администратора. Набор возможностей, которые предлагает эта программа, просто огромен. Это - не просто средство для подглядывания за действиями пользователей на удаленных ПК, а мощный инструмент для управления всеми функциями компьютера. Все действия, которые администраторы, как правило, вынуждены делать, перемещаясь по зданию от одного компьютера к другому, при помощи pcAnywhere можно выполнить удаленно.
UltraVNC основное преимущество этой программы перед другими приложениями, представленными в обзоре, - бесплатный статус. Она ничем не уступает многим коммерческим продуктам, а в некоторых случаях даже их превосходит.
Одна из интересных возможностей программы - тонкая настройка серверной части. Если вы по каким-то причинам хотите скрыть наличие на удаленном компьютере программы-сервера, вы можете вызвать окно настроек программы, щелкнув по значку в области уведомлений, и ограничить права пользователя. Например, можно запретить закрытие программы и изменение ее настроек с сервера, а также скрыть значок в системном трее, чтобы у любопытных возникало меньше вопросов.
RemotelyAnywhere - это не совсем обычная программа для администрирования. В отличие от других подобных утилит, она состоит только из одной части - сервера, а роль клиента выполняет браузер. Иными словами, устанавливать программу нужно только на том, компьютере, к которому нужно подключиться. Это очень удобно, если вы хотите проводить удаленное администрирование с компьютера, на котором не можете устанавливать никаких программ, например, если этот компьютер стоит в учебном заведении, в Интернет-кафе или на работе.
Для работы программа задействует специальный ActiveX-компонент браузера и использует собственный протокол обмена данными. Когда сервер установлен и запущен, к компьютеру можно получить доступ, введя в браузере адрес https://ваш_IP:2000 (если вы собираетесь работать с программой через Интернет) или https://имя_компьютера:2000 (если предполагается подключаться по локальной сети). После этого нужно указать имя пользователя и пароль, которые используются для входа в Windows на удаленном компьютере. Безопасность подключения обеспечивается NTLM-аутентификацией, защищенной 1024-битовым ключом.
После подключения в окне браузера будут выведены подробные сведения об удаленном ПК, в том числе, его конфигурация, степень заполненности жесткого диска, загруженность процессора, сетевая активность и т.д.
Пример кода
Снятие копии экрана
[DllImport(user32.dll)]
public extern static IntPtr GetDesktopWindow(); [System.Runtime.InteropServices.DllImport(user32.dll)]
public static extern IntPtr GetWindowDC(IntPtr hwnd);
[System.Runtime.InteropServices.DllImport(gdi32.dll)]
public static extern UInt64 BitBlt(IntPtr hDestDC, int x, int y, int nWidth, int nHeight, IntPtr hSrcDC, int xSrc, int ySrc, System.Int32 dwRop);
Image myImage = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
Graphics gr1 = Graphics.FromImage(myImage);
IntPtr dc1 = gr1.GetHdc();
IntPtr dc2 = GetWindowDC(GetDesktopWindow());
BitBlt(dc1, 0, 0, Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, dc2, 0, 0, 13369376);
gr1.ReleaseHdc(dc1);
MemoryStream MS = new MemoryStream();
myImage.Save(MS, ImageFormat.Jpeg);
byte[] BytesPain = MS.GetBuffer();
mas = Convert.ToString(BytesPain.Length);
bw.Write(mas);
bw.Write(BytesPain);
Сериализация объектов
MasMet();
BinaryFormatter bFormat = new BinaryFormatter();
MemoryStream mStream = new MemoryStream();
bFormat.Serialize(mStream, SendMass);
byte[] biteSerialize = new byte[mStream.Length];
mStream.Position = 0;
mStream.Read(biteSerialize, 0,(int)mStream.Length);
string Dl = Convert.ToString(biteSerialize.Length);
((Info)MassList[a]).w.Write(Dl);
mStream.Close();
((Info)MassList[a]).w.Write(biteSerialize);
Десериализация объектов
arrList2 = (ArrayList)bFormat2.Deserialize(mStream2);