Информационные технологииStfw.Ru 🔍

Как узнать информацию о системе

🕛 04.03.2008, 15:58
Вы, возможно, видели нестандартные дельфийские компоненты, позволяющие сделать лог системы. Сейчас мы самостоятельно реализуем что-нибудь не хуже.

Прежде всего, где хранится эта самая системная инфа? В Реестре, куда мы сможем залезть, добавив модуль registry в раздел uses. Версия системы, имя владельца и т.д. имеют следующий адрес:

hkey_local_machinesoftwaremicrosoft windowscurrentversionexplorer

Или (для windows nt):
hkey_local_machinesoftwaremicrosoft windows ntcurrentversion

А информация о системных папках хранится здесь:
hkey_current_usersoftwaremicrosoft windowscurrentversionexplorershell folders

В то же время данные о некоторых системных устройствах хранятся в файле system.ini. Значит, добавим модуль inifiles, чтобы осуществить чтение информации из этого файла. Таким образом, если вы умеете работать с Реестром и ini, узнать системную информацию вам будет так же просто, как сделать format c: complete из-под загрузочного диска. Изюминка в том, что наше приложение, которое эту инфорнмацию собирает и записывает в лог-файл, будет консольным, и создать его можно через file>new>other>console application.

program osinfo;
uses
sysutils,
windows,
registry,
inifiles; //!!

//ключи реестра, в которых будем искать информацию
const
folders = 'softwaremicrosoftwindowscurrentversionexplorershell folders';
winvers = 'softwaremicrosoftwindowscurrentversion';

var
f: textfile; //файл с логом
serialnum: pdword;
a: dword;
i: integer;
drive, windir: string;
buffer: array [0..255] of char;
ms: tmemorystatus;

//читаем информацию из Реестра
function wininfo(root_key: hkey; key_open, key_read: string): string;
var
registry: tregistry;
begin
//если windows nt, открываем другой ключ
if ((getversion and $80000000)=0) and (key_open=winvers) then
key_open:='softwaremicrosoftwindows ntcurrentversion';
registry := tregistry.create;
try
registry.rootkey := root_key;
registry.openkey(key_open, false);
result := registry.readstring(key_read);
finally
registry.free;
end;
//если ничего не найдено, выводим "невозможно определить"
if result<>emptystr then result:=key_read+': '+result else result:=key_read+': невозможно определить';
end;

//читаем из system.ini
function getdevice(section, ident: string): string;
var inifile: tinifile;
begin
inifile:=tinifile.create(windir+'system.ini');
result:=inifile.readstring(section,ident,'неизвестное устройство');
inifile.free;
end;

