Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Ordnerfreigabe: Problem mit Read Only-Freigabe (https://www.delphipraxis.net/77720-ordnerfreigabe-problem-mit-read-only-freigabe.html)

TillWe 23. Sep 2006 19:39


Ordnerfreigabe: Problem mit Read Only-Freigabe
 
Hallo,
ich möchte einen Orner im Netzwerk freigeben. Allerdings soll auf das Verzeichnis vom Netzwerk aus nur lesend zugegriffen werden.
Hierzu habe ich zunächst die Funkition ShareDir verwendet, aus dem Easy Delphi Helper von dsdt.info:
Delphi-Quellcode:
if not ShareDir(ExcludeTrailingPathDelimiter(label3.caption), 'koffein', '', True) then
//...
Das Problem:
Der Ordner wird zwar freigegeben aber immer mit Schreizugriff, also nicht readonly!
Weiß jemand Abhilfe bzw. woran das liegen könnte?

mfg

Hier noch mal zur besseren Info die Funktion aus dem Easy Helper (so wie ich sie eingebunden habe):
Delphi-Quellcode:
unit types_functions_u;
uses
 //[...]
interface
const
SType_DiskTree = 0;
Access_Read = 1;
Access_All = 127;
Nerr_Success = 0;

type
TShareInfo2ExW = record
 shi2_NetName: PWideChar;
 shi2_Type: Longword;
 shi2_Remark: PWideChar;
 shi2_Permissions: Longword;
 shi2_Max_Uses: Longword;
 shi2_Current_Uses: Longword;
 shi2_Path: PWideChar;
 shi2_Passwd: PWideChar;
end;

TShareInfo2ExA= record
 shi2_NetName: PAnsiChar;
 shi2_Type: Longword;
 shi2_Remark: PAnsiChar;
 shi2_Permissions: Longword;
 shi2_Max_Uses: Longword;
 shi2_Current_Uses: Longword;
 shi2_Path: PAnsiChar;
 shi2_Passwd: PAnsiChar;
end;

type
TNetShareAddFunc = function (servername: PChar; level: Longword;
                             const buf: Pointer;
                             parm_err: PLongWord): LongWord; stdcall;
 //[...]
function ShareDir(const ADir, AName, APassword: WideString; ReadOnly: Boolean): Boolean;
 //[...]

implementation


function ShareDirA(const ADir, AName, APassword: string; ReadOnly: Boolean): Boolean;
var
Info: TShareInfo2ExA;
Err: Longword;

Lib: THandle;
NetShareAddFunc: TNetShareAddFunc;
begin
Result:=False;
Lib:= LoadLibrary('Svrapi.dll');

if Lib <> 0 then
begin
  try
    @NetShareAddFunc:= GetProcAddress(Lib,'NetShareAdd');
    if @NetShareAddFunc <> nil then
    begin
       FillChar(Info, SizeOf(Info), 0);
       Info.shi2_netname := PAnsiChar(AName);
       Info.shi2_type := SType_DiskTree;
       Info.shi2_remark := nil;
       if ReadOnly then
         Info.shi2_permissions := Access_Read
       else
         Info.shi2_permissions := Access_All;
       Info.shi2_max_uses := LongWord(-1);
       Info.shi2_current_uses := 0;
       Info.shi2_path := PAnsiChar(ADir);
       Info.shi2_passwd := PAnsiChar(APassword);
       Result := NetShareAddFunc(nil, 2, @Info, @Err) = NERR_SUCCESS;
    end
    else
      RaiseLastOSError;
  finally
    FreeLibrary(Lib);
  end;
end;
end;

function ShareDirW(const ADir, AName, APassword: WideString; ReadOnly: Boolean): Boolean;
var
Info: TShareInfo2ExW;
Err: Longword;

Lib: THandle;
NetShareAddFunc: TNetShareAddFunc;
begin
Result:=False;
Lib:= LoadLibrary('Netapi32.dll');

if Lib <> 0 then
begin
  try
    @NetShareAddFunc:= GetProcAddress(Lib,'NetShareAdd');
    if @NetShareAddFunc <> nil then
    begin
     FillChar(Info, SizeOf(Info), 0);
     Info.shi2_netname := PWideChar(AName);
     Info.shi2_type := SType_DiskTree;
     Info.shi2_remark := nil;
     if ReadOnly then
       Info.shi2_permissions := Access_Read
     else
       Info.shi2_permissions := Access_All;
     Info.shi2_max_uses := LongWord(-1);
     Info.shi2_current_uses := 0;
     Info.shi2_path := PWideChar(ADir);
     Info.shi2_passwd := PWideChar(APassword);
     Result := NetShareAddFunc(nil, 2, @Info, @Err) = Nerr_Success;
    end
    else
      RaiseLastOSError;
  finally
    FreeLibrary(Lib);
  end;
end;
end;

function ShareDir(const ADir, AName, APassword: WideString; ReadOnly: Boolean): Boolean;
begin
if Win32Platform = VER_PLATFORM_WIN32_WINDOWS then
  Result := ShareDirA(ADir, AName, APassword, ReadOnly)
else
  Result := ShareDirW(ADir, AName, APassword, ReadOnly);
end;
 //[...]

marabu 23. Sep 2006 20:59

Re: Ordnerfreigabe: Problem mit Read Only-Freigabe
 
Hallo Till,

es könnte sein, dass es egal ist, was du als permission einträgst:

Microsoft schreibt im Platform SDK

shi2_permissions

Specifies a DWORD value that indicates the shared resource's permissions for servers running with share-level security. A server running user-level security ignores this member. This member can be one or more of the following values. Calls to the NetShareSetInfo function ignore this member.
Note that the Windows Server 2003 family, Windows XP, Windows 2000, and Windows NT do not support share-level security.

Gute Nacht

marabu

TillWe 23. Sep 2006 22:02

Re: Ordnerfreigabe: Problem mit Read Only-Freigabe
 
Versteh das Zitat aus dem SDK nur halb.
Es geht um die Checkbox "Netzwerkbenutzer dürfen Dateien verändern".
Manuell kann ich diese (de)aktivieren. Wenn ich aber den Ordner aus einem Delphiprogramm heraus freigeben möchte ist er immer aktiviert, d.h. ich muß ihn wieder manuell deaktivieren.

Naja, erstmal danke und gute Nacht :hi:

SirThornberry 23. Sep 2006 22:14

Re: Ordnerfreigabe: Problem mit Read Only-Freigabe
 
weil eben unter xp die Rechtevergabe anders funktioniert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:36 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz