Вторник, 17.06.2025
Королевство Delphi
Главное меню
Статьи
Наш опрос
Нашли свой исходник?
Всего ответов: 94
Статистика
Онлайн всего: 1
Гостей: 1
Пользователей: 0
Форма входа
Главная » Статьи » Система » Разное

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

Находим имя пользователя, версию ОС, системные устройства, серийный номер винчестера, системные папки...

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

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

Прежде всего, где хранится эта самая системная инфа? В Реестре, куда мы сможем залезть, добавив модуль 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 кило. А если бы мы создали «нормальную» программу с формой, размер был бы в два-три раза больше.

Автор работы: Трофим Роцкий

Получить ссылку на материал

Категория: Разное | Добавил: Барон (09.12.2011)
Просмотров: 819 | Теги: система | Рейтинг: 1.0/1
[ Пожертвования для сайта ] [ Пожаловаться на материал ]

Если вам помог материал сайта кликните по оплаченной рекламе размещенной в центре

Поиск
Категории раздела
ActiveX [10]
CORBA и COM [16]
Kol и MCK [23]
WinAPI [28]
Компоненты [27]
Работа с Bluetooth [4]
Железо [8]
Текст [18]
Разное [98]
Королевство Delphi © 2010-2025
Яндекс цитирования