Суббота, 18.05.2024, 10:24
AMAR Inc.
Приветствую Вас Гость | RSS
Главная Программирование Регистрация Вход
Меню сайта

Категории каталога
Разные статьи [48]
Система [62]

Главная » Статьи » Delphi » Система

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

   Источник: delphid.dax.ru

Категория: Система | Добавил: amar-runyak (03.04.2008)
Просмотров: 2208 | Рейтинг: 0.0/0 |

Всего комментариев: 0
Имя *:
Email *:
Код *:
Форма входа

Поиск

Друзья сайта

Статистика

Copyright AMAR Inc. © 2024