Skip to content

Instantly share code, notes, and snippets.

@novaeye
Created March 26, 2014 11:02
Show Gist options
  • Save novaeye/9780904 to your computer and use it in GitHub Desktop.
Save novaeye/9780904 to your computer and use it in GitHub Desktop.
unit uNetShare;
interface
uses
SysUtils, Windows;
type
SHARE_INFO_2 = record
shi2_netname: LPWSTR;
shi2_type: DWORD;
shi2_remark: LPWSTR;
shi2_permissions: DWORD;
shi2_max_uses: DWORD;
shi2_current_uses: DWORD;
shi2_path: LPWSTR;
shi2_passwd: LPWSTR;
end;
PSHARE_INFO_2 = ^SHARE_INFO_2;
const
STYPE_DISKTREE = 0;
STYPE_PRINTQ = 1;
STYPE_DEVICE = 2;
STYPE_IPC = 3;
STYPE_DFS = 100;
STYPE_SPECIAL = $80000000;
ACCESS_NONE = 0;
ACCESS_READ = 1;
ACCESS_WRITE = 2;
ACCESS_CREATE = 4;
ACCESS_EXEC = 8;
ACCESS_DELETE = 16;
ACCESS_ATRIB = 32;
ACCESS_PERM = 64;
ACCESS_ALL = (ACCESS_READ + ACCESS_WRITE + ACCESS_CREATE + ACCESS_EXEC + ACCESS_DELETE + ACCESS_ATRIB + ACCESS_PERM);
function UnshareFolder(sName: string): boolean;
procedure ShareFolder(StrName: string);
function getNetName(sFolder: string): string;
implementation
uses
StrUtils;
function NetShareAdd(servername: LPWSTR; level: DWORD; buf: pSHARE_INFO_2; parm_err: LPDWORD): LongWord; stdcall; external 'netapi32.dll';
function NetShareDel(ServerName, ShareName: pwChar; level: DWord): DWord; stdcall; external 'NETAPI32.DLL';
function UnshareFolder(sName: string): boolean;
var
Size: Integer;
rep: LongInt;
NameNT: PWChar;
ret : Boolean;
begin
ret := false;
if DirectoryExists(sName) then
begin
Size := SizeOf(WideChar) * 256;
GetMem(NameNT, Size);
StringToWideChar(getNetName(sName), NameNT, Size);
rep := NetShareDel(nil, NameNT, 0);
if rep = 0 then
ret := True
else
ret := false;
end;
Result := ret;
end;
procedure ShareFolder(StrName: string);
var
buf: Pointer;
UserInf: Share_INFO_2;
err: lpdword;
F: integer;
begin
err := nil;
if DirectoryExists(strName) then
begin
UserInf.shi2_netname := StringToOleStr(getNetName(strName));
UserInf.shi2_type := STYPE_DISKTREE;
UserInf.shi2_remark := '';
UserInf.shi2_permissions := ACCESS_ALL;
//UserInf.shi2_max_uses := -1;
UserInf.shi2_current_uses := 0;
UserInf.shi2_path := StringToOleStr(StrName);
UserInf.shi2_passwd := nil;
GetMem(Buf, sizeof(UserInf));
F := NetSHAREAdd(nil, 2, @UserInf, err);
FreeMem(Buf);
end;
end;
function getNetName(sFolder: string): string;
var
ipos, i: integer;
sTemp: string;
begin
ipos := 0;
for i := 1 to Length(sFolder) do
if sFolder[Length(sFolder)-i] = '\' then
begin
iPos := Length(sFolder)-i;
break;
end;
stemp := AnsiRightStr(sFolder, Length(sFolder) - ipos);
result := sTemp;
end;
end.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment