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

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

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

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

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

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

 

 

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



Опубликовал admin
27 Май, Вторник 2003г.
Состав ливерпуля 2014 2015 бернли ливерпуль.


Программирование для чайников.