Карта сайтаСсылкиКонтакты

Как показать информацию AutoRun

PDF Печать
Статьи

Чтобы вывести информацию обо всех автозагрузках системы и текущего пользователя, поместите компонент TTreeView на форму и установите его свойство Align в alClient. Данные для заполнения TreeView будем получать из реестра Windows.

Приложение отображает информацию AutoRun Windows

Код приложения:


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ComCtrls, registry, ShlObj, ActiveX;

const
IID_IPersistFile: TGUID =
  (D1:$0000010B;D2:$0000;D3:$0000;D4:($C0,$00,$00,$00,$00,$00,$00,$46));

type
  TForm1 = class(TForm)
    TreeView1: TTreeView;
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

  procedure AddWinINICalls(Tree: TTreeView);
  procedure AddAllFilesToRunView(Hndl: THandle; Tree: TTreeView;
        MainKey, MiddleKey, EndKey: String);
  procedure AddAllRegToRunView(Tree: TTreeView; MainKey, MiddleKey: String); 
  procedure AddRegToRunView(Tree: TTreeView; MainKey, MiddleKey, EndKey: String); 
  procedure ShowAutoRunInformation(Hndl: THandle; TreeView: TTreeView);
  function  GetLinkInfo(WinhWnd: HWND; LnkObj: string): String;

implementation

{$R *.dfm}

procedure TForm1.FormShow(Sender: TObject);
begin
  TreeView1.Items.BeginUpdate; 
  TreeView1.Items.Clear;
  ShowAutoRunInformation(Form1.Handle,TreeView1); 
  TreeView1.FullExpand; 
  TreeView1.Items.EndUpdate;
end;

procedure ShowAutoRunInformation(Hndl:THandle;TreeView:TTreeView); 
begin
  AddRegToRunView(TreeView, 'HKEY_LOCAL_MACHINE',
      '\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon', 'Userinit');
  AddAllRegToRunView(TreeView, 'HKEY_LOCAL_MACHINE', 
      '\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce'); 
  AddAllRegToRunView(TreeView,'HKEY_LOCAL_MACHINE', 
      '\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx'); 
  AddRegToRunView(TreeView,'HKEY_CURRENT_USER', 
      '\Software\Microsoft\Windows NT\CurrentVersion\Windows', 'Run'); 
  AddAllRegToRunView(TreeView, 'HKEY_LOCAL_MACHINE', 
      '\SOFTWARE\Microsoft\Windows\CurrentVersion\Run'); 
  AddAllRegToRunView(TreeView, 'HKEY_CURRENT_USER',
      '\Software\Microsoft\Windows\CurrentVersion\Run'); 
  AddAllFilesToRunView(Hndl, TreeView, 'HKEY_LOCAL_MACHINE', 
      '\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders',
      'Common Startup'); 
  AddAllFilesToRunView(Hndl,TreeView, 'HKEY_LOCAL_MACHINE', 
      '\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders',
      'Common AltStartup'); 
  AddAllFilesToRunView(Hndl, TreeView, 'HKEY_CURRENT_USER', 
      '\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders',
      'Startup'); 
  AddRegToRunView(TreeView,'HKEY_LOCAL_MACHINE', 
      '\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows', 'Load'); 
  AddRegToRunView(TreeView,'HKEY_CURRENT_USER',
      '\Software\Microsoft\Windows NT\CurrentVersion\Windows', 'Load'); 
  AddAllRegToRunView(TreeView, 'HKEY_LOCAL_MACHINE', 
      '\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServices'); 
  AddAllRegToRunView(TreeView, 'HKEY_LOCAL_MACHINE', 
      '\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServicesOnce'); 
  AddAllRegToRunView(TreeView, 'HKEY_CURRENT_USER', 
      '\Software\Microsoft\Windows\CurrentVersion\RunServices');
  AddAllRegToRunView(TreeView, 'HKEY_CURRENT_USER', 
      '\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce'); 
  AddRegToRunView(TreeView, 'HKEY_CURRENT_USER',
      '\Software\Microsoft\Windows NT\CurrentVersion\Winlogon',
      'Userinit'); 
  AddAllRegToRunView(TreeView, 'HKEY_CURRENT_USER', 
      '\Software\Microsoft\Windows\CurrentVersion\RunOnce'); 
  AddAllRegToRunView(TreeView, 'HKEY_CURRENT_USER', 
      '\Software\Microsoft\Windows\CurrentVersion\RunOnceEx'); 
  AddWinINICalls(TreeView); 
end; 

procedure AddRegToRunView(
        Tree:TTreeView;MainKey,MiddleKey,EndKey:String); 
var
  reg: TRegistry; 
  Node: TTreeNode; 
  s: String; 
