Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi ordnerfreigabe mit passwort (https://www.delphipraxis.net/10871-ordnerfreigabe-mit-passwort.html)

Remote1 22. Nov 2003 11:52

Re: ordnerfreigabe mit passwort
 
also ich hab Me aber wie immer soll es natürlich auch bei allen anderen funzen

Christian Seehase 22. Nov 2003 13:13

Re: ordnerfreigabe mit passwort
 
Moin Remote,

dann schau Dir mal im PSDK oder im MSDN die Funktion NetShareAdd mit der Struktur share_info_50 an.
In jedem Falle muss man zwischen 9x/ME und NT/W2K/XP unterscheiden, und die Funktion dynamisch importieren, da sie sich zwischen diesen beiden Betriebssystem Bereichen unterscheiden.

rai 1. Jul 2004 15:52

Re: ordnerfreigabe mit passwort
 
Zitat:

Zitat von Christian Seehase
Moin Remote,

dann schau Dir mal im PSDK oder im MSDN die Funktion NetShareAdd mit der Struktur share_info_50 an.
In jedem Falle muss man zwischen 9x/ME und NT/W2K/XP unterscheiden, und die Funktion dynamisch importieren, da sie sich zwischen diesen beiden Betriebssystem Bereichen unterscheiden.

Hallo

mal eine Frage zu einem alten Thema:
Ich hab die Doku zur NetShareAdd gefunden und verstanden. Aber wo liegt der Unterscheid zwischen 9x/ME und NT/XP?
Und wie bekommt man diese gemeinen C-Strukturen (SHARE_INFO_2 und SHARE_INFO_502) mit der Funktion hin? :?: :wall: :wiejetzt:

Danke an alle die schlauer sind als ich! :wink:

Christian Seehase 1. Jul 2004 16:03

Re: ordnerfreigabe mit passwort
 
Moin rai,

da gibt es diverse Unterschiede, mal abgesehen vom Namen.
Zum einen befindet sich die Funktion auf den unterschiedlichen Betriebssystemschienen in unterschiedlichen DLLs, so dass man die Funktion dynamisch importieren muss.
Dann haben sie unterschiedliche Parameter, und Datenstrukturen.

Was meinst Du jetzt bei den Datenstrukturen mit "hinbekommen"?

[EDIT]
z.B. hier

Freigabe unter Windows erstellen

kannst Du auch ein Beispiel finden

Oder such' mal selber nach Hier im Forum suchenNetShareAdd
[/EDIT]

rai 2. Jul 2004 23:08

Re: ordnerfreigabe mit passwort
 
Zitat:

Zitat von Christian Seehase
Moin rai,
Was meinst Du jetzt bei den Datenstrukturen mit "hinbekommen"?

Ich habe leider keine Ahnung wie ich so komplexe C-Strukturen, wie Net_Share_Add sie als Parameter haben will, zum einen in Delphi realisierund und zweitens dann auch noch erfolgreich übergebe :?:

Vielleicht kannst du ja mal (kurz) schreiben wo die Funktionen in 9x/ME und NT/XP zu finden sind bzw. wie man Sie anspricht. (Wenn es hilft, ich habe hier die Win32 API Dokumentation da - nur keine Ahnung welche Version :? )

Danke

PS: Den Code unter dem Link konnte ich leider noch nicht ausprobieren - aber den für Win9x/ME hab ich dort auch nicht gefunden.

Christian Seehase 2. Jul 2004 23:14

Re: ordnerfreigabe mit passwort
 
Moin Rai,

hast Du Dir mal angeschaut, was die beiden Links in meinem letzten Posting zu Tage fördern?

rai 3. Jul 2004 04:15

Re: ordnerfreigabe mit passwort
 
Zitat:

Zitat von Christian Seehase
Moin Rai,

hast Du Dir mal angeschaut, was die beiden Links in meinem letzten Posting zu Tage fördern?

Moin! Ja, das habe ich nochmal gemacht.

Und in einer Nachtschicht ist jetzt folgende Unit entstanden:
(Die wesentichen Teile stammen aus der JEDI-API Libary)
Delphi-Quellcode:
unit LANShare;

interface

uses  Windows, Sysutils ;

  procedure shareFldr(path,netname,password:String;hidden:Boolean);
  procedure UnshareFldr(netname:String;hidden:Boolean);

  Type LMSTR = Windows.LPWSTR;
    LPBYTE = Windows.PBYTE;
    NET_API_STATUS = DWORD;

  function NetShareAdd(servername: LMSTR; level: DWORD; buf: LPBYTE; parm_err: LPDWORD): NET_API_STATUS; stdcall;
  function NetShareDel(servername, netname: LMSTR; reserved: DWORD): NET_API_STATUS; stdcall;

  type
    LPSHARE_INFO_2 = ^SHARE_INFO_2;
    PSHARE_INFO_2 = ^SHARE_INFO_2;
    _SHARE_INFO_2 = record
      shi2_netname: LMSTR;
      shi2_type: DWORD;
      shi2_remark: LMSTR;
      shi2_permissions: DWORD;
      shi2_max_uses: DWORD;
      shi2_current_uses: DWORD;
      shi2_path: LMSTR;
      shi2_passwd: LMSTR;
    end;
    SHARE_INFO_2 = _SHARE_INFO_2;
    TShareInfo2 = SHARE_INFO_2;
    PShareInfo2 = PSHARE_INFO_2;

    LPSHARE_INFO_50 = ^SHARE_INFO_50;
    PSHARE_INFO_50 = ^SHARE_INFO_50;
    _SHARE_INFO_50 = record
       shi50_netname: array [0..12] of Char;
       shi50_type: Byte;
       shi50_flags: Word;
       shi50_remark: PChar;
       shi50_path: PChar;
       shi50_rw_password: array [0..8] of Char;
       shi50_ro_password: array [0..8] of Char;
    end;
    SHARE_INFO_50 = _SHARE_INFO_50;
    TShareInfo50 = SHARE_INFO_50;
    PShareInfo50 = PSHARE_INFO_50;

const

// share_info_2.permissions
  ACCESS_READ  = $01;
  ACCESS_WRITE = $02;
  ACCESS_CREATE = $04;
  ACCESS_EXEC  = $08;
  ACCESS_DELETE = $10;
  ACCESS_ATRIB = $20;
  ACCESS_PERM  = $40;

  ACCESS_GROUP = $8000;

  ACCESS_NONE = 0;
  ACCESS_ALL = (ACCESS_READ or ACCESS_WRITE or ACCESS_CREATE or ACCESS_EXEC or ACCESS_DELETE or ACCESS_ATRIB or ACCESS_PERM);

// parm_err
  SHARE_NETNAME_PARMNUM     = 1;
  SHARE_TYPE_PARMNUM        = 3;
  SHARE_REMARK_PARMNUM      = 4;
  SHARE_PERMISSIONS_PARMNUM = 5;
  SHARE_MAX_USES_PARMNUM    = 6;
  SHARE_CURRENT_USES_PARMNUM = 7;
  SHARE_PATH_PARMNUM        = 8;
  SHARE_PASSWD_PARMNUM      = 9;
  SHARE_FILE_SD_PARMNUM     = 501;

// share_info_2.shi2_type and share_info_50.shi50_type
  STYPE_DISKTREE = 0;
  STYPE_PRINTQ  = 1;
  STYPE_DEVICE  = 2;
  STYPE_IPC     = 3;

  STYPE_TEMPORARY = $40000000;       // share_info_2 only
//STYPE_TEMPORARY = $40;             // share_info_50 only
  STYPE_SPECIAL  = DWORD($80000000); // share_info_2 only
//STYPE_SPECIAL  = $80;             // share_info_50 only

// share_info_50.shi50_flags
  SHI50F_RDONLY  = 1;
  SHI50F_FULL    = 2;
  SHI50F_ACCESSMASK = (SHI50F_RDONLY or SHI50F_FULL);
  SHI50F_PERSIST = $0100;
  SHI50F_SYSTEM  = $0200;

// share_info_2.max_uses
  SHI_USES_UNLIMITED = DWORD(-1);

implementation

function NetApi32 : String ;
begin
  if Win32Platform = VER_PLATFORM_WIN32_NT then Result:='netapi32.dll' else Result:='Svrapi.dll';
end;

function GetModuleHandle(lpModuleName: LPCSTR): HMODULE; stdcall; external kernel32 name 'GetModuleHandleA';
function LoadLibrary(lpLibFileName: LPCSTR): HMODULE; stdcall; external kernel32 name 'LoadLibraryA';
function GetProcAddress(hModule: HMODULE; lpProcName: LPCSTR): FARPROC; stdcall; external kernel32 name 'GetProcAddress';

procedure GetProcedureAddress(var P: Pointer; const ModuleName, ProcName: string);
var
  ModuleHandle: HMODULE;
begin
  if not Assigned(P) then
  begin
    ModuleHandle := GetModuleHandle(PChar(ModuleName));
    if ModuleHandle = 0 then
    begin
      ModuleHandle := LoadLibrary(PChar(ModuleName));
      if ModuleHandle = 0 then raise Exception.Create('Library not found: ' + ModuleName);
    end;
    P := GetProcAddress(ModuleHandle, PChar(ProcName));
    if not Assigned(P) then raise Exception.Create('Function not found: ' + ModuleName + '.' + ProcName);
  end;
end;

var
  _NetShareAdd: Pointer;

function NetShareAdd;
begin
  GetProcedureAddress(_NetShareAdd, netapi32, 'NetShareAdd');
  asm
    mov esp, ebp
    pop ebp
    jmp [_NetShareAdd]
  end;
end;


var
  _NetShareDel: Pointer;

function NetShareDel;
begin
  GetProcedureAddress(_NetShareDel, netapi32, 'NetShareDel');
  asm
    mov esp, ebp
    pop ebp
    jmp [_NetShareDel]
  end;
end;


procedure shareFldr(path,netname,password:String;Hidden:Boolean);
var
share: TShareInfo2;
share50: TShareInfo50;
i:integer;
begin
  while path[Length(path)] in ['\','/']
  do path:=copy(path,0,length(path)-1);
     case Win32Platform of
       VER_PLATFORM_WIN32_NT:
         begin
           if hidden then netname:=netname+'$';
           Share.shi2_netname:=PWideChar(@((Widestring(netname))[1]));
           share.shi2_type:=STYPE_DISKTREE;
           share.shi2_permissions:=ACCESS_ALL;
           Share.shi2_remark:='';
           share.shi2_max_uses:=DWORD(-1);
           share.shi2_current_uses:=0;
           if length(password)>0
           then share.shi2_passwd:=PWideChar(@((Widestring(password))[1]))
           else share.shi2_passwd:=nil;
           share.shi2_path:=PWideChar(@((Widestring(path))[1]));
           NetShareAdd(nil,2,@Share,nil);
         end;
       VER_PLATFORM_WIN32_WINDOWS:
         begin
           for i:=1 to 7 do share50.shi50_netname[i]:=netname[i];
           share50.shi50_type:=STYPE_DISKTREE;
           if hidden then share50.shi50_flags:=SHI50F_SYSTEM else share50.shi50_flags:=SHI50F_FULL;
           share50.shi50_remark:='';
           share50.shi50_rw_password:='';
           share50.shi50_ro_password:='';
           if length(password)>0 then for i:=1 to 7 do share50.shi50_rw_password[i]:=password[i];
           share50.shi50_path:=PChar(@((UpperCase(path))[1]));
           NetShareAdd(nil,50,@share50,nil);
         end;
       else raise Exception.Create('Das Betriebssystem wurde nicht erkannt. Freigabe nicht möglich.');
     end;
end;

procedure UnshareFldr(netname:String;hidden:Boolean);
begin
  if (hidden) and (Win32Platform = VER_PLATFORM_WIN32_NT) then netname:=netname+'$';
  NetShareDel(nil,PWideChar(@((WideString(netname))[1])),0);
end;

end.
Ich hatte leider kurzfristig noch nicht die Möglichkeit unter Win9x/ME zu testen aber XP funktioniert wunderbar.

Gruß

Rai

NicoDE 3. Jul 2004 09:14

Re: ordnerfreigabe mit passwort
 
Zitat:

Zitat von rai
Ich hatte leider kurzfristig noch nicht die Möglichkeit unter Win9x/ME zu testen aber XP funktioniert wunderbar.

Unter Win9x funktioniert es nicht.

Vielleicht helfen Dir die Prototypen weiter:
Delphi-Quellcode:
function NetShareAdd9x(pszServer: PAnsiChar; sLevel: Smallint; const pbBuffer;
  cbBuffer: Word): NET_API_STATUS; stdcall;
  external 'svrapi.dll' name 'NetShareAdd';

function NetShareAddNt(servername: LPWSTR; level: DWORD; const buf;
  parm_err: LPDWORD): NET_API_STATUS; stdcall;
  external 'netapi32.dll' name 'NetShareAdd';
Zudem steht in den Strukturen ziemlicher Schrott, die 9x-Version sollte etwa so aussehen:
Delphi-Quellcode:
       VER_PLATFORM_WIN32_WINDOWS:
         begin
           ZeroMemory(@share50, SizeOf(share50));
           StrLCopy(share50.shi50_netname, PChar(netname),
             SizeOf(share50.shi50_netname));
           share50.shi50_type := STYPE_DISKTREE;
           if hidden then
             share50.shi50_flags := SHI50F_SYSTEM
           else
             share50.shi50_flags := SHI50F_FULL;
           StrLCopy(share50.shi50_rw_password, PChar(password),
             SizeOf(share50.shi50_rw_password));
           StrUpper(share50.shi50_rw_password);
           StrCopy(share50.shi50_ro_password, share50.shi50_rw_password);
           // *seufz*, wie wär's mit ne Variable?
           share50.shi50_path := PChar(@((UpperCase(path))[1]));
           NetShareAdd9x(nil, 50, share50, SizeOf(share50));
         end;
Und ein Rückgabewert hätte Deiner Funktion auch nicht schaden können :)

ps: komisch dass damals in Spotlight niemand meinen kompletten Wrapper fürs Archiv vorgeschlagen hat... nu isses längst nicht mehr zu finden.

Luckie 3. Jul 2004 10:59

Re: ordnerfreigabe mit passwort
 
Zitat:

Zitat von NicoDE
ps: komisch dass damals in Spotlight niemand meinen kompletten Wrapper fürs Archiv vorgeschlagen hat... nu isses längst nicht mehr zu finden.

Aber du hast ihn doch noch hoffentlich?

vlees91 3. Jul 2004 12:43

Re: ordnerfreigabe mit passwort
 
man kann den oprdner einwandfrei freigeben und dann die freigabe wieder aufheben, aber wenn man einen ordner mit einem passwort freigibt, und dann von einem anderen XP-PC aus darauf zugreift, kann man kein passwort eingeben und man bekommt die meldung:"Zugriff verweigert".
bei win 2k kommt eine passwort aufforderung. wieso kommt das nich bei win xp?


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:24 Uhr.
Seite 2 von 3     12 3      

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