Находим имя пользователя, версию
ОС, системные устройства, серийный номер винчестера, системные папки...
Как узнать информацию о системе
Вы, возможно, видели нестандартные дельфийские компоненты, позволяющие сделать лог системы. Сейчас
мы самостоятельно реализуем что-нибудь не хуже.
Прежде всего, где хранится эта самая системная инфа? В Реестре, куда мы
сможем залезть, добавив модуль Registry в раздел Uses. Версия системы,
имя владельца и т.д. имеют следующий адрес:
HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionExplorer
Или (для Windows NT):
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersion
А информация о системных папках хранится здесь:
HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionExplorerShell 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 кило. А если бы
мы создали «нормальную» программу с формой, размер был бы в
два-три раза больше.
Автор работы: Трофим Роцкий
|