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

Библиотека для работы с LAN

Delphi , Компоненты и Классы , Библиотеки компонент



Оформил: DeeCo

Автор: Alex

unit NetProcs;

interface

uses Classes, Windows;

type
  TAdapterStatus = record
    adapter_address: array[0..5] of Char;
    filler: array[1..4 * SizeOf(Char) + 19 * SizeOf(Word)
    + 3 * SizeOf(DWORD)] of Byte;
  end;
  THostInfo = record
    username: PWideChar;
    logon_domain: PWideChar;
    oth_domains: PWideChar;
    logon_server: PWideChar;
  end; {record}

function IsNetConnect: Boolean;
{Возвращает TRUE если компьютер подключен к сети, иначе - FALSE}

function AdapterToString(Adapter: TAdapterStatus): string;
{Преобразует MAC адес в привычный xx-xx-xx-xx}

function GetMacAddresses(const Machine: string;
  const Addresses: TStrings): Integer;
{Заполняет Addresses MAC-адресами компьютера с сетевым именем  Machine.
 Возвращает число МАС адресов на компьютере}

function GetNetUser(HostName: WideString): THostInfo;
{Возвращает LOGIN текущего пользователя на HOSTNAME компьютере}

implementation

uses NB30, SysUtils;

function IsNetConnect: Boolean;
begin
  if GetSystemMetrics(SM_NETWORK) and $01 = $01 then
    Result := True
  else
    Result := False;
end; {function}

function AdapterToString(Adapter: TAdapterStatus): string;
begin
  with Adapter do
    Result :=
      Format('%2.2x-%2.2x-%2.2x-%2.2x-%2.2x-%2.2x', [
      Integer(adapter_address[0]), Integer(adapter_address[1]),
        Integer(adapter_address[2]), Integer(adapter_address[3]),
        Integer(adapter_address[4]), Integer(adapter_address[5])]);
end; {function}

function GetMacAddresses(const Machine: string;
  const Addresses: TStrings): Integer;
const
  NCBNAMSZ = 16; // absolute length of a net name
  MAX_LANA = 254; // lana's in range 0 to MAX_LANA inclusive
  NRC_GOODRET = $00; // good return
  NCBASTAT = $33; // NCB ADAPTER STATUS
  NCBRESET = $32; // NCB RESET
  NCBENUM = $37; // NCB ENUMERATE LANA NUMBERS
type
  PNCB = ^TNCB;
  TNCBPostProc = procedure(P: PNCB); stdcall;
  TNCB = record
    ncb_command: Byte;
    ncb_retcode: Byte;
    ncb_lsn: Byte;
    ncb_num: Byte;
    ncb_buffer: PChar;
    ncb_length: Word;
    ncb_callname: array[0..NCBNAMSZ - 1] of Char;
    ncb_name: array[0..NCBNAMSZ - 1] of Char;
    ncb_rto: Byte;
    ncb_sto: Byte;
    ncb_post: TNCBPostProc;
    ncb_lana_num: Byte;
    ncb_cmd_cplt: Byte;
    ncb_reserve: array[0..9] of Char;
    ncb_event: THandle;
  end;
  PLanaEnum = ^TLanaEnum;
  TLanaEnum = record
    length: Byte;
    lana: array[0..MAX_LANA] of Byte;
  end;
  ASTAT = record
    adapt: TAdapterStatus;
    namebuf: array[0..29] of TNameBuffer;
  end;
var
  NCB: TNCB;
  Enum: TLanaEnum;
  I: Integer;
  Adapter: ASTAT;
  MachineName: string;
