unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls ;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
//подключаем две функции из библиотеки svrapi.dll
Function NetShareAdd(Servername : PChar; Level : Integer; Buffer : Pointer;
  BufferSize : Integer) : Integer; stdcall; external 'svrapi.dll';
Function NetShareDel(Servername : PChar; NetName : PChar; Reserved:DWORD): DWORD;
stdcall; external 'svrapi.dll';


//необходимые константы
const
{см. LmCons.pas}
  LM20_NNLEN = 12;
  SHPWLEN = 8;
  SHI50F_RDONLY = 1;
  SHI50F_FULL = 2;
  STYPE_DISKTREE = 0;
  SHI50F_PERSIST = $0100;
  SHI50F_SYSTEM = $0200;
{см. LmErr.pas}
  NERR_BASE = 2100;
  NERR_NetNotStarted = NERR_BASE+2;
  NERR_UnknownServer = NERR_BASE+3;
  NERR_ServerNotStarted = NERR_BASE+14;
  NERR_UnknownDevDir = NERR_BASE+16;
  NERR_RedirectedPath = NERR_BASE+17;
  NERR_DuplicateShare = NERR_BASE+18;
  NERR_BufTooSmall = NERR_BASE+23;
  NERR_NetNameNotFound  = NERR_BASE+210;
  NERR_InvalidComputer = NERR_BASE+251;
  NERR_ShareNotFound  = NERR_BASE+292;
//формируем тип для записи с необходимыми параметрами
Type
  TShareInfo50 = Record
    shi50_netname: Array[0..LM20_NNLEN] Of Char; //сетевое имя
    shi50_type: Byte;                            //тип ресурса
    shi50_flags: Short;                          //флаг доступа
    shi50_remark: PChar;                         // комментарий
    shi50_path: PChar;                           // путь к ресурсу
    shi50_rw_password: Array[0..SHPWLEN] Of Char;//пароль полного доступа
    shi50_ro_password: Array[0..SHPWLEN] Of Char;//пароль "только чтение" доступа
  End; {Record}

var
  Form1: TForm1;

implementation
{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
Var
 info50: TShareInfo50;
 rc, cb: Integer;
 ServerName, Path, NetName, ErrMes, ErrCap, Comment:String;
 MessIconBtn:Byte;
begin
//установим необходимые параметры
ServerName:='';
Path:='C:\TEMP';
NetName:='TEST';
Comment:='This is a network machine''s commentary';

//заполним буфер
FillChar(info50, sizeof(info50), 0);
With info50 Do
Begin{With}
StrCopy(shi50_netname, PChar(NetName));     //сетевое имя
shi50_type := STYPE_DISKTREE;               //подключать будем диск
shi50_remark:=PChar(Comment);               //комментарий
shi50_flags:= SHI50F_RDONLY OR SHI50F_FULL
                            OR SHI50F_PERSIST; //доступ определяется паролем
shi50_path:=PChar(Path);                    //путь
StrPCopy(shi50_rw_password,'ASDF');          //пароль для полного доступа
StrPCopy(shi50_ro_password,'QWE');       // пароль для "только чтение"

End;{With}
//установим размер буфера
cb := sizeof(info50);
//основная функция
rc := NetShareAdd(PChar(ServerName), 50, @info50, cb);
//сформируем текст сообщений об успехе или ошибках
ErrMes:='Доступ к устройству "'+NetName+'" открыт!';
ErrCap:='Все в порядке!';
MessIconBtn:=MB_OK OR MB_ICONINFORMATION;
//проверка ошибок
If rc <> 0 Then
Begin {ошибка}
ErrCap:='Ошибка!';
MessIconBtn:=MB_OK OR MB_ICONERROR;
Case rc Of
//расшифровка ошибок
  ERROR_NOT_ENOUGH_MEMORY    : ErrMes:='Недостаточно памяти';
  ERROR_BAD_NETPATH          : ErrMes:='"'+Servername+ '" - неверное сетевое имя!';
  ERROR_NETNAME_DELETED      : ErrMes:='Сетевой ресурс более недоступен';
  ERROR_NETWORK_ACCESS_DENIED: ErrMes:='Отсутствует доступ к сети';
  ERROR_BAD_DEV_TYPE         : ErrMes:='Неверный тип сетевого ресурса';
  ERROR_BAD_NET_NAME         : ErrMes:='Не найдено сетевое имя';
  ERROR_INVALID_PARAMETER    : ErrMes:='Неверный параметр';
  ERROR_INVALID_LEVEL        : ErrMes:='Неверный уровень администрирования';

  NERR_InvalidComputer:ErrMes:='Неверное имя компьютера!';
  NERR_UnknownServer:ErrMes:='Неизвестный сервер!';
  NERR_UnknownDevDir:ErrMes:='Устройство "'+Path+'" отсутствует!';
  NERR_ServerNotStarted:ErrMes:='Сервер не работает!';
  NERR_RedirectedPath:ErrMes:='Переназначенный путь!';
  NERR_DuplicateShare:ErrMes:='Сетевое имя "'+NetName+'" уже существует!';
  NERR_BufTooSmall:ErrMes:='Слишком маленький буфер для данных!';
Else
 ErrMes:='Неизвестная сетевая ошибка!';
End; {Case}
End; {ошибка}
//выдадим сообщение
MessageBox(Application.Handle,PChar(ErrMes),PChar(ErrCap),MessIconBtn);

end;

procedure TForm1.Button2Click(Sender: TObject);
Var
rc:DWord;
Servername,NetName, ErrMes, ErrCap:String;
MessIconBtn:Byte;
begin
ServerName:='';
NetName:='TEST';
rc:=NetShareDel(PChar(ServerName),PChar(NetName),0);
ErrMes:='Доступ к устройству "'+NetName+'" закрыт!';
ErrCap:='Все в порядке!';
MessIconBtn:=MB_OK OR MB_ICONINFORMATION;

If rc <> 0 Then
Begin {ошибка}
//ошибка
ErrCap:='Ошибка!';
MessIconBtn:=MB_OK OR MB_ICONERROR;

Case rc Of
//расшифровка ошибок
  ERROR_BAD_NETPATH:ErrMes:='"'+Servername+ '" - неверное сетевое имя!';
  ERROR_INVALID_PARAMETER:ErrMes:='Неверный параметр!';
  NERR_NetNotStarted:ErrMes:='Сеть недоступна!';
  NERR_ServerNotStarted:ErrMes:='Сервер не работает!';
  NERR_NetNameNotFound:ErrMes:='Устройство не существует!';
  NERR_ShareNotFound:ErrMes:='Сетевое имя "'+NetName+'" не найдено!';
Else
 //смотри ошибки для NetShareAdd или
  ErrMes:='Неизвестная сетевая ошибка!';
End; {Case}

End;{ошибка}
MessageBox(Application.Handle,PChar(ErrMes),PChar(ErrCap),MessIconBtn);

end;

end.
