15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту




Как расшарить диск

Автор: Repairman

Это модуль для Share любого диска или папки как на локальном, так и на удаленном компьютере (если, конечно у Вас права администратора и на компе разрешено удаленное администрирование, для локальной машины это не обязательно... ;-))

Следует отметить, что под NT некоторые процедуры находятся в других DLL...
Функция SetShareOnDisk - ставит шару, RemoveShareFromDisk - снимает ее.
------------------cut------------------------
unit Share;
//(c)2002 <Repairman> repairman@uzel.ru
interface
type
TPassw=string[8];
TNetName=string[12];

function SetShareOnDisk(HostName:string; //имя компьютера
LocalPath:string; //папка которую надо открыть для доступа
NetName:TNetName; //имя расшаренной папки в сети
Remark:string; //комментарий, видимый в сети
Access:word; //доступ
RO_Passw:TPassw; //пароль на чтение
RW_Passw:TPassw //пароль на полный доступ
):boolean;

function RemoveShareFromDisk(HostName:string; //имя компьютера
NetName:string; //сетевое имя папки которую надо закрыть
LocalPath:string //локальный путь папки
):boolean;
var
ShareResult:word;
//-------------------------------------------------------------------------------------------
implementation
uses SysUtils,Windows,ShlObj;

function NetShareAdd(ServerName:PChar; //указатель на имя компьютера, например '\\Server'#0, если свой, то можно nil
Level:Word; //уровень структуры Share_info, здесь 50
PShareInfo:PChar; //указатель на структуру Share_Info
ParmErr:DWord) //указатель на ???
:dword;stdcall;external 'svrapi.dll';//svrapi для Win9X, NetApi32 для NT

function NetShareDel(ServerName:PChar;
NetName:PChar;
Reserved:DWord):dword;stdcall;external 'svrapi.dll';

type
_share_info_50=record //структура Share уровня 50
NetName:array[1..13] of char; //Как будет называться диск в сети
SType:byte; //тип =0 (STYPE_DISKTREE) - шарить диски
Flags:word; //флаги $0191,$0192,$0193....(доступ из сети)
Remark:PChar; //указатель на комментарий, видимый из сети
Path:PChar; //указатель на имя ресурса, например 'c:\'#0
RW_Password:array [1..9] of char; //пароль для полного доступа, если не нужен =#0
RO_Password:array [1..9] of char; //пароль для доступа на чтение, если не нужен =#0
end;
//----------------------------
function SetShareOnDisk(HostName,LocalPath:string;NetName:TNetName;Remark:string;
Access:word;RO_Passw,RW_Passw:TPassw):boolean;
var ShareInfo:_Share_Info_50;
begin
Result:=false;
StrPCopy(@ShareInfo.NetName,NetName);
ShareInfo.SType:=0;
ShareInfo.Flags:=Access;
ShareInfo.Remark:=PChar(Remark);
ShareInfo.Path:=PChar(LocalPath);
StrPCopy(@ShareInfo.RO_Password,RO_Passw);
StrPCopy(@ShareInfo.RW_Password,RW_Passw);
ShareResult:=NetShareAdd(PChar(HostName),50,@ShareInfo,$0000002a); //вызываем Share
if ShareResult<>0 then Exit; //расшарить неудалось
SHChangeNotify(SHCNE_NETSHARE,SHCNF_PATH,PChar(LocalPath),nil); //сказать шеллу об изменениях
Result:=true;
end;
//----------------------------
function RemoveShareFromDisk(HostName,NetName,LocalPath:string):boolean;
begin
Result:=false;
ShareResult:=NetShareDel(PChar(HostName),PChar(NetName),0); //удалить шару
if ShareResult<>0 then Exit;
SHChangeNotify(SHCNE_NETUNSHARE,SHCNF_PATH,PChar(LocalPath),nil); //сказать шеллу об изменениях
Result:=true;
end;
//----------------------------
end.