Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Перечислить сетевые соединения

Delphi , Интернет и Сети , Сеть

Перечислить сетевые соединения

Речь сисадмина к девушке, пришедшей регистрироваться на сервере:
- С точки зрения сетевой безопасности вы представляете собой потенциальную дырку.


{ 
  From the MS-DOS prompt, you can enumerate the network 
  connections (drives) by using the following command: 

   net use 

  Programmatically, you would call WNetOpenEnum() to start 
  the enumeration of connected resources and 
  WNetEnumResources() to continue the enumeration. 
  The following sample code enumerates the network connections: 
} 


procedure TForm1.Button1Click(Sender: TObject); 
var 
  i, dwResult: DWORD; 
  hEnum: THandle; 
  lpnrDrv: PNETRESOURCE; 
  s: string; 
const 
  cbBuffer: DWORD = 16384; 
  cEntries: DWORD = $FFFFFFFF; 
begin 
  dwResult := WNetOpenEnum(RESOURCE_CONNECTED, 
    RESOURCETYPE_ANY, 
    0, 
    nil, 
    hEnum); 

  if (dwResult <> NO_ERROR) then  
  begin 
    ShowMessage('Cannot enumerate network drives.'); 
    Exit; 
  end; 
  s := ''; 
  repeat 
    lpnrDrv  := PNETRESOURCE(GlobalAlloc(GPTR, cbBuffer)); 
    dwResult := WNetEnumResource(hEnum, cEntries, lpnrDrv, cbBuffer); 
    if (dwResult = NO_ERROR) then  
    begin 
      s := 'Network drives:'#13#10; 
      for i := 0 to cEntries - 1 do  
      begin 
        if lpnrDrv^.lpLocalName <> nil then 
          s := s + lpnrDrv^.lpLocalName + #9 + lpnrDrv^.lpRemoteName; 
        Inc(lpnrDrv); 
      end; 
    end 
    else if dwResult <> ERROR_NO_MORE_ITEMS then  
    begin 
      s := s + 'Cannot complete network drive enumeration'; 
      GlobalFree(HGLOBAL(lpnrDrv)); 
      break; 
    end; 
    GlobalFree(HGLOBAL(lpnrDrv)); 
  until (dwResult = ERROR_NO_MORE_ITEMS); 
  WNetCloseEnum(hEnum); 
  if s = '' then s := 'No network connections.'; 
  ShowMessage(s); 
end; 


{*********************************************************************** 
 FindComp Unit from 
 Fatih Olcer 
 fatiholcer@altavista.com 
***********************************************************************} 
unit FindComp; 

interface 

uses 
  Windows, Classes; 

function FindComputers: DWORD; 

var 
  Computers: TStringList; 

implementation 

uses 
  SysUtils; 

const 
  MaxEntries = 250; 

function FindComputers: DWORD; 
var 
  EnumWorkGroupHandle, EnumComputerHandle: THandle; 
  EnumError: DWORD; 
  Network: TNetResource; 
  WorkGroupEntries, ComputerEntries: DWORD; 
  EnumWorkGroupBuffer, EnumComputerBuffer: array[1..MaxEntries] of TNetResource; 
  EnumBufferLength: DWORD; 
  I, J: DWORD; 
begin 
  Computers.Clear; 

  FillChar(Network, SizeOf(Network), 0); 
  with Network do 
  begin 
    dwScope := RESOURCE_GLOBALNET; 
    dwType  := RESOURCETYPE_ANY; 
    dwUsage := RESOURCEUSAGE_CONTAINER; 
  end; 

  EnumError := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, 
    @Network, EnumWorkGroupHandle); 

  if EnumError = NO_ERROR then 
  begin 
    WorkGroupEntries := MaxEntries; 
    EnumBufferLength := SizeOf(EnumWorkGroupBuffer); 
    EnumError        := WNetEnumResource(EnumWorkGroupHandle, WorkGroupEntries, 
      @EnumWorkGroupBuffer, EnumBufferLength); 

    if EnumError = NO_ERROR then 
    begin 
      for I := 1 to WorkGroupEntries do 
      begin 
        EnumError := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, 
          @EnumWorkGroupBuffer[I], EnumComputerHandle); 
        if EnumError = NO_ERROR then 
        begin 
          ComputerEntries  := MaxEntries; 
          EnumBufferLength := SizeOf(EnumComputerBuffer); 
          EnumError        := WNetEnumResource(EnumComputerHandle, ComputerEntries, 
            @EnumComputerBuffer, EnumBufferLength); 
          if EnumError = NO_ERROR then 
            for J := 1 to ComputerEntries do 
              Computers.Add(Copy(EnumComputerBuffer[J].lpRemoteName, 
                3, Length(EnumComputerBuffer[J].lpRemoteName) - 2)); 
          WNetCloseEnum(EnumComputerHandle); 
        end; 
      end; 
    end; 
    WNetCloseEnum(EnumWorkGroupHandle); 
  end; 

  if EnumError = ERROR_NO_MORE_ITEMS then 
    EnumError := NO_ERROR; 
  Result := EnumError; 
