Меня очень часто спрашивают о том, как можно программно открыть или закрыть доступ к какому-либо ресурсу. В двух словах это не объяснишь, потому что проблем здесь очень много и связаны они с тем, что открытие доступа в Windows 9х абсолютно отличается от Windows NT.

В Windows 9х безопасность доступа к файлам намного проще и для программной работы используется файл Svrapi.dll. В Windows NT аналогичные функции расположены в файле NetAPI32.dll. Параметры и типы данных, применяемые в этих функциях, отличаются в основном с точки зрения строк, потому что в NT-системах используются строки Unicode. При запуске программы вы должны проверять версию ОС и в зависимости от этого загружать нужную библиотеку.

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

Для решения этой проблемы я создал собственный файл NetAPI.pas, в котором описаны все нужные функции, структуры и константы. Единственное, чего в нем нет, - это привязки к определенной библиотеке. Если бы я сделал это, то программа при старте загружала бы обе библиотеки и искала нужные функции, а так как, в любом случае, одной из библиотек в ОС нет, то программа была бы заведомо нерабочей.

В листинге 5.14 приведен полный код файла NetAPI.pas.

Листинг 5.14. Заголовочный файл NetAPI.pas unit NetApi:

interface
uses
Wi ndows;
type TShareInfo2 = packed record shi2_netname: PWideChar;
shi2_type: DWORD: shi2_remark: PWideChar: shi2_permissions: DWORD;
shi2_max_uses: DWORD;
shi2_current_uses: DWORD: shi2_path: PWideChar: shi2_passwd: PWideChar;
end:
PShareInfo2 = * TShareInfo2;
TShareInfo2Array = array [0..1024] of TShareInfo2; PShareInfo2Array = л TShareInfo2Array;
type TShareInfo502 = packed record shi502_netname: array [0..12] of Char;
shi502_type: Byte: shi502_flags: Word: shi502_remark: PChar;
shi502_path: PChar;
shi502_rw_password: array [0..8] of Char;
shi502_ro_password: array [0..8] of Char;
end;
type TSessionInfo502 - packed record Sesi502_cname: PWideChar: Sesi502_username: PWideChar;
Sesi502_num_opens: DWORD: Sesi502_time: DWORD: Sesi502_idle_time: DWORD: Sesi502_user_flags: DWORD;
Sesi502_cltype_name: PWideChar: Sesi502_transport: PWideChar;
end:
PSessionInfo502 = *TSessionInfo502; TSessionInfo502Array - array[0..1024] of TSessionInfo502: PSessionInfo502Array = *TSessionInfo502Array;
TSessionInfo50 = packed record Sesi50_cname: PChar;
Sesi50_username: PChar: sesi50_key: Cardinal;
sesi50_num_conns: Word: sesi50_num_opens: Word: sesi50_time: Cardinal: sesi50_id1e_time: Cardinal;
sesi50_protocol: Byte: padl. Byte;
end:
type TFileInfo3 = packed record fi3_id: DWORD;
fi3_permissions- DWORD;
fi3_num_locks: DWORD;
fi3_pathname: PWideChar;
fi3_username: PWideChar:
end:
PFileInfo3 = ~TFileInfo3:
TFileInfo3Array = array[0..1024] of TFileInfo3;
PFileInfo3Array - *TFileInfo3Array:
type TFileInfo502 = packed record fi502_id: Cardinal: fi502_permissionsx: WORD;
fi502_num_locks: WORD: fi502_pathname: PChar: fi502_username: PChar: fi502_sharename: PChar;
end;
type Листинг 5.14 (продолжение) TMiblfRow = packed record wszName- array[0..255] of WideChar: dwlndex: DWORD: dwType: DWORD: dwMtu: DWORD: dwSpeed: DWORD: dwPhysAddrLen: DWORD: bPhysAddr: array[0 .7] of Byte: dwAdminStatus: DWORD: dwOperStatus: DWORD: dwLastChange: DWORD: dwInOctets: DWORD: dwInUcastPkts DWORD;
dwInNUCastPkts: DWORD;
dwInDiscards: DWORD: dwInErrors: DWORDs dwInUnknownProtos: DWORD. dwOutOctetS: DWORD: dwOutUCastPkts: DWORD: dwOutNUCastPktS: DWORD: dwOutDiscards: DWORD;
dwOutErrorS: DWORD: dwOutQLen: DWORD;
dwDescrLen: DWORD;
bDescr: array[0..255] of Char;
end:
TMiblfArray = array [0..1024] of TMiblfRow: PMiblfRow = "TMiblfRow: PMiblfArray = "TMiblfArray;
type TMiblfTable = packed record dwNumEntries: DWORD. Table: TMiblfArray:
end:
PMiblfTable = "TMiblfTable;
const
STYPE_DISKTREE = 0. STYPE_PRINTQ = 1; STYPE_DEVICE = 2; STYPEJPC = 3;
ACCESS_READ = 1. ACCESS_WRITE = 2; ACCESS_CREATE = 4; ACCESS_EXEC = 8. ACCESS_DELETE = 16; ACCESS_ATRIB = 32; ACCESS_PERM = 64:

