Как узнать информацию о системе
🕛 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 кило. А если бы мы создали "нормальную" программу с формой, размер был бы в два-три раза больше