begin
//Узнаем директорию Винды. Она нам еще понадобится
getwindowsdirectory(buffer, sizeof(buffer));
windir:=buffer;
assignfile(f,windir+'osinfo.txt'); //Соединямся с файлом лога
rewrite(f); //Переходим в начало файла
writeln(f,'Лог создан: '+datetimetostr(now));
writeln(f,'');
//пользователь, версия ОС и т.д.
writeln(f,' О Системе:');
writeln(f,wininfo(hkey_local_machine,winvers,'registeredowner'));
writeln(f,wininfo(hkey_local_machine,winvers,'registeredorganization'));
writeln(f,wininfo(hkey_local_machine,winvers,'productid'));
writeln(f,wininfo(hkey_local_machine,winvers,'productkey'));
writeln(f,wininfo(hkey_local_machine,winvers,'productname'));
writeln(f,wininfo(hkey_local_machine,winvers,'version'));
writeln(f,wininfo(hkey_local_machine,winvers,'versionnumber'));
//Какой браузер?
writeln(f,wininfo(hkey_local_machine,winvers,'plus! versionnumber'));
writeln(f,'');
writeln(f,' Память:');
writeln(f,'Доступные носители: ');
//Получаем информацию о дисках
for i := 0 to 25 do
if (getlogicaldrives and (1 shl i)) <> 0 then begin
drive:=char(ord('a') + i) + ':';
case getdrivetype(pchar(drive)) of
drive_removable: writeln(f,drive+' (гибкий диск)');
drive_cdrom: writeln(f,drive+' (cd-rom)');
drive_fixed: begin
//находим серийный номер жесткого диска
new(serialnum);
if getvolumein formation(pchar(drive),buffer,sizeof(buffer),serialnum,a,a,nil,0) then
writeln(f,drive+' (жесткий диск, sn '+inttostr(serialnum^)+')');
end;
else writeln(f,drive+' (неизвестный диск');
end;
end;
//информация о памяти
globalmemorystatus(ms);
writeln(f,'Оперативная память: '+ formatfloat('#,###" kb"', ms.dwtotalphys / 1024));
writeln(f,'Свободно на жестком диске: '+ formatfloat('#,###" байт"',diskfree(3)));
//"3" указывает на диск c:
writeln(f,'Объем жесткого диска: '+ formatfloat('#,###" байт"',disksize(3)));
writeln(f,'');
//узнаем об устройствах из system.ini
writeln(f,' Устройства:');
writeln(f,'Клавиатура: '+getdevice('boot.de scription','keyboard.typ'));
writeln(f,'Мышь: '+getdevice('boot.de scription','mouse.drv'));
writeln(f,'Дисплей: '+getdevice('boot.de scription','display.drv'));
writeln(f,'Хранитель экрана: '+getdevice('boot','scrnsave.exe'));
writeln(f,'');
//читаем системные папки из Реестра
writeln(f,' Системные папки:');
getcurrentdirectory(sizeof(buffer), buffer);
writeln(f,'Текущий каталог: '+buffer);

writeln(f,wininfo(hkey_current_user,folders,'cache'));
writeln(f,wininfo(hkey_local_machine,winvers,'configpath'));
writeln(f,wininfo(hkey_current_user,folders,'cookies'));
writeln(f,wininfo(hkey_current_user,folders,'desktop'));
writeln(f,wininfo(hkey_current_user,folders,'favorites'));
writeln(f,wininfo(hkey_current_user,folders,'fonts'));
writeln(f,wininfo(hkey_current_user,folders,'history'));
writeln(f,wininfo(hkey_current_user,folders,'local appdata'));
writeln(f,wininfo(hkey_local_machine,winvers,'mediapath'));
writeln(f,wininfo(hkey_current_user,folders,'my music'));
writeln(f,wininfo(hkey_current_user,folders,'my pictures'));
writeln(f,wininfo(hkey_current_user,folders,'nethood'));
writeln(f,wininfo(hkey_current_user,folders,'personal'));
writeln(f,wininfo(hkey_current_user,folders,'printhood'));
writeln(f,wininfo(hkey_local_machine,winvers,'programfilesdir'));
writeln(f,wininfo(hkey_local_machine,winvers,'commonfilesdir'));
writeln(f,wininfo(hkey_current_user,folders,'programs'));
writeln(f,wininfo(hkey_current_user,folders,'recent'));
writeln(f,wininfo(hkey_current_user,folders,'sendto'));
writeln(f,wininfo(hkey_current_user,folders,'start menu'));
writeln(f,wininfo(hkey_current_user,folders,'startup'));
getsystemdirectory(buffer, sizeof(buffer));
writeln(f,'system: '+buffer);
gettemppath(sizeof(buffer),buffer);
writeln(f,'temp: '+buffer);
writeln(f,wininfo(hkey_current_user,folders,'templates'));
writeln(f,wininfo(hkey_local_machine,winvers,'wallpaperdir'));
writeln(f,'windows: '+windir);
close(f); //отсоединяемся от файла
end.

Результаты сохранятся в директории windows в файле osinfo.txt. Чтобы ознакомиться с ними, вам достаточно открыть этот файл.

Такое приложение весит 156 кило. А если бы мы создали "нормальную" программу с формой, размер был бы в два-три раза больше

Pascal и Delphi   Теги:

Читать IT-новости в Telegram
Информационные технологии
Мы в соцсетях ✉