ACCESS_ALL = 258: WIDE_LENGTH = Si zeOF(Wi deCha г)*256: var NetShareEnumNT- function( servername- PWideChar: level: DWORD: bufptr: Pointer: prefmaxlen: DWORD: entriesread, totalentries, resume_handle:LPDWORD)- DWORD: stdcall:

NetShareEnum: function( pszServer. PChar: sLevel: Cardinal: pbBuffer. Pchar. cbBuffer: Cardinal: pcEntriesRead.
pcTotalAvail Pointer): DWORD: stdcall;
NetShareAddNT: function( servername- PWideChar;
level: DWORD: buf- Pointer:
parm_err: LPDWORD): DWORD: stdcall.
NetShareAdd: function( pszServer: Pchar;
sLevel Cardinal: pbBuffer: PChar: CbBuffer.Word): DWORD;
stdcall;
NetShareDelNT: function( servername: PWideChar;
netname: PWideChar;
reserved: DWORD): Longlnt: stdcall:
NetShareDel: function( pszServer, pszNetName: PChar: usReserved: Word): DWORD: stdcall:
NetSessionEnumNT: function( servername, UncClientName. username: PWideChar;
level: DWORD: bufptr: Pointer:

Листинг 5.14 (продолжение) prefmaxlen: DWORD: entriesread, total entries, resumejiandle: LPDWORD): DWORD: stdcall:

NetSessionEnum: function( pszServer: PChar: sLevel: DWORD: pbBuffer: Pointer: cbBuffer: DWORD: pcEntriesRead.
pcTota1Avi a1:Pointer): i nteger: stdca11:
NetSessionDelNT: function( ServerName. UncClientName.
username: PWideChar): DWORD;
stdcall;
NetSessionDel: function( pszServer: PChar: pszClientName: PChar;
sReserved: Smalllnt)- DWORD;
stdcall, NetFileEnumNT: function( servername. basepath.
username: PWideChar;
level. DWORD: bufptr: Pointer;
prefmaxlen: DWORD: entriesread, total entries, resumejiandle: LPDWORD): DWORD;
stdcall:
NetFileEnum: function( pszServer. pszBasePath. PChar;
sLevel: DWORD;
pbBuffer: Pointer: cbBuffer: DWORD;
pcEntriesRead.
pcTotalAvail:pointer). integer: stdcall:
NetFileCloseNT: function( ServerName: PWideChar;
Fileld: DWORD): DWORD;
stdcall;
NetFileClose- function( pszServer:PChar:
ulFileld: LongWord): DWORD;
stdcall;
GetlfTable. function(
plfTable: PMiblfTable: pdwSize: PULONG, bOrder: Boolean ): DWORD ; stdcall: implementation end.

Пример тщательно протестирован в Windows NT, a в Windows 9x я проводил только поверхностное тестирование на чужом компьютере. Этот файл нет смысла создавать вручную, потому что он расположен на компакт-диске к этой книге в каталоге Additional, а здесь приведен для удобства чтения последующих описаний и примеров.

Поместите этот файл в каталоге, в котором Delphi сможет его найти (путь к папке должен быть прописан в настройках Delphi), или в папке с исходным кодом вашего проекта.

5.7. Широковещание || Оглавление || 5.8.1. Как загрузить нужную библиотеку


Delphi в шутку и всерьез: что умеют хакеры



Новости за месяц

  • Декабрь
    2021
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31