dolphin | Дата: Понедельник, 23.02.2009, 16:11 | Сообщение # 1 |
Администратор
Сообщений: 906
Статус: Offline
| Код var Computer: array[1..500] of string[25]; ComputerCount: Integer;
procedure FindAllComputers(Workgroup: string); var EnumHandle: THandle; WorkgroupRS: TNetResource; Buf: array[1..500] of TNetResource; BufSize: Integer; Entries: Integer; Result: Integer; begin ComputerCount := 0; Workgroup := Workgroup + #0; FillChar(WorkgroupRS, SizeOf(WorkgroupRS), 0); with WorkgroupRS do begin dwScope := 2; dwType := 3; dwDisplayType := 1; dwUsage := 2; lpRemoteName := @Workgroup[1]; end; WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, @WorkgroupRS, EnumHandle); repeat Entries := 1; BufSize := SizeOf(Buf); Result := WNetEnumResource(EnumHandle, Entries, @Buf, BufSize); if (Result = NO_ERROR) and (Entries = 1) then begin Inc(ComputerCount); Computer[ComputerCount] := StrPas(Buf[1].lpRemoteName); end; until (Entries <> 1) or (Result <> NO_ERROR); WNetCloseEnum(EnumHandle); end; { Find All Computers }
Код //////////////////////////////////////////////////////////////////////////////// // // Демонстрационная программа сканирования сети на основе // WNetOpenEnum, WNetEnumResource, WNetCloseEnum // // Автор: Александр (Rouse_) Багель // mailto:rouse79@yandex.ru // //
unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, Winsock, ImgList, ShellAPI;
const STR_START = 'Начать сканирование'; STR_STOP = 'Остановить сканирование'; STR_STARTED = ' Идет сканирование ...'; STR_STOPPED = ' Сканирование завершено ...'; STR_END = ' Завершение потока ...'; STR_FIELD = ' Поле не выбрано ...';
type TDemoThread = class(TThread) private TreeNetWrk: TTreeNode; TreeDomain: TTreeNode; TreeServer: TTreeNode; TreeShares: TTreeNode; Param_dwType: Byte; Param_dwDisplayType: Byte; Param_lpRemoteName: String; Param_lpIP: String; protected procedure Execute; override; procedure Scan(Res: TNetResource; Root: boolean); procedure AddElement; procedure Stop; end;
TForm1 = class(TForm) Button1: TButton; TreeView1: TTreeView; StatusBar1: TStatusBar; ImageList1: TImageList; procedure Button1Click(Sender: TObject); procedure TreeView1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure TreeView1DblClick(Sender: TObject); private Thread: TDemoThread; end;
var Form1: TForm1;
implementation
{$R *.dfm}
function GetIPAddress(NetworkName: String): String; var Error: DWORD; HostEntry: PHostEnt; Data: WSAData; Address: In_Addr; begin Delete(NetworkName, 1, 2); Error:=WSAStartup(MakeWord(1, 1), Data); if Error = 0 then begin HostEntry:=gethostbyname(PChar(NetworkName)); Error:=GetLastError; if Error = 0 then begin Address:=PInAddr(HostEntry^.h_addr_list^)^; Result:=inet_ntoa(Address); end else Result:='Unknown'; end else Result:='Error'; WSACleanup; end;
{ TDemoThread }
procedure TDemoThread.Execute; var R:TNetResource; begin inherited; Priority := tpIdle; FreeOnTerminate := True; Resume; Scan(R, True); TreeDomain := nil; TreeServer := nil; Synchronize(Stop); end;
procedure TDemoThread.Scan(Res: TNetResource; Root: boolean); var hEnum: Cardinal; nrResource: array[0..512] of TNetResource; dwSize: DWORD; numEntries: DWORD; I: DWORD; dwResult: DWORD; begin if Root then dwResult := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, nil, hEnum) else dwResult := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, @Res, hEnum); if dwResult = NO_ERROR then begin dwSize := SizeOf(nrResource); numEntries := DWORD(-1); // ERROR_NO_MORE_ITEMS if WNetEnumResource(hEnum, numEntries, @nrResource, dwSize) = NO_ERROR then begin for i := 0 to numEntries - 1 do begin if Terminated then Break; with nrResource[i] do begin Param_dwType := dwType; Param_dwDisplayType := dwDisplayType; Param_lpRemoteName := lpRemoteName; if Param_dwDisplayType = RESOURCEDISPLAYTYPE_SERVER then Param_lpIP := GetIPAddress(Param_lpRemoteName); end; if Assigned(nrResource[i].lpRemoteName) then Synchronize(AddElement); Scan(nrResource[i], false); end; WNetCloseEnum(hEnum); end; end; end;
procedure TDemoThread.AddElement; begin Application.ProcessMessages; case Param_dwDisplayType of RESOURCEDISPLAYTYPE_NETWORK: begin TreeNetWrk := Form1.TreeView1.Items.Add(nil, Param_lpRemoteName); TreeNetWrk.StateIndex := 1; end; RESOURCEDISPLAYTYPE_DOMAIN: begin TreeDomain := Form1.TreeView1.Items.AddChild(TreeNetWrk, Param_lpRemoteName); TreeDomain.StateIndex := 2; end; RESOURCEDISPLAYTYPE_SERVER: begin TreeServer := Form1.TreeView1.Items.AddChild(TreeDomain, Param_lpRemoteName + ' IP: ' + Param_lpIP); TreeServer.StateIndex := 3; end; RESOURCEDISPLAYTYPE_SHARE: begin TreeShares := Form1.TreeView1.Items.AddChild(TreeServer, Param_lpRemoteName); TreeShares.StateIndex := 3 + Param_dwType; end; end; end;
procedure TDemoThread.Stop; begin Form1.StatusBar1.Panels[1].Text := STR_STOPPED; Form1.Button1.Caption := STR_START; Form1.Button1.Enabled := True; Form1.Tag := 0; end;
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject); begin Tag := 0; end;
procedure TForm1.Button1Click(Sender: TObject); begin Tag := Tag + 1; if (Tag mod 2) = 1 then begin TreeView1.Items.Clear; StatusBar1.Panels[1].Text := STR_STARTED; Button1.Caption := STR_STOP; Thread := TDemoThread.Create(False); end else begin StatusBar1.Panels[1].Text := STR_END; Button1.Enabled := False; Thread.Terminate; end; end;
procedure TForm1.TreeView1Click(Sender: TObject); begin if Assigned(TreeView1.Selected) then StatusBar1.Panels[0].Text := ' ' + TreeView1.Selected.Text else StatusBar1.Panels[0].Text := STR_FIELD; end;
procedure TForm1.TreeView1DblClick(Sender: TObject); var Str: String; begin if Assigned(TreeView1.Selected) then begin Str := TreeView1.Selected.Text; if Copy(Str, 1, 2) <> '\\' then Exit; if Pos(' IP:', Str) <> 0 then ShellExecute(Handle, 'explore', PChar(Copy(Str, 1, Pos(' IP:', Str))), nil, nil, SW_SHOW) else ShellExecute(Handle, 'explore', PChar(Str), nil, nil, SW_SHOW); end; end;
end.
Система: Windows 10 x64, Kali Linux Среды программирования: Delphi 7, Delphi 10.x
Я не профессионал, я всего лишь любитель Я не вредитель, я всего лишь теоретик
|
|
| |