begin 
  reg:=TRegistry.Create; 
  try 
    if MainKey = 'HKEY_CURRENT_USER' then
      Reg.RootKey:= HKEY_CURRENT_USER else 
      if MainKey= 'HKEY_LOCAL_MACHINE' then
        Reg.RootKey:= HKEY_LOCAL_MACHINE; 
    if Reg.OpenKeyReadOnly(MiddleKey) then 
      if Reg.ValueExists(EndKey) then begin
        s:= Reg.ReadString(EndKey); 
        if s <> '' then begin 
          Node:= Tree.Items.Add(nil, MainKey+MiddleKey +
                '\' + EndKey); 
          Tree.Items.AddChild(Node, s); 
        end; 
      end; 
  finally 
    Reg.CloseKey; 
    reg.Free; 
  end;
end; 

procedure AddAllRegToRunView(
        Tree:TTreeView;MainKey,MiddleKey:String); 
var 
  reg: TRegistry; 
  Node: TTreeNode; 
  Val: TStringList; 
  n: Integer; 
  s: String; 
begin
  reg:=TRegistry.Create; 
  try 
    if MainKey = 'HKEY_CURRENT_USER' then Reg.RootKey:= HKEY_CURRENT_USER else 
      if MainKey = 'HKEY_LOCAL_MACHINE' then Reg.RootKey:= HKEY_LOCAL_MACHINE; 
    if Reg.OpenKeyReadOnly(MiddleKey) then begin 
      Val:= TStringList.Create; 
      Reg.GetValueNames(Val); 
      if Val.Count > 0 then begin 
        Node:= Tree.Items.Add(nil, MainKey + MiddleKey + '\'); 
        for n:= 0 to Val.Count - 1 do begin
          s:= Reg.ReadString(Val[n]); 
          if s <> '' then Tree.Items.AddChild(Node, s); 
        end; 
      end; 
      Val.Free; 
    end; 
  finally 
    Reg.CloseKey; 
    reg.Free; 
  end;
end; 

procedure AddAllFilesToRunView(
        Hndl: THandle; Tree: TTreeView; MainKey, MiddleKey, EndKey: String); 
var 
  reg: TRegistry; 
  Node: TTreeNode; 
  s: String; 
  sr: TSearchRec; 
begin 
  reg:= TRegistry.Create;
  try 
    if MainKey = 'HKEY_CURRENT_USER' then Reg.RootKey:= HKEY_CURRENT_USER else 
      if MainKey = 'HKEY_LOCAL_MACHINE' then Reg.RootKey:= HKEY_LOCAL_MACHINE; 
    if Reg.OpenKeyReadOnly(MiddleKey) then 
      if Reg.ValueExists(EndKey) then begin 
        s:= Reg.ReadString(EndKey); 
        if FindFirst(s + '\*.*', $00, sr) = 0 then begin 
          Node:= Tree.Items.Add(nil, s); 
          Tree.Items.AddChild(Node, sr.Name + ' -> '+ 
            GetLinkInfo(Hndl, s + '\' + sr.Name));
          while FindNext(sr) = 0 do 
            Tree.Items.AddChild(Node, sr.Name + ' -> '+ 
              GetLinkInfo(Hndl, s + '\' + sr.Name)); 
          FindClose(sr); 
        end; 
      end; 
  finally 
    Reg.CloseKey; 
    reg.Free; 
  end;
end; 

procedure AddWinINICalls(Tree: TTreeView); 
var 
  Path         : array[0..MAX_PATH] of Char; 
  sL,sR        : String; 
  Node         : TTreeNode; 
  List         : TStringList; 
  n,n1         : Integer; 
begin
  GetWindowsDirectory(Path, SizeOf(Path)); 
  if NOT FileExists(Path + '\WIN.INI') then exit; 
  List:= TStringList.create; 
  List.LoadFromFile(Path + '\WIN.INI'); 
  sL:= ''; 
  sR:= ''; 
  for n:= 0 to List.count - 1 do if UpperCase(List[n]) = '[WINDOWS]' then break; 
  for n1:= n + 1 to List.count - 1 do begin 
    if copy(List[n1], 1, 1) = '[' then break; 
    if copy(UpperCase(List[n1]), 1, length('RUN=')) = 'RUN=' then sR:= List[n1];
    if copy(UpperCase(List[n1]), 1, length('LOAD=')) = 'LOAD=' then sL:= List[n1]; 
  end; 
  list.Free; 
  if ((sL = '') AND (sR = '')) then exit; 
  Node:= Tree.Items.Add(nil,Path + '\WIN.INI'); 
  if sL <> '' then Tree.Items.AddChild(Node, sL); 
  if sR <> '' then Tree.Items.AddChild(Node, sR); 
end; 

function GetLinkInfo(
        WinhWnd: HWND; LnkObj: string): String;
var 
  hres         : HRESULT; 
  psl          : IShellLink; 
  ppf          : IPersistFile; 
  wfd          : Win32_Find_Data; 
  Path         : array[0..MAX_PATH] of Char; 
begin 
  result := '????'; 
  // Инициализация библиотеки Component Object Model(COM)
  CoInitialize(nil);
  // Вызов CoCreateInstance чтобы получить указатель на IShellLink Interface
  hres:= CoCreateInstance(CLSID_ShellLink, nil, 
                              CLSCTX_INPROC_SERVER, IID_IShellLinkA, psl); 
  if NOT SUCCEEDED(hres) then exit; 
  // IShellLink Interface поддерживает интерфейс IPersistFile 
  // Получаем указатель на него. 
  hres:= psl.QueryInterface(IID_IPersistFile, ppf); 
  if SUCCEEDED(hres) then begin 
    // Преобразовываем строку 
    // и загружаем файл.
    hres:= ppf.Load(StringToOLEStr(LnkObj), STGM_READ); 
    if SUCCEEDED(hres) then begin 
      hres:= psl.Resolve(WinhWnd, SLR_ANY_MATCH OR SLR_NO_UI); 
      if SUCCEEDED(hres) then begin 
        hres:= psl.GetPath(Path, MAX_PATH, wfd, SLGP_SHORTPATH); 
        if SUCCEEDED(hres) then result:= Path; 
      end; 
    end; 
  end;
end; 

end.

 

Добавить комментарий


Защитный код
Обновить