Разработка программного комплекса сбора информации из вычислительной системы и сохранения ее в общий файл (или базу данных) на сервере
Сравнительный анализ языков программирования Delphi и С++. Определение информации о мониторе, сетевых адаптерах и запущенных процессах. Транспортировка информации на сервер. Сбор информации о времени работы пользователей. Описание основных алгоритмов.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 24.05.2017 |
Размер файла | 159,1 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Содержание
Введение
1. Сравнительный анализ языков программирования
1.1 Анализ языка программирования Delphi
1.1.1 Достоинства языка программирования
1.1.2 Недостатки языка программирования
1.2 Анализ языка программирования С++
1.2.1 Достоинства языка программирования
1.2.2 Недостатки языка программирования
2. Сбор информации о компьютере
2.1 Определение информации о мониторе
2.2 Определение информации о сетевых адаптерах
2.3 Определение информации о запущенных процессах
2.4 Транспортировка информации на сервер
2.5 Сбор информации времени работы Windows
2.6 Сбор информации о времени работы пользователей
2.7 Системный реестр
2.8 Основные функции системного реестра
3. Разработка программы для сбора информации
3.1 Описание главной программы
3.2 Описание основных алгоритмов
3.3 Демонстрация работы программы
Заключение
Список использованных источников
Приложение А
Приложение Б
Введение
язык программирование информация алгоритм
Тема курсового проекта: Разработка программного комплекса сбора информации из вычислительной системы и сохранением ее в общий файл (или базу данных) на сервере.
В работе необходимо рассмотреть следующие вопросы:
определение полной информации о мониторе;
определение полной информации о сетевых адаптерах;
определение полной информации о запущенных приложениях;
сбор всех данных в один текстовый файл и транспортировка его на сервер в указанную папку;
сбор информации о дате и времени запуска и завершения Windows (подсчет времени работы ПК);
сбор информации о дате и времени входа и выхода из системы определенного пользователя (подсчет времени, сколько каждый пользователь провел в системе).
Цель курсовой работы: разработать программу, которая в автоматическом режиме соберёт всю информацию о компьютере в структурном представлении и предоставит возможность сохранить её в файле на указанный сервер через ftp-доступ.
1. Сравнительный анализ языков программирования
1.1 Анализ языка программирования Delphi
1.1.1 Достоинства языка программирования
Простота, скорость и эффективность Delphi объясняют ее популярность. Delphi имеет один из самых быстрых компиляторов, порождающий, тем не менее, весьма и весьма неплохой объектный код. Есть и другие достоинства:
простота изучения Object Pascal;
облегчающие жизнь нововведения - вроде свойств (properties);
программы, написанные на Delphi, не требуется снабжать дополнительными библиотеками (в отличие от связки C++/MFC).
В самом деле, VCL предоставляет удобный, легко расширяемый объектно-ориентированный интерфейс к Windows, что ни в коей мере не мешает программисту опускаться в самые глубины Windows API. Создателям оригинальных компонентов это приходится делать довольно часто. Как было сказано выше, модель программирования в Delphi - компонентная, что позволяет пользоваться компонентами, написанными другими разработчиками, даже не имея их исходного кода и уж подавно не изучая его. В Интернете есть огромное количество компонентов, значительная часть которых распространяется бесплатно. Применение компонентной модели приводит к тому, что довольно многое в поведении объектов программировать не нужно вообще, и многое, на что в других средах ушли бы недели, можно сделать за часы или даже минуты. Оно и понятно - это ведь RAD-среда. К достоинствам можно отнести очень быстрый браузер классов и мгновенный вывод подсказки автозавершения кода (code completion). Если кратко - может все. Конечно, Object Pascal накладывает определенные ограничения, но для тех вещей, для которых ее писали, Delphi подходит практически оптимально. Из понравившихся (но, разумеется, нестандартных) улучшений, внесенных Borland в Object Pascal, хотелось бы выделить свойства (properties) и перегружаемость процедур и функций (overloading). Определенные неудобства при работе с низкоуровневыми функциями API может вызвать то, что стандартным языком для API все же является С, и именно на нем пишутся все новые Software Development Kit (SDK) и заголовочные файлы к ним.
1.1.2 Недостатки языка программирования
Их мало, но они есть. Главный, на мой взгляд, недостаток (и одновременно достоинство) - статическое присоединение библиотеки VCL и компонентов к исполняемому файлу. VCL можно линковать и динамически, но тогда с каждым своим приложением придется распространять еще и VCL, а это более 3 Мбайт. Однако если не увлекаться интерфейсными «наворотами» и использовать в программе минимально необходимое число компонентов, то исполняемый файл будет невелик. Другой недостаток (и опять же достоинство) состоит в том, что в используемой в Delphi парадигме форм (Forms) вся информация о форме, включая свойства, настройки компонентов, значения по умолчанию, хранится в exe-файле, причем не оптимальным образом. Анализ исходного кода VCL показывает, что при создании формы фактически происходит чуть ли не синтаксический разбор данных инициализации, что не может ее не замедлять. Третий недостаток, который кто-нибудь тоже может назвать достоинством, - это Object Pascal. Несмотря на простоту, эффективность и легкость в изучении, ему не хватает очень многих мощных средств C++. Мне, например, не достает шаблонов, перегрузки операторов и объектной модели, похожей на объектную модель C++. Разочаровала Delphi и малым числом параметров оптимизации кода. Кроме того, заметна тенденция к "разрастанию" exe-файлов, генерируемых Delphi. Так, большинство небольших проектов, разработанных в Delphi 4, при перекомпиляции в Delphi 5 «растолстели» на 40-70 Кбайт, при этом, разумеется, не обретя новой функциональности.
1.2 Анализ языка программирования С++
1.2.1 Достоинства языка программирования
C++ -- чрезвычайно мощный язык, содержащий средства создания эффективных программ практически любого назначения, от низкоуровневых утилит и драйверов до сложных программных комплексов самого различного назначения. В частности:
Поддерживаются различные стили и технологии программирования, включая традиционное директивное программирование, ООП, обобщённое программирование, метапрограммирование (шаблоны, макросы);
Предсказуемое выполнение программ является важным достоинством для построения систем реального времени. Весь код, неявно генерируемый компилятором для реализации языковых возможностей (например, при преобразовании переменной к другому типу), определён в стандарте. Также строго определены места программы, в которых этот код выполняется. Это даёт возможность замерять или рассчитывать время реакции программы на внешнее событие;
Автоматический вызов деструкторов объектов при их уничтожении, причём в порядке, обратном вызову конструкторов. Это упрощает (достаточно объявить переменную) и делает более надёжным освобождение ресурсов (память, файлы, семафоры и т. п.), а также позволяет гарантированно выполнять переходы состояний программы, не обязательно связанные с освобождением ресурсов (например, запись в журнал);
Пользовательские функции-операторы позволяют кратко и ёмко записывать выражения над пользовательскими типами в естественной алгебраической форме;
Язык поддерживает понятия физической (const) и логической (mutable) константности. Это делает программу надёжнее, так как позволяет компилятору, например, диагностировать ошибочные попытки изменения значения переменной. Объявление константности даёт программисту, читающему текст программы дополнительное представление о правильном использовании классов и функций, а также может являться подсказкой для оптимизации. Перегрузка функций по признаку константности позволяет определять изнутри объекта цели вызова метода (константный для чтения, неконстантный для изменения). Объявление mutable позволяет сохранять логическую константность при использовании кэшей и ленивых вычислений;
Используя шаблоны, возможно создавать обобщённые контейнеры и алгоритмы для разных типов данных, а также специализировать и вычислять на этапе компиляции;
Возможность имитации расширения языка для поддержки парадигм, которые не поддерживаются компиляторами напрямую. Например, библиотека Boost.Bind позволяет связывать аргументы функций;
Возможность создания встроенных предметно-ориентированных языков программирования. Такой подход использует, например библиотека Boost.Spirit, позволяющая задавать EBNF-грамматику парсеров прямо в коде C++;
Используя шаблоны и множественное наследование можно имитировать классы-примеси и комбинаторную параметризацию библиотек. Такой подход применён в библиотеке Loki, класс SmartPrt которой позволяет, управляя всего несколькими параметрами времени компиляции, сгенерировать около 300 видов «умных указателей» для управления ресурсами;
Кроссплатформенность: стандарт языка накладывает минимальные требования на ЭВМ для запуска скомпилированных программ. Для определения реальных свойств системы выполнения в стандартной библиотеке присутствуют соответствующие возможности (например, std::numeric_limits <T>). Доступны компиляторы для большого количества платформ, на языке C++ разрабатывают программы для самых различных платформ и систем;
Эффективность. Язык спроектирован так, чтобы дать программисту максимальный контроль над всеми аспектами структуры и порядка исполнения программы. Ни одна из языковых возможностей, приводящая к дополнительным накладным расходам, не является обязательной для использования -- при необходимости язык позволяет обеспечить максимальную эффективность программы;
Имеется возможность работы на низком уровне с памятью, адресами;
Высокая совместимость с языком Си, позволяющая использовать весь существующий Си-код (код на Си может быть с минимальными переделками скомпилирован компилятором C++; библиотеки, написанные на Си, обычно могут быть вызваны из C++ непосредственно без каких-либо дополнительных затрат, в том числе и на уровне функций обратного вызова, позволяя библиотекам, написанным на Си, вызывать код, написанный на С++).
1.2.2 Недостатки языка программирования
Отчасти недостатки C++ унаследованы от языка-предка -- Си, -- и вызваны изначально заданным требованием возможно большей совместимости с Си. Это такие недостатки, как:
Синтаксис, провоцирующий ошибки;
Операция присваивания обозначается как =, а операция сравнения как ==. Их легко спутать, при этом операция присваивания возвращает значение, поэтому присваивание на месте выражения является синтаксически корректным, а в конструкциях цикла и ветвления появление числа на месте логического значения также допустимо, так что ошибочная конструкция оказывается синтаксически правильной. Типичный пример подобной ошибки: if(x=0){операторы}. Здесь в условном операторе по ошибке написано присваивание вместо сравнения. В результате, вместо того, чтобы сравнить текущее значение x с нулём, программа присвоит x нулевое значение, а потом интерпретирует его как значение условия в операторе if. Так как нуль соответствует логическому значению «ложь», блок операторов в условной конструкции не выполнится никогда. Ошибки такого рода трудно выявлять, но во многих современных компиляторах предлагается диагностика некоторых подобных конструкций;
Операции присваивания (=), инкрементации (++), декрементации (--) и другие возвращают значение. В сочетании с обилием операций это позволяет, хотя и не обязывает, создавать трудночитаемые выражения. Наличие этих операций в Си было вызвано желанием получить инструмент ручной оптимизации кода, но в настоящее время оптимизирующие компиляторы обычно генерируют оптимальный код и на традиционных выражениях. С другой стороны, один из основных принципов языков Си и C++ -- позволять программисту писать в любом стиле, а не навязывать «хороший» стиль;
Макросы (#define) являются мощным, но опасным средством. Они сохранены в C++ несмотря на то, что необходимость в них, благодаря шаблонам и встроенным функциям, не так уж велика. В унаследованных стандартных Си-библиотеках много потенциально опасных макросов.
Некоторые преобразования типов неинтуитивны. В частности, операция над беззнаковым и знаковым числами выдаёт беззнаковый результат;
C++ позволяет пропускать break в ветви оператора switch с целью последовательного выполнения нескольких ветвей. Такой же подход принят в языке Java. Есть мнение, что это затрудняет понимание кода. Например, в языке C# необходимо всегда писать либо break, либо использовать goto case N для явного указания порядка выполнения;
Препроцессор, унаследованный от Си, очень примитивен. Это приводит с одной стороны к тому, что с его помощью нельзя (или тяжело) осуществлять некоторые задачи метапрограммирования, а с другой, вследствие своей примитивности, он часто приводит к ошибкам и требует много действий по обходу потенциальных проблем. Некоторые языки программирования (например, Scheme и Nemerle) имеют намного более мощные и более безопасные системы метапрограммирования (также называемые макросами, но мало напоминающие макросы Си/C++);
Плохая поддержка модульности (по сути, в классическом Си модульность на уровне языка отсутствует, её обеспечение переложено на компоновщик). Подключение интерфейса внешнего модуля через препроцессорную вставку заголовочного файла (#include) серьёзно замедляет компиляцию при подключении большого количества модулей (потому что результирующий файл, который обрабатывается компилятором, оказывается очень велик). Эта схема без изменений скопирована в C++. Для устранения этого недостатка, многие компиляторы реализуют механизм прекомпиляции заголовочных файлов (англ. Precompiled header).
К собственным недостаткам C++ можно отнести:
Сложность и избыточность, из-за которых C++ трудно изучать, а построение компилятора сопряжено с большим количеством проблем;
Многие конструкции С++ позволяют делать то же самое, что и конструкции Си, также присутствующие в С++. Это иногда сбивает с толку новичков. Например, приведение типов при помощи dynamic_cast позволяет привести указатель или ссылку строго в пределах иерархии классов. Это делает код более надёжным, декларативным и позволяет находить приведения в пределах иерархии при помощи инструментов типа grep. Однако вследствие требования высокой степени совместимости с Си старое приведение типов всё ещё поддерживается;
Иногда шаблоны приводят к порождению кода очень большого объёма. Для снижения размера машинного кода можно специальным образом подготавливать исходный код. Другим решением является стандартизованная ещё в 1998 году возможность экспорта шаблонов. Некоторые авторы считают, что её трудно реализовать и поэтому она доступна не во всех компиляторах. «Раздувание» машинного кода вследствие использования шаблонов часто преувеличивается, и современные компиляторы во многих случаях успешно устраняют это явление;
Метапрограммирование на основе шаблонов C++ сложно и при этом ограничено в возможностях. Оно состоит в реализации средствами шаблонов C++ интерпретатора примитивного функционального языка программирования, выполняющегося во время компиляции. Сама по себе данная возможность весьма привлекательна, но такой код весьма трудно воспринимать и отлаживать. Менее распространённые языки Lisp/Scheme, Nemerle имеют более мощные и одновременно более простые для восприятия подсистемы метапрограммирования. Кроме того, в языке D реализована сравнимая по мощности, но значительно более простая в применении подсистема шаблонного метапрограммирования;
Явная поддержка функционального программирования присутствует только в будущем стандарте c++0x. Данный пробел устраняется различными библиотеками (Loki, Boost), использующими средства метапрограммирования для расширения языка функциональными конструкциями (например, поддержкой лямбд/анонимных методов), но качество подобных решений значительно уступает качеству встроенных в функциональные языки решений. Такие возможности функциональных языков, как сопоставление с образцом, вообще крайне сложно эмулировать средствами метапрограммирования;
Некоторые считают недостатком языка C++ отсутствие встроенной системы сборки мусора. С другой стороны, средства C++ позволяют реализовать сборку мусора на уровне библиотеки. Противники сборки мусора полагают, что RAII является более достойной альтернативой. С++ позволяет пользователю самому выбирать стратегию управления ресурсами.
2. Сбор информации о компьютере
2.1 Определение информации о мониторе
Рассмотрим класс Win32_DesktopMonitor [3].
Класс Win32_DesktopMonitor предоставляет сведения о мониторе, подключённом к компьютерной системе.
Пример получения информации:
On Error Resume Next
Set objService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2")
If Err.Number <> 0 Then
WScript.Echo Err.Number & ": " & Err.Description
WScript.Quit
End If
For Each objMon In objService.ExecQuery("SELECT * FROM Win32_DesktopMonitor")
WScript.Echo objMon.SystemName 'имя компьютера
WScript.Echo objMon.Caption 'наименование устройства
WScript.Echo objMon.Description 'описание устройства
WScript.Echo objMon.DeviceID 'идентификатор устройства
WScript.Echo objMon.PNPDeviceID 'идентификатор устройства Plug-and-Play
WScript.Echo objMon.MonitorManufacturer 'производитель
WScript.Echo objMon.PixelsPerXLogicalInch 'разрешающая способность монитора по горизонтали
WScript.Echo objMon.PixelsPerYLogicalInch 'разрешающая способность монитора по вертикали
WScript.Echo objMon.ScreenHeight 'логическая высота дисплея
WScript.Echo objMon.ScreenWidth 'логическая ширина дисплея
Next
2.2 Определение информации о сетевых адаптерах
Рассмотрим классы Win32_NetworkAdapter и Win32_NetworkAdapterConfiguration по [3].
Классы Win32_NetworkAdapter и Win32_NetworkAdapterConfiguration содержат сведения о сетевых адаптерах.
Класс Win32_NetworkAdapterConfiguration предоставляет ряд свойств сетевого адаптера, а также включает дополнительные методы, которые поддерживают управление протоколами TCP/IP и IPX, службами DNS, DHCP, WINS и т.д. Перечень свойств и методов этого класса достаточно обширен; для получения информации обращайтесь к MSDN.
Пример определения информации:
On Error Resume Next
Set objService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2")
If Err.Number <> 0 Then
WScript.Echo Err.Number & ": " & Err.Description
WScript.Quit
End If
For Each objNtw In objService.ExecQuery("SELECT * FROM Win32_NetworkAdapter")
WScript.Echo objNtw.SystemName 'имя компьютера
WScript.Echo objNtw.Caption 'наименование устройства
WScript.Echo objNtw.Name 'наименование устройства
WScript.Echo objNtw.ServiceName 'краткое наименование устройства
WScript.Echo objNtw.Description 'описание устройства
WScript.Echo objNtw.Manufacturer 'производитель
WScript.Echo objNtw.AdapterType 'тип устройства
WScript.Echo objNtw.DeviceID 'идентификатор устройства
WScript.Echo objNtw.PNPDeviceID 'идентификатор устройства Plug-and-Play
WScript.Echo objNtw.Index 'индекс сетевого адаптера в системном реестре
WScript.Echo objNtw.MACAddress 'MAC - адрес
WScript.Echo
Next
2.3 Определение информации о запущенных процессах
Для получения и описания списка процессов используется класс Win32_Process.
Пример программы:
OptionExplicit
Dim objWMIService, objProcess, colProcess
Dim strComputer, strList
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" _
& strComputer & "\root\cimv2")
Set colProcess = objWMIService.ExecQuery _
("Select * from Win32_Process")
For Each objProcess in colProcess
strList = strList & vbCr & _
objProcess.Name
Next
WSCript.Echo strList
WScript.Quit
2.4 Транспортировка информации на сервер
Транспортировку информации можно осуществить при помощи компоненты класса idFTP, в которой определены свойства: host, port, username, password и функции управления: connect, changedir, put, disconnect.
В качестве сервера необходимо указать IP-адрес.
Пример программы с использованием idFTP:
idFTP1.Host:=Trim(EditIP.Text); // ip-адрес сервера
idFTP1.Port:=StrToInt(EditPort.Text); // порт ftp сервера
idFTP1.Username:=EditLog.Text; // логин
idFTP1.Password:=EditPas.Text; // пароль
idFTP1.Connect;
idFTP1.ChangeDir(Trim(EditDir.Text));
idFTP1.Put(FPath,FName);
idFTP1.Disconnect;
2.5 Сбор информации времени работы Windows
Для получения информации о дате и времени запуска и завершения системы необходимо использовать функцию NtQuerySystemInformation из библиотеки ntdll.dll, которую необходимо подгрузить к проекту. Для этого необходимо включить в код программы код-ссылку на функцию:
function NtQuerySystemInformation (SystemInformationClass:byte;
SystemInformation: Pointer;
SystemInformationLength: ULONG;
ReturnLength: PULONG): NTSTATUS; stdcall; external 'NTDLL.DLL';
Время завершения работы системы можно получить из реестра в разделе: HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Control \ Windows по ключу ShutdownTime.
2.6 Сбор информации о времени работы пользователей
Для получения информации о списке пользователей необходима структура:
TUSER_INFO_10 = record
usri10_name,
usri10_comment,
usri10_usr_comment,
usri10_full_name: PWideChar;
end;
Для получения информации о пользователе необходима структура:
_USER_INFO_2 = record
usri2_name,
usri2_password: LPWSTR;
usri2_password_age, usri2_priv: DWORD;
usri2_home_dir,
usri2_comment : LPWSTR;
usri2_flags:DWORD;
usri2_script_path: LPWSTR;
usri2_auth_flags:DWORD;
usri2_full_name,
usri2_usr_comment,
usri2_parms,
usri2_workstations: LPWSTR;
usri2_last_logon,
usri2_last_logoff,
usri2_acct_expires,
usri2_max_storage,
usri2_units_per_week: DWORD;
usri2_logon_hours: PBYTE;
usri2_bad_pw_count,
usri2_num_logons: DWORD;
usri2_logon_server: LPWSTR;
usri2_country_code,
usri2_code_page: DWORD;
End;
Где:
usri2_name - имя пользователя;
usri2_password - пароль;
usri2_password_age - "возраст" пароля - кол-во секунд, прошедших с момента последней смены пароля;
usri2_priv - уровень привилегий - 1 - обычный пользователь, 0 - гость, 2 - админ (определяется группами, в которых находится пользователь) (R)
usri2_home_dir - основной каталог пользователя - обычно используется для подключения сетевого каталога пользователя (например, \\server\users\thisuser)
usri2_comment - описание
usri2_flags - флаги состояния аккаунта -
UF_ACCOUNTDISABLE = $0002 - отключена
UF_PASSWD_CANT_CHANGE = $0040 - пароль не может быть сменен пользователем
UF_DONT_EXPIRE_PASSWD = $10000 - срок действия пароля не ограничен
usri2_script_path - скрипт, выполняемый при входе в систему
usri2_auth_flags - административные флаги - какие привилегии имеет пользователь (R)
AF_OP_PRINT = $1; // Print Operator
AF_OP_COMM = $2; // Communications Operator
AF_OP_SERVER = $4; // Server Operator
AF_OP_ACCOUNTS= $8; // Account Operator
usri2_full_name - полное имя пользователя
usri2_usr_comment - пользовательский комментарий
usri2_workstations - до восьми компьютеров, на которых может работать пользователь
usri2_last_logon и usri2_last_logoff - время последнего входа и выхода пользователя (R)
usri2_acct_expires - время (кол-во секунд с 1.01.1970 года) истечения срока действия пароля
usri2_max_storage - макс. размер дискового пространства, который может использовать юзер
usri2_units_per_week и usri2_logon_hours определяют разрешенное
время входа
usri2_bad_pw_count - кол-во вводов неправильного пароля (R)
usri2_num_logons - кол-во входов в систему (R)
usri2_logon_server - имя сервера, обрабатывающего вход в систему.
usri2_country_code и usri2_code_page - коды региона и кодовой страницы языка.
(R) и (W) - поля только для чтения и только для "записи".
2.7 Системный реестр
Системный реестр ? база данных, которая хранит параметры настройки для 32 разрядных версий MicrosoftWindows включая; Windows 95, 98 и NT. Он содержит информацию и параметры настройки для всех аппаратных средств, программ, пользователей, и свойств PC.
Каждый раз, когда пользователь делает изменения в параметрах настройки Панели управления, или в ассоциациях файлов, системной настройке, или в установленном программном обеспечении, изменения отражаются и сохраняются в системном реестре.
Редактор системного реестра (REGEDIT.EXE) включен в большинство версий Windows. Он дает возможность просматривать, искать и редактировать данные в пределах системного реестра. Имеется несколько методов для запуска редактора, самый простой ? нажать на кнопку «Пуск», затем выбрать «Выполнить», и в поле «Открыть» напечатать «regedit», и если редактор системного реестра установлен, он должен открыться.
Оно реестра представлено на рисунке 1.1.
Рисунок 1.1 Окно реестра Windows
Реестр содержит сведения, к которым операционная система семейства Windows постоянно обращается во время работы, а именно:
профили всех пользователей;
данные об установленных программах и типах документов, создаваемых каждой программой;
значения свойств папок и значков программ;
конфигурация оборудования, установленного в операционной системе;
данные об используемых портах.
Реестр имеет иерархическую древовидную структуру, состоящую из разделов, подразделов (это то, что мы видим слева, открыв редактор реестра), и ключей (то, что мы видим справа, выделив раздел или подраздел реестра).
Официальное издание компании Microsoft - Microsoft Computer Dictionary - определяет системный реестр Windows (Windows Registry, регистр Windows) как иерархическую централизованную базу данных, используемую в операционных системах Microsoft, начиная с версии Microsoft Windows 98, и предназначенную для хранения сведений, необходимых для настройки операционной системы, для работы с пользователями, программами и устройствами.
Таким образом, системный реестр Windows - прежде всего основа операционной системы, огромная база данных настроек, хранящихся в папках %SystemRoot%\System32\Config и папке пользовательских профилей (Ntuser.dat). Без него операционная система была бы просто набором программ, неспособных выполнить даже простейшие функции ОС. Все, включая любые детали конфигурационных данных, размещено в системном реестре. Все хранящиеся в реестре данные представлены в стандартизированной форме и четко структурированы согласно предложенной разработчиками Windows иерархии. Информация в системном реестре хранится в бинарном, то есть в двоичном представлении, что позволяет не только помещать туда значительно больший объем различных данных, но и существенно увеличить скорость работы с ним.
В системном реестре хранятся данные, которые необходимы для правильного функционирования Windows. К ним относятся профили всех пользователей, сведения об установленном программном обеспечении и типах документов, которые могут быть созданы каждой программой, информация о свойствах папок и значках приложений, а также установленном оборудовании и используемых портах. К этим данным операционная система постоянно обращается во время загрузки, работы и ее завершения. Многие программы хранят не только данные о своих настройках в реестре, но и данные об их регистрации, особенно это касается пробных («триальных») версий, которые истечение пробного срока проверяют через системный реестр Windows.
В случае установки или удаления устройств, приложений, данных о пользователях или системных компонентов, информация о подобных изменениях записывается в реестр и считывается оттуда в ходе каждой загрузки операционной системы. Неудивительно, что со временем размер системного реестра постоянно увеличивается, что отрицательно сказывается и на времени доступа к нему. При удалении многие программы оставляют за собой недействительные более ключи, неверные ссылки, а это приводит к тому, что в реестре Windows появляется огромное количество мусора, также отрицательно сказывающегося на времени доступа.
Изучение работы операционной системы дало информацию, что во время запуска системы происходит до тысяч обращений к системному реестру, а во время работы на ПК в течение одного сеанса работы - до 10 тысяч. Из этого можно сделать вывод: от того, какие именно параметры указаны в реестре, во многом зависят возможности операционной системы, ее быстродействие и алгоритм работы всего компьютера в целом.
Сказанное выше приводит и к следующему выводу: некорректное изменение хранящейся в системном реестре информации вполне способно нарушить работоспособность Windows. Достаточно допустить ошибку в записи значения какого-либо ключа или параметра, и пользователь больше не сможет загрузить компьютер. Именно по этой причине разработчики ОС заметно ограничили доступ к реестру Windows, и редактировать его параметры, касающиеся безопасности, могут только пользователи ОС, имеющие в системе учетную запись администратора.
Теперь о том, в каком виде хранится реестр в операционной системе. Его версии для разных операционных систем семейства Windows имеют определенные различия. Например, в Windows 98 файлы системного реестра называются User.dat и System.dat. В Windows Millennium Edition - Classes.dat, User.dat и System.dat.
Реестр Windows XP и более старших версий устроен несколько сложнее. Хотя в программах просмотра реестра он представляется нам в виде единой базы данных, но на физическом уровне реестр неоднороден и состоит из множества файлов, каждый из которых отвечает за собственный объем представленной в этой базе информации.
Некоторые из отображаемых в системном реестре сведений никогда не сохраняются на диске в виде физических файлов, а помещаются в память компьютера в процессе его загрузки и утрачиваются в момент отключения питания. Такие разделы реестра получили название энергозависимых (volatile). В частности, к энергозависимым разделам реестра Windows относятся данные, в которых аккумулируются сведения о подключенном в системе оборудовании и назначенных различным устройствам ресурсах: запросах на прерывание (IRQ), каналах прямого доступа к памяти (DMA) и диапазонах ввода/вывода (I/O Range). Поскольку опрос, инициализация устройств и динамическое распределение ресурсов производятся именно в ходе загрузки Windows, все эти сведения хранятся непосредственно в памяти компьютера: при следующем запуске машины состав оборудования может оказаться уже другим.
Прочие компоненты реестра Windows, хранящие данные о конфигурации операционной системы, ее настройках и параметрах, содержатся в системной папке%systemroot%\System32\Config. Файлы, включающие сведения о профилях пользователей Windows XP, хранятся в папке %systemroot%\Profiles. И наконец, все данные, относящиеся к каким-либо конкретным настройкам системы для каждого пользователя, а также данные об их персональной конфигурации рабочей среды представлены в папках %Drive%\Documents and Settings\%UserName%, где %Drive% - имя дискового раздела, на котором установлена Windows XP, а %UserName% - папка, имя которой соответствует имени одного из зарегистрированных в системе пользователей. Дополнительные сведения о локальных пользователях Windows по умолчанию содержатся в папке%Drive%\Documents and Settings\LocalService, а данные о настройках системы для удаленных пользователей - в папке %Drive% \ Documents and Settings \ NetworkService.
С появлением 64-х разрядных операционных систем появились различия и в их системных реестрах - реестры 64-разрядных версий Windows XP, Windows Server 2003 и Windows Vista подразделяется на 32- и 64-разрядные разделы. При этом большинство 32-разрядных разделов имеют те же имена, что и их аналоги в 64-разрядном разделе, и наоборот.
2.8Основные функции системного реестра
Основные функции управления системным реестром сведены в таблицу 1.1.
Таблица 1.1
Основные функции управления системным реестром
Функции |
Назначение |
|
RegCloseKey |
Закрывает дескриптор данного открытого ключа. При этом освобождаются любые связанные с данным ключом системные ресурсы. Закрытие ключа отнюдь не вызывает задержку операций записи, происходящих непосредственно после выполнения данной функции. |
|
RegCreateKeyEx |
Создает или открывает подключ указанного ключа. |
|
RegDeleteKey |
Удаляет подключ заданного ключа |
|
RegDeleteValue |
Удаляет значение из подключа |
|
RegEnumKeyEx |
Перечисляет подключи указанного открытого ключа системного реестра. |
|
RegEnumValue |
Перечисляет значения указанного ключа, открытого в системном реестре |
|
RegOpenKeyEx |
Открывает подключ системного реестра с требуемым типом доступа. |
|
RegQueryInfoKey |
Возвращает информацию, которая описывает данный ключ системного реестра. |
|
RegQueryValueEx |
Возвращает тип и данные для указанного имени значения, связанного с открытым ключом системного реестра. |
|
RegSetValueEx |
Устанавливает именованное значение любого подключа системного реестра |
3. Разработка программы для сбора информации
3.1 Описание главной программы
Программа реализована в виде набора функций, каждая из которых отвечает за сбор той или иной информации. Листинг программы приведен в Приложении А.
Код главной программы:
Memo1.Lines.Clear;
GetProcessorInfo;
GetBIOSInfo;
GetLogicalHDD;
GetKeyboard;
GetMotherBoard;
GetMouse;
GetMonitor;
GetNet;
GetProc;
GetTimeSys;
GetLocalUserList;
Процедура GetProcessorInfo отвечает за сбор информации о центральном процессоре и вывод её в компоненту Memo1 на главном окне.
Процедура GetBIOSInfo отвечает за сбор информации о BIOS и вывод её в компоненту Memo1 на главном окне.
Процедура GetLogicalHDD отвечает за сбор информации о HDD, его логических дисках и вывод её в компоненту Memo1 на главном окне.
Процедура GetKeyboard отвечает за сбор информации о клавиатуре и вывод её в компоненту Memo1 на главном окне.
Процедура GetMotherBoard отвечает за сбор информации о материнской плате и вывод её в компоненту Memo1 на главном окне.
Процедура GetMouse отвечает за сбор информации о манипуляторе «мышь» и вывод её в компоненту Memo1 на главном окне.
Процедура GetMonitor отвечает за сбор информации о мониторе и вывод её в компоненту Memo1 на главном окне.
Процедура GetNet отвечает за сбор информации о сетевых адаптерах и вывод её в компоненту Memo1 на главном окне.
Процедура GetProc отвечает за сбор информации о запущенных приложениях и вывод её в компоненту Memo1 на главном окне.
Процедура GetTimeSys отвечает за сбор информации о времени работы системы и вывод её в компоненту Memo1 на главном окне.
Процедура GetLocalUserList отвечает за сбор информации о пользователях, времени их работы и вывод её в компоненту Memo1 на главном окне.
3.2 Описание основных алгоритмов
Алгоритм сбора информации из реестра:
Алгоритм сбора информации из реестра:
создаем объект реестра (класс TRegistry);
для класса указываем корень дерева реестра, т.е. фиксируем параметр класса RootKey значением HKEY_LOCAL_MACHINE;
открываем необходимый ключ, к примеру: \\SOFTWARE \\Microsoft \\Windows \\CurrentVersion \\Run\\ при помощи функции класса OpenKeyReadOnly;
получаем список значений из открытого ключа при помощи функции GetValueNames;
для каждого значения получаем его параметр при помощи функции ReadString.
Алгоритм сбора информации с помощью WMI:
создаём объект SWbemLocator, класс которого определен в модуле WbemScripting_TLB.pass;
выполняем подключение к SWbemLocator с помощью объекта Service интерфейса ISWbemServices;
с помощью объекта SObject интерфейса ISWbemObject выполняем подключение к классу [Win32_имя класса];
с помощью объекта ObjectSet интерфейса ISWbemObjectSet получаем список столбцов и полей;
заполняем данными столбцами и полями объект Enum интерфейса IEnumVariant;
с помощью цикла перебираем все столбцы с записями объекта Enum и выводим в компонент TMemo в виде записи [имя столбца]: [значение поля, соответствующее столбцу];
уничтожаем объект SWbemLocator.
Алгоритм отправки информации на FTP-сервер:
формируем имя создаваемого файла;
сохраняем на диске этот файл;
заполняем поля компонента idFTP1 информацией, необходимой для подключения к FTP-серверу, и выполняем подключение к этому серверу;
с помощью метода Put отправляем файл на сервер;
отключаемся от FTP-сервера.
Для получения списка процессов необходимо определиться с версией операционной системы Windows. Для этого используются следующие алгоритмы:
с помощью метода dwOSVersionInfoSize объекта ovi класса TOSVersionInfo и функции GetVersionEx получим номер платформы ОС Windows;
исходя из значения ovi.dwPlatformId создаём список текущих процессов с помощью методов Win32API Process32First и Process32Next и объекта ProcInfo класса TprocessEntry32 в случае, если платформа ОС Windows будет 9.х. В случае, если платформа OC Windows будет NT, с помощью методов EnumProcessModules и GetModuleFileNameEx и объекта hProcess класса THandle получаем информацию о текущих процессах.
3.3 Демонстрация работы программы
Исходное состояние программы показано на рисунке 2.1.
Рисунок 2.1 Исходное состояние программы
Результат сбора информации о компьютере по нажатию кнопки «Сбор информации о ПК» показан на рисунке 2.2. Листинг полной информации приведён в Приложении Б.
Рисунок 2.2 Сбор и вывод информации в окно программы
Заключение
В результате выполнения курсового проекта произведён сравнительный анализ программных средств Delphi и С++. И с помощью программной среды Borland delphi разработана программа по сбору информации о компьютере и его устройствах.
Программа содержит различные подходы и методы на различных уровнях сбора данных системы.
Информация получена:
непосредственно из реестра системы;
при помощи специальных функций среды разработки;
при помощи функций WinAPI;
при помощи функций импортируемых специальных классов;
при помощи функций дополнительных подключенных внешних библиотек.
Программа реализована согласно задания к курсовому проекту. Протестирована на двух машинах с 64-х и с 32-х битными системами Windows 10 и Windows 7 соответственно.
В ходе выполнения данного курсового проекта я получил опыт программирования в среде borland delphi. Закрепил свои знания по дисциплине «системное программное обеспечение».
Список использованных источников
Delphi. Собираем информацию о компе [Электронный ресурс] / Режим доступа: http://www.vr-online.ru/content/delphi-sobiraem-informaciju-o-kompe-2999. Дата доступа: 01.11.2015.
Работа с некоторыми Win API функциями (информация о системе) [Электронный ресурс] / Режим доступа: http://www.realcoding.net/articles/rabota-s-nekotorymi-win-api-funktsiyami-informatsiya-o-sisteme.html Дата доступа: 03.11.2015.
Рецепты WMI: сбор сведений об аппаратной конфигурации компьютера [Электронный ресурс] / Режим доступа: http://www.script-coding.com/WMI_HardWare.html. Дата доступа: 04.11.2015.
Колисниченко, Д.Н. Секреты, настройка и оптимизация реестра Windows 7. Спб: БХВ-Петербург, 2010.
Куприянова, А.В. Реестр Windows XP. Настройки, трюки, секреты, 2006.
Хонейкатт, Д. Реестр Microsoft Windows XP. Руководство профессионала, 2003.
Фараонов, В. Система программирования Delphi 7, 2005 г.
Александров, А. Microsoft Windows 2000 Professional, 2003.
Кокорев, О. Microsoft Windows XP. Home Edition, 2006 г.
Горман, В.Н. Delphi 7, 2005.
Приложение А
Код программы
unit UnitMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, Registry, IdBaseComponent, IdComponent,
IdUDPBase, IdUDPServer, IdTrivialFTPServer, IdTCPServer, IdFTPServer,
IdTCPConnection, IdTCPClient, IdFTP, ComCtrls, Mask;
{$EXTERNALSYM NetUserEnum}
function NetUserEnum(servername: LPWSTR;
level,
filter: DWORD;
bufptr: Pointer;
prefmaxlen: DWORD;
entriesread,
totalentries,
resume_handle: LPDWORD): DWORD; stdcall;
external 'NetApi32.dll' Name 'NetUserEnum';
function NetApiBufferFree(Buffer: Pointer {LPVOID}): DWORD; stdcall;
external 'NetApi32.dll' Name 'NetApiBufferFree';
function NetUserGetInfo(ServerName, UserName: PWideChar; Level: DWORD; var Buffer: Pointer): DWORD; stdcall; external 'netapi32.dll' name 'NetUserGetInfo';
//function NetApiBufferFree(Buffer: pointer): DWORD; stdcall; external 'netapi32.dll' name 'NetApiBufferFree';
function NetWkstaUserGetInfo(ServerName: PWideChar; Level: DWORD; var Buffer: Pointer): Longint; stdcall; external 'netapi32.dll' name 'NetWkstaUserGetInfo';
type
MAnsiChar = Array [0..1000] of AnsiChar;
TForm1 = class(TForm)
BInfo: TBitBtn;
Memo1: TMemo;
IdFTP1: TIdFTP;
stat: TStatusBar;
GroupBox1: TGroupBox;
BSend: TBitBtn;
Label1: TLabel;
EditIP: TMaskEdit;
Label2: TLabel;
EditLog: TEdit;
EditPas: TEdit;
Label3: TLabel;
EditPort: TEdit;
Label4: TLabel;
Label5: TLabel;
EditDir: TEdit;
BitBtn1: TBitBtn;
procedure BInfoClick(Sender: TObject);
// о ЦП
Procedure GetProcessorInfo;
procedure GetProcessorInfoOne(Var MyReg: TRegistry; num:String);
// о BIOS
procedure GetBIOSInfo;
// о разделах HDD
procedure GetLogicalHDD;
// о клавиатуре
procedure GetKeyboard;
// о материнской плате
procedure GetMotherBoard;
// о мышке
procedure GetMouse;
// о мониторе
procedure GetMonitor;
// о сетевых адаптерах
procedure GetNet;
// о запущенных процессах
procedure GetProc;
// О времени работы системы
Procedure GetTimeSys;
// о пользователях
Procedure GetLocalUserList;
procedure BSendClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
Uses ActiveX, WbemScripting_TLB, Psapi, tlhelp32, DateUtils,
ComObj;
// -------------------------------------------------
// Сбор и вывод информации о процессоре
// -------------------------------------------------
procedure TForm1.GetProcessorInfoOne(Var MyReg: TRegistry; num:String);
Begin
Memo1.Lines.Append('Процессор '+num+': ');
Memo1.Lines.Append(''+#9+'производитель: '+#9+MyReg.ReadString('VendorIdentifier'));
Memo1.Lines.Append(''+#9+'семейство: '+#9+MyReg.ReadString('Identifier'));
End;
Procedure TForm1.GetProcessorInfo;
var
MyReg: TRegistry;
RegPath: string;
i:Integer;
q1,Boards,q3,tt:variant;
Service: ISWbemServices;
ObjectSet: ISWbemObjectSet;
SObject: ISWbemObject;
PropSet: ISWbemPropertySet;
SProp: ISWbemProperty;
PropEnum, Enum: IEnumVariant;
TempObj, PropVal: OleVariant;
Value: Cardinal;
LI: TListItem;
vt: TVarType;
SWbemLocator:TSWbemLocator;
s:String;
kol,id:Integer;
begin
Memo1.Lines.Append('');
Memo1.Lines.Append('-----ЦП------');
MyReg:=TRegistry.Create;
MyReg.Rootkey:=HKEY_LOCAL_MACHINE;
RegPath:='\HARDWARE\DESCRIPTION\System\CentralProcessor';
if MyReg.Openkey(RegPath, false) and (not MyReg.HasSubKeys)
Then GetProcessorInfoOne (MyReg,'')
Else
Begin
i:=0;
Repeat
RegPath:='\HARDWARE\DESCRIPTION\System\CentralProcessor\'+IntToStr(i);
if not MyReg.Openkey(RegPath, false) then break;
GetProcessorInfoOne (MyReg,IntToStr(i));
i:=i+1;
if i>5 then break;
Until False;
End;
Memo1.Lines.Append('');
SWbemLocator:= TSWbemLocator.Create(Nil);
try
SWbemLocator:= TSWbemLocator.Create(Self);
Service:= SWbemLocator.ConnectServer('.', 'root\CIMV2', '', '', '', '', 0, nil);
SObject:= Service.Get('Win32_Processor', wbemFlagUseAmendedQualifiers, nil);
ObjectSet:= SObject.Instances_(0, nil);
Enum:= (ObjectSet._NewEnum) as IEnumVariant;
Enum.Next(1, TempObj, Value);
SObject:= IUnknown(TempObj) as SWBemObject;
PropSet:= SObject.Properties_;
PropEnum:= (PropSet._NewEnum) as IEnumVariant;
while (PropEnum.Next(1, TempObj, Value) = S_OK) do
begin
SProp:= IUnknown(TempObj) as SWBemProperty;
//LI:= LVProp.Items.Add;
s:=SProp.Name+': ';
if not SProp.IsArray then begin
PropVal:= SProp.Get_Value;
s:=s+VarToStr(PropVal);
end
else begin
SProp.GetTypeInfoCount(kol);
for i:=1 to kol do
Begin
SProp.GetTypeInfo(i,id,tt);
s:=s+VartoStr(id)+': '+VarToStr(tt);
end;
end;
memo1.Lines.Append(s);
end;
finally
SWbemLocator.Free;
end;
end;
// -------------------------------------------------
// Сбор и вывод информации о BIOS
// -------------------------------------------------
//следующий метод получает многострочные значения из реестра
//и преобразует их в TStringlist
function ReadMultirowKey(reg: TRegistry; Key: string): TStrings;
const bufsize = 100;
var
i: integer;
s1: string;
sl: TStringList;
bin: array[1..bufsize] of char;
begin
try
result:= nil;
sl:= nil;
sl:= TStringList.Create;
if not Assigned(reg) then
raise Exception.Create('TRegistry object not assigned.');
FillChar(bin,bufsize,#0);
reg.ReadBinaryData(Key,bin,bufsize);
i:= 1;
s1:= '';
while i < bufsize do
begin
if ord(bin[i]) >= 32 then
s1:= s1 + bin[i]
else
begin
if Length(s1) > 0 then
begin
sl.Add(s1);
s1:= '';
end;
end;
inc(i);
end;
result:= sl;
except
sl.Free;
raise;
end;
end;
procedure TForm1.GetBIOSInfo;
var
RegPath: string;
MyReg: TRegistry;
MyList: TStrings;
i:Integer;
q1,Boards,q3,tt:variant;
Service: ISWbemServices;
ObjectSet: ISWbemObjectSet;
SObject: ISWbemObject;
PropSet: ISWbemPropertySet;
SProp: ISWbemProperty;
PropEnum, Enum: IEnumVariant;
TempObj, PropVal: OleVariant;
Value: Cardinal;
LI: TListItem;
vt: TVarType;
SWbemLocator:TSWbemLocator;
s:String;
kol,id:Integer;
begin
MyReg:=TRegistry.Create;
MyReg.Rootkey:=HKEY_LOCAL_MACHINE;
RegPath:='\HARDWARE\DESCRIPTION\System';
MyList:=nil;
try
MyReg.Openkey(RegPath, false);
Memo1.Lines.Append('');
Memo1.Lines.Append('-----BIOS------');
Memo1.Lines.Append('Системная дата BIOS: '+MyReg.ReadString('SystemBiosDate'));
MyList:=ReadMultirowKey(MyReg,'SystemBiosVersion');
Memo1.Lines.Append('Версия BIOS: '+MyList.Text);
except
Memo1.Lines.Append('Ошибка доступа к системному реестру! Не могу прочитать данные');
end;
MyReg.Free;
if Assigned(MyList) then MyList.Free;
Memo1.Lines.Append('');
SWbemLocator:= TSWbemLocator.Create(Nil);
try
SWbemLocator:= TSWbemLocator.Create(Self);
Service:= SWbemLocator.ConnectServer('.', 'root\CIMV2', '', '', '', '', 0, nil);
SObject:= Service.Get('Win32_BIOS', wbemFlagUseAmendedQualifiers, nil);
ObjectSet:= SObject.Instances_(0, nil);
Enum:= (ObjectSet._NewEnum) as IEnumVariant;
Enum.Next(1, TempObj, Value);
SObject:= IUnknown(TempObj) as SWBemObject;
PropSet:= SObject.Properties_;
PropEnum:= (PropSet._NewEnum) as IEnumVariant;
while (PropEnum.Next(1, TempObj, Value) = S_OK) do
begin
SProp:= IUnknown(TempObj) as SWBemProperty;
//LI:= LVProp.Items.Add;
s:=SProp.Name+': ';
if not SProp.IsArray then begin
PropVal:= SProp.Get_Value;
s:=s+VarToStr(PropVal);
end
else begin
SProp.GetTypeInfoCount(kol);
for i:=1 to kol do
Begin
SProp.GetTypeInfo(i,id,tt);
s:=s+VartoStr(id)+': '+VarToStr(tt);
end;
end;
memo1.Lines.Append(s);
end;
finally
SWbemLocator.Free;
end;
end
// -------------------------------------------------
// Сбор и вывод информации о HDD
// -------------------------------------------------
Procedure ToPAnsiChar (S:AnsiString; Var M:MAnsiChar);
Var i:Integer;
Begin
if not (s='') Then Begin
For i:=1 to Length (s) do M [i-1]:=s[i];
i:=Length (s);
if i>0 Then M[i]:=#0;
End
else Begin
M[0]:=#0;
End;
End;
Function GetPAnsiChar (S:AnsiString): MAnsiChar;
Var M:MAnsiChar;
Begin
ToPAnsiChar (S,M);
Result:=M;
End;
procedure TForm1.GetLogicalHDD;
Var
n:Integer;
dd:string;
dr:DWORD;
i:Integer;
GetVolumeInformationFlag:BOOL;
VolumeNameBuffer:MAnsiChar;
FileSystemNameBuffer:MAnsiChar;
VolumeSerialNumber: DWORD;
MaximumComponentLength:Cardinal;
mas:MAnsiChar;
FileSystemFlags:Cardinal;
d:INteger;
q1,Boards,q3,tt:variant;
Service: ISWbemServices;
ObjectSet: ISWbemObjectSet;
SObject: ISWbemObject;
PropSet: ISWbemPropertySet;
SProp: ISWbemProperty;
PropEnum, Enum: IEnumVariant;
TempObj, PropVal: OleVariant;
Value: Cardinal;
LI: TListItem;
vt: TVarType;
SWbemLocator:TSWbemLocator;
s:String;
kol,id:Integer;
Begin
Memo1.Lines.Append('');
Memo1.Lines.Append('-----HDD------');
dr:= GetLogicalDrives();
for i:=0 to 25 do
Begin
n:=dr mod 2;
if n=1 Then
Begin
dd:='';
dd:=dd+chr(65+i);
dd:=dd+':';
dd:=dd+'\\';
Memo1.Lines.Append('Доступно: '+dd);
ToPAnsiCHar(dd,mas);
d:= GetDriveType(mas);
if( d = DRIVE_UNKNOWN ) Then Memo1.Lines.Append('Тип устройства: не известно');
if( d = DRIVE_NO_ROOT_DIR ) Then Memo1.Lines.Append('Тип устройства: DRIVE NO ROOT DIR');
if( d = DRIVE_REMOVABLE ) Then Memo1.Lines.Append('Тип устройства:сменный');
if( d = DRIVE_FIXED ) Then Memo1.Lines.Append('Тип устройства: жесткий диск');
if( d = DRIVE_REMOTE ) Then Memo1.Lines.Append('Тип устройства: удаленный');
if( d = DRIVE_CDROM ) Then Memo1.Lines.Append('Тип устройства: CD-ROM');
if( d = DRIVE_RAMDISK ) Then Memo1.Lines.Append('Тип устройства: флэшка');
GetVolumeInformationFlag:=GetVolumeInformationA(
mas,
VolumeNameBuffer,
100,
Addr(VolumeSerialNumber),
MaximumComponentLength,
FileSystemFlags,
FileSystemNameBuffer,
100
);
if GetVolumeInformationFlag Then Begin
Memo1.Lines.Append('Метка тома: ' + VolumeNameBuffer);
Memo1.Lines.Append('Серийный номер: '+ IntToStr(VolumeSerialNumber));
Memo1.Lines.Append('Файловая система: ' + FileSystemNameBuffer);
Memo1.Lines.Append('');
End
else Memo1.Lines.Append('не известно');
End;
dr:=dr div 2;
End;
Memo1.Lines.Append('');
SWbemLocator:= TSWbemLocator.Create(Nil);
try
SWbemLocator:= TSWbemLocator.Create(Self);
Service:= SWbemLocator.ConnectServer('.', 'root\CIMV2', '', '', '', '', 0, nil);
SObject:= Service.Get('Win32_DiskDrive', wbemFlagUseAmendedQualifiers, nil);
ObjectSet:= SObject.Instances_(0, nil);
Enum:= (ObjectSet._NewEnum) as IEnumVariant;
Enum.Next(1, TempObj, Value);
SObject:= IUnknown(TempObj) as SWBemObject;
PropSet:= SObject.Properties_;
PropEnum:= (PropSet._NewEnum) as IEnumVariant;
while (PropEnum.Next(1, TempObj, Value) = S_OK) do
begin
SProp:= IUnknown(TempObj) as SWBemProperty;
//LI:= LVProp.Items.Add;
s:=SProp.Name+': ';
if not SProp.IsArray then begin
PropVal:= SProp.Get_Value;
s:=s+VarToStr(PropVal);
end
else begin
SProp.GetTypeInfoCount(kol);
for i:=1 to kol do
Begin
SProp.GetTypeInfo(i,id,tt);
s:=s+VartoStr(id)+': '+VarToStr(tt);
end;
end;
memo1.Lines.Append(s);
end;
finally
SWbemLocator.Free;
end;
End;
// -------------------------------------------------
// Сбор и вывод информации о клавиатуре
// -------------------------------------------------
function GetKeyboardCount: integer;
var
FSWbemLocator: OLEVariant;
FWMIService : OLEVariant;
FWbemObjectSet: OLEVariant;
FWbemObject : OLEVariant;
oEnum : IEnumvariant;
iValue : LongWord;
begin;
Result:=0;
FSWbemLocator:= CreateOleObject('WbemScripting.SWbemLocator');
FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', '');
FWbemObjectSet:= FWMIService.ExecQuery('SELECT DeviceID FROM Win32_Keyboard','WQL', $00000020);
oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
while oEnum.Next(1, FWbemObject, iValue) = 0 do
...Подобные документы
Технология сбора информации традиционными методами. Правила сбора оффлайновой информации. Технические средства сбора информации. Операции для быстрого восстановления данных в системах хранения. Технологический процесс и процедуры обработки информации.
курсовая работа [304,5 K], добавлен 02.04.2013Способы передачи данных и методы фазирования. Передача алфавитно-цифровой информации. Разработка кодирующего и декодирующего устройства. Расчет среднего времени запаздывания информации. Разработка структурных схем и алгоритмов функционирования СПД.
курсовая работа [2,0 M], добавлен 21.12.2012Изучение организации диалоговой программы и закрепления основных элементов программирования на языке Паскаль и Си (Delphi, C++ Builder). Описание представления информации в программах на языках высокого уровня. Сравнительная характеристика Delphi и C++.
курсовая работа [3,1 M], добавлен 27.02.2015Разработка базы данных "Поставка и реализация продуктов питания". Применение базы данных. Цель инфологического проектирования. Выборка информации при помощи запросов. Подпрограммы, работающие на сервере и управляющие процессами обработки информации.
курсовая работа [326,0 K], добавлен 28.06.2011Borland Delphi 7 как универсальный инструмент разработки, применяемый во многих областях программирования, функции: добавление информации об абитуриентах в базу данных, формирование отчетов. Рассмотрение и характеристика основных компонентов Delphi.
контрольная работа [3,6 M], добавлен 18.10.2012Анализ возможностей утечки информации, неавторизованного и несанкционированного доступа к ресурсам ЛВС сельскохозяйственного комплекса. Ознакомление с антивирусными программы и брандмауэрами. Разработка программного комплекса для защиты информации.
дипломная работа [3,6 M], добавлен 17.04.2010Выбор типовой архитектуры. Схема работы Shell-скрипта. Вывод информации на сайт. Обеспечение его безопасности. Внедрение проекта на сервер. Построение заключительного запроса. Оценка времени работы приложения. Настройка авторизации по открытому ключу.
курсовая работа [950,6 K], добавлен 22.03.2018Структура программного комплекса. Ввод информации из заданного файла. Создание набора данных. Добавление элементов в конец набора данных. Просмотр всех элементов набора данных. Копирование информации из НД в заданный файл. Сортировка массива по номерам.
курсовая работа [630,5 K], добавлен 01.06.2014Обзор контроллеров и модулей ввода-вывода отечественных и зарубежных фирм. Разработка системы АСТРК-СХК нового поколения. Возможные области применения OPC-серверов в АСУ предприятия. Оценка эффективности разработки системы удаленного сбора информации.
дипломная работа [4,5 M], добавлен 07.09.2013Разработка программы, создающей и управляющей базой данных, ее реализация на языке Turbo Pascal. Организация алгоритма программы. Вывод информации и возможность добавления информации в базу данных. Поиск информации в базе данных по заданному значению.
курсовая работа [26,7 K], добавлен 19.06.2010Внедрение программного продукта в организации. Описание входной и выходной информации. Конфигурирование приложения "Сервис веб-помощи". Обзор пользовательского интерфейса. Руководство пользователя для персонала больницы и для администратора приложения.
дипломная работа [2,9 M], добавлен 24.06.2013Особенности управляющих микроконтроллеров. Разработка контроллера для реализации комплекса сбора информации, рассчитанного на фиксирование данных в оперативно-запоминающем устройстве и одновременную передачу её по GSM-каналу в виде SMS-сообщения.
курсовая работа [1019,3 K], добавлен 26.12.2012Анализ исходных данных. Определение структуры модуля для работы файлом. Разработка объектно-ориентированного приложения, использующего массив объектов, в среде Delphi. Модульная структура программного комплекса. Процедура сортировки методом вставки.
курсовая работа [2,2 M], добавлен 20.09.2014Виды информации, с которыми работают современные компьютеры. Понятие "информация": в физике, в биологии, в кибернетике. Представление информации. Кодирование и каналы передачи информации. Локальные компьютерные сети. Хранение информации в файлах.
контрольная работа [26,4 K], добавлен 13.01.2008Сущность языка программирования, идентификатора, структуры данных. Хранение информации, алгоритмы их обработки и особенности запоминающих устройств. Классификация структур данных и алгоритмов. Операции над структурами данных и технология программирования.
контрольная работа [19,6 K], добавлен 11.12.2011Анализ единичных и комплексных показателей качества аппаратного комплекса системы защиты информации. Расчет стоимости для каждой фазы жизненного цикла системы защиты информации программного комплекса, а также расчет общей стоимости владения комплексом.
курсовая работа [65,9 K], добавлен 20.02.2012Определение перечня защищаемой информации и прав пользователей с учетом их должностных полномочий. Выявление путей несанкционированной утечки данных. Установка средств защиты информации, настройка антивирусных программ. Работа с журналами аудита системы.
курсовая работа [753,4 K], добавлен 29.11.2011Выбор технологии, языка и среды программирования. Анализ процесса обработки информации и оценка структур данных для ее хранения. Разработка основных алгоритмов решения и структурной схемы программного продукта. Проектирование интерфейса пользователя.
курсовая работа [449,8 K], добавлен 14.01.2011Средства поиска информации в сети Интернет. Основные требования и методика поиска информации. Структура и характеристика поисковых сервисов. Глобальные поисковые машины WWW (World Wide Web). Планирование поиска и сбора информации в сети Интернет.
реферат [32,2 K], добавлен 02.11.2010Разработка информационной системы административного управления. Выбор языка и среды программирования. Структура взаимодействия информации. Требования к программно-аппаратному окружению. Создание программы в Delphi и связывание ее с базой данных.
курсовая работа [1010,9 K], добавлен 08.10.2015