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

Вы, возможно, видели нестандартные дельфийские компоненты, позволяющие сделать лог системы. Сейчас мы самостоятельно реализуем что-нибудь не хуже. Прежде всего, где хранится эта самая системная инфа? В Реестре, куда мы сможем залезть, добавив модуль 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 getVolumeInformation(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.description','keyboard.typ')); 
WriteLn(F,'Мышь: '+getDevice('boot.description','mouse.drv')); 
WriteLn(F,'Дисплей: '+getDevice('boot.description','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 кило. А если бы мы создали "нормальную" программу с формой, размер был бы в два-три раза больше.

Вот и всё, Удачи!


    No results found.
Отменить.