begin
  Result := -1;
  Addresses.Clear;
  MachineName := UpperCase(Machine);
  if MachineName = '' then
    MachineName := '*';
  FillChar(NCB, SizeOf(NCB), #0);
  NCB.ncb_command := NCBENUM;
  NCB.ncb_buffer := Pointer(@Enum);
  NCB.ncb_length := SizeOf(Enum);
  if Word(NetBios(@NCB)) = NRC_GOODRET then
  begin
    Result := Enum.Length;
    for I := 0 to Ord(Enum.Length) - 1 do
    begin
      FillChar(NCB, SizeOf(TNCB), #0);
      NCB.ncb_command := NCBRESET;
      NCB.ncb_lana_num := Enum.lana[I];
      if Word(NetBios(@NCB)) = NRC_GOODRET then
      begin
        FillChar(NCB, SizeOf(TNCB), #0);
        NCB.ncb_command := NCBASTAT;
        NCB.ncb_lana_num := Enum.lana[i];
        StrLCopy(NCB.ncb_callname, PChar(MachineName), NCBNAMSZ);
        StrPCopy(@NCB.ncb_callname[Length(MachineName)],
          StringOfChar(' ', NCBNAMSZ - Length(MachineName)));
        NCB.ncb_buffer := PChar(@Adapter);
        NCB.ncb_length := SizeOf(Adapter);
        if Word(NetBios(@NCB)) = NRC_GOODRET then
          Addresses.Add(AdapterToString(Adapter.adapt));
      end;
    end;
  end;
end; {function}

function
  NetWkstaUserEnum(servername: PWideChar;
  level: DWord;
  var bufptr: Pointer;
  prefmaxlen: DWord;
  var entriesread: PDWord;
  var totalentries: PDWord;
  var resumehandle: PDWord): LongInt;
  stdcall; external 'netapi32.dll' name 'NetWkstaUserEnum';

function GetNetUser(HostName: WideString): THostInfo;
var
  Info: Pointer;
  ElTotal: PDWord;
  ElCount: PDWord;
  Resume: PDWord;
  Error: LongInt;
begin
  Resume := 0;
  NetWkstaUserEnum(PWideChar(HostName), 1, Info, 0,
    ElCount, ElTotal, Resume);
  Error := NetWkstaUserEnum(PWideChar(HostName), 1, Info, 256 *
    Integer(ElTotal),
    ElCount, ElTotal, Resume);
  case Error of
    ERROR_ACCESS_DENIED: Result.UserName := 'ERROR - ACCESS DENIED';
    ERROR_MORE_DATA: Result.UserName := 'ERROR - MORE DATA';
    ERROR_INVALID_LEVEL: Result.UserName := 'ERROR - INVALID LEVEL';
  else if Info <> nil then
    Result := THostInfo(info^)
  else
  begin
    Result.username := '???';
    Result.logon_domain := '???';
    Result.oth_domains := '???';
    Result.logon_server := '???';
  end; {if}
  end; {case}
end; {function}

end.

Перевод контента на русский язык:

Приведенный код - часть библиотеки Delphi для работы с локальной сетью (LAN). Он содержит несколько функций для взаимодействия с сетью, таких как проверка подключения компьютера к сети, преобразование MAC-адресов в формат, понятный человеку, перечисление адаптеров сети и получение информации о текущем пользователе, зарегистрированном на хосте.

Краткое описание каждой функции:

  1. IsNetConnect: Функция проверяет, подключен ли компьютер к сети, используя функцию Windows API GetSystemMetrics с параметром SM_NETWORK.
  2. AdapterToString: Функция принимает запись TAdapterStatus в качестве входного параметра и возвращает строковое представление MAC-адреса в формате xx-xx-xx-xx.
  3. GetMacAddresses: Функция перечисляет адаптеры сети на машине, извлекает их MAC-адреса и добавляет их в список TStrings.
  4. GetNetUser: Функция использует функцию Windows API NetWkstaUserEnum для получения информации о текущем пользователе, зарегистрированном на хосте, таких как имя пользователя, домен входа, другие домены и сервер входа.

Некоторые предложения по улучшению:

  1. Обработка ошибок: В функции GetMacAddresses обработка ошибки заключается в возвращении значения -1, но лучше было бы выбросить исключение или предоставить более информативные сообщения об ошибках.
  2. Организация кода: Код не организован хорошо, функции и переменные рассредоточены по файлу. Лучше было бы группировать связанные функции вместе и использовать отдельные модули для различных функциональных возможностей.
  3. Комментарии: В коде нет комментариев, что делает его трудным для понимания без документации.
  4. Стиль кода: Код использует смесь синтаксиса Pascal и C, что может сделать его более сложным для чтения. Лучше было бы придерживаться одного стиля кодирования throughout библиотеки.

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

Библиотека для работы с локальной сетью (LAN) предлагает функции для проверки подключения к сети, преобразования MAC-адресов в формат xx-xx-xx-xx, получения списка MAC-адресов компьютера по имени, а также получения информации о текущем пользователе на уда


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

Получайте свежие новости и обновления по 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 18:02:37/0.0038368701934814/0