end; 

initialization 

  Computers := TStringList.Create; 

finalization 

  Computers.Free; 
end.

Here is a translation of the provided text into Russian:

Код, который вы предоставили, это комбинация двух процедур:

  1. Button1Click: эта процедура перечисляет сетевые подключения (диски) на системе и отображает их в сообщении.
  2. FindComputers: функция находит компьютеры на сети с помощью функций WNetOpenEnum() и WNetEnumResource(). Она возвращает код ошибки, если перечисление не удалось.

Вот, как можно модифицировать эти процедуры для отображения всех сетевых подключений:

Button1Click

procedure TForm1.Button1Click(Sender: TObject);
var
  i, dwResult: DWORD;
  hEnum: THandle;
  lpnrDrv: PNETRESOURCE;
  s: string;
const
  cbBuffer: DWORD = 16384;
  cEntries: DWORD = $FFFFFFFF;
begin
  dwResult := WNetOpenEnum(RESOURCE_CONNECTED,
    RESOURCETYPE_ANY,
    0,
    nil,
    hEnum);

  if (dwResult <> NO_ERROR) then
  begin
    ShowMessage('Cannot enumerate network drives.');
    Exit;
  end;

  s := '';
  repeat
    lpnrDrv := PNETRESOURCE(GlobalAlloc(GPTR, cbBuffer));
    dwResult := WNetEnumResource(hEnum, cEntries, lpnrDrv, cbBuffer);
    if (dwResult = NO_ERROR) then
    begin
      s := 'Network drives:#13#10';
      for i := 0 to cEntries - 1 do
      begin
        if lpnrDrv^.lpLocalName <> nil then
          s := s + lpnrDrv^.lpLocalName + #9 + lpnrDrv^.lpRemoteName;
        Inc(lpnrDrv);
      end;
    end
    else if dwResult <> ERROR_NO_MORE_ITEMS then
    begin
      s := s + 'Cannot complete network drive enumeration';
      GlobalFree(HGLOBAL(lpnrDrv));
      break;
    end;
    GlobalFree(HGLOBAL(lpnrDrv));
  until (dwResult = ERROR_NO_MORE_ITEMS);

  WNetCloseEnum(hEnum);
  if s = '' then s := 'No network connections.';
  ShowMessage(s);
end;

FindComputers

function FindComputers: DWORD;
var
  EnumWorkGroupHandle, EnumComputerHandle: THandle;
  EnumError: DWORD;
  Network: TNetResource;
  WorkGroupEntries, ComputerEntries: DWORD;
  EnumWorkGroupBuffer, EnumComputerBuffer: array[1..MaxEntries] of TNetResource;
  EnumBufferLength: DWORD;
  I, J: DWORD;
begin
   // Initialize TStringList for computer names
  Computers.Clear;

  FillChar(Network, SizeOf(Network), 0);
  with Network do
  begin
    dwScope := RESOURCE_GLOBALNET;
    dwType    := RESOURCETYPE_ANY;
    dwUsage   := RESOURCEUSAGE_CONTAINER;
  end;

  EnumError := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0,
      @Network, EnumWorkGroupHandle);

  if EnumError = NO_ERROR then
  begin
    WorkGroupEntries := MaxEntries;
    EnumBufferLength := SizeOf(EnumWorkGroupBuffer);
    EnumError          := WNetEnumResource(EnumWorkGroupHandle, WorkGroupEntries,
        @EnumWorkGroupBuffer, EnumBufferLength);

    if EnumError = NO_ERROR then
    begin
      for I := 1 to WorkGroupEntries do
      begin
        EnumError := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0,
            @EnumWorkGroupBuffer[I], EnumComputerHandle);
        if EnumError = NO_ERROR then
        begin
          ComputerEntries    := MaxEntries;
          EnumBufferLength   := SizeOf(EnumComputerBuffer);
          EnumError          := WNetEnumResource(EnumComputerHandle, ComputerEntries,
              @EnumComputerBuffer, EnumBufferLength);
          if EnumError = NO_ERROR then
            for J := 1 to ComputerEntries do
              Computers.Add(Copy(EnumComputerBuffer[J].lpRemoteName,
                3, Length(EnumComputerBuffer[J].lpRemoteName) - 2));
          WNetCloseEnum(EnumComputerHandle);
        end;
      end;
    end;
    WNetCloseEnum(EnumWorkGroupHandle);
  end;

  if EnumError = ERROR_NO_MORE_ITEMS then
    EnumError := NO_ERROR;
  Result := EnumError;
end;

Эти процедуры можно использовать для отображения всех сетевых подключений и имен компьютеров на системе.

В статье перечислены сетевые соединения, описаны функции и процедуры для программной enumerations network connections в MS-DOS и Windows.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Сеть ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 16:39:57/0.0059940814971924/1