Delphi-PRAXiS

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 27. Okt 2003 10:13


ordnerfreigabe mit passwort
 
wie kann mal in delphi einen ordner im netzwerk mit passwort freigeben
schreibgeschützt und vollzugriff kreig ich ja über die registry hin, aber ich kann halt kein passwort angeben.

Sharky 27. Okt 2003 10:58

Re: ordnerfreigabe mit passwort
 
Zitat:

Zitat von Remote1
...... kreig ich ja über die registry hin, aber ich kann halt kein passwort angeben.


Hai Remote1.

Über die Reg ist das wohl nicht der beste Weg. Schaue dir mal die API NetShareAdd an. Damit solte es gehen.
Dann hast Du auch nicht das Problem die Reg neu einlesen zu müssen.

Remote1 4. Nov 2003 08:03

Re: ordnerfreigabe mit passwort
 
ich hab zwar schon mal im forum und internet geschautt, aber irgend wie werd ich daraus auch nicht schlauer.
kann mir nicht jemand mal die
Delphi-Quellcode:
function NetShareAdd
erklären und ein beispiel beilegen

Sharky 4. Nov 2003 08:12

Re: ordnerfreigabe mit passwort
 
Hai Remote1,

unter welcher Windowsvesion soll es denn laufen? Hast Du dir schon die Funktion im PSDK angesehen?
Ich schaue mal ob ich etwas hinbekomme.

Da dies jetzt in Richtung WIN-API geht verschiebe ich den Thread mal dort hin. Dann lesen ihn auch die Profis in diesem Bereich ;-)

Remote1 5. Nov 2003 08:08

Re: ordnerfreigabe mit passwort
 
wenn möglich soll es eigentlich unter allen windowsversionen laufen

Christian Seehase 5. Nov 2003 20:53

Re: ordnerfreigabe mit passwort
 
Moin Remote,

Zitat:

Zitat von Remote1
...aber ich kann halt kein passwort angeben.

Das versteh' ich jetzt nicht, wo willst Du ein Passwort angeben?

Hast Du Dir schon einmal NetShareAdd im PSDK bzw auf MSDN angesehen?
Es gibt da u.a. schon einmal Unterschiede bei 9x/ME und NTff was diese Funktion angeht.

Remote1 10. Nov 2003 11:05

Re: ordnerfreigabe mit passwort
 
ich will halt eine eifache ordnerfreigabe im netzwerk mit passwort

Christian Seehase 10. Nov 2003 19:20

Re: ordnerfreigabe mit passwort
 
Moin Remote,

ein Passwortdialog kommt nur, wenn Du Dich auf einen Share verbinden willst, auf den Du nicht schon die Berechtigungen hast.
Anders als durch Einschränkung der Berechtigten User/Gruppen wird das nicht zu machen sein.

Remote1 14. Nov 2003 11:00

Re: ordnerfreigabe mit passwort
 
ich will eigentlich auf meinem rechner mit einem programm einen bestimmten ordner mit passwort freigeben (meinetwegen lese(schreibschutzpasswort)

halt wie über rechte maustaste-->freigabe...
aber ohne dialog, sondern vielleicht in einer procedure oder so (halt in meinem programm)

Christian Seehase 14. Nov 2003 18:45

Re: ordnerfreigabe mit passwort
 
Moin Remote,

von welchem Betriebssystem ist denn hier die Rede?

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?

Tubos 3. Jul 2004 12:52

Re: ordnerfreigabe mit passwort
 
Wenn ich richtig informiert bin kann man unter Windows 2000 + XP keine Ordner mit Passwort freigeben.
Das geht nur mehr mit Benutzern.

edit:
komisch, anscheinend geht es bei dir doch :stupid:
aber dass das unter 2000 geht und unter xp nicht finde ich schon komisch

rai 4. Jul 2004 16:16

Re: ordnerfreigabe mit passwort
 
Zitat:

Zitat von NicoDE
Unter Win9x funktioniert es nicht.

Vielleicht helfen Dir die Prototypen weiter:
[..]
Zudem steht in den Strukturen ziemlicher Schrott,
[..]

Danke, für's probieren. Offenbar war die Funktion aus der JEDI-Libary auch nur für NT/XP gedacht.

Ich habe es jetzt mal nach deinen Vorschlägen geändert.
Nur die NetShareAddNt habe ich wie gehabt übernommen, da in deiner Version der Parameter buf eine Kostante ist und mir auf die schnelle nicht eingefallen ist, wie ich das dann anpassen muss. Und so funktioniert es auch :) Außerdem entspricht meine Version genau der Win32 API Doku..
Ich muss zugeben, dass ich die SHARE_INFO_50-Struktur selbst aus der API-Docu abgeleitet habe. :oops:
Wie müsste die denn aussehen?
Zitat:

Zitat von NicoDE
Delphi-Quellcode:
[..]
// *seufz*, wie wär's mit ne Variable?
[..]

Ja, gerne. Aber wo? wie? was? wofür? :gruebel:

Zitat:

Zitat von NicoDE
[..]
Und ein Rückgabewert hätte Deiner Funktion auch nicht schaden können :)
[..]

Den Rückgabewert hatte ich schon von selbst geändert: Ich hab mir gedacht ich geb einfach als Boolean zurück ob's geklappt hat. Wenn ich mich nicht irre, muss die NetShareAdd-Funktion NET_API_STATUS als 0 zurückgeben wenn alles ok ist.

Allerdings bleibt zu vermuten, dass auch die Funktion NetShareDel dann nur unter NT/XP funktioniert.
Vielleicht kannst du mir ja auch da noch einen Tipp geben.

Danke

Rai

NicoDE 4. Jul 2004 17:09

Re: ordnerfreigabe mit passwort
 
Zitat:

Zitat von Luckie
Aber du hast ihn doch noch hoffentlich?

Nö, ich hebe sowas nicht auf.

Zitat:

Zitat von vlees91
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?

IIRC sollte das Problem nicht auftreten, wenn man in den Einstellungen der jeweiligen Netwerkverbindung die automatische Authentifizierung als Gast deaktiviert (ansonsten kannste immernoch 'Verbinden als...' probieren - Benutzer Gast (egal?) mit passendem Passwort).

Zitat:

Zitat von rai
Nur die NetShareAddNt habe ich wie gehabt übernommen, da in deiner Version der Parameter buf eine Kostante ist und mir auf die schnelle nicht eingefallen ist, wie ich das dann anpassen muss.

'const buf' definiert eine untypisierte Konstante (Du kannst als Paramater alles übergeben und die Funktion bekommt die Adresse übergeben - ist des gleiche wie buf: Pointer, nur das statt @info einfach info übergeben wird).

Zitat:

Zitat von rai
Ich muss zugeben, dass ich die SHARE_INFO_50-Struktur selbst aus der API-Docu abgeleitet habe. :oops:
Wie müsste die denn aussehen?

Die ist schon in Ordnung. Nur die Art und Weise des Füllens war alles andere als sinnvoll/sicher/sauber (Geschmacksfrage - 'es funktioniert' reicht mir persönlich nicht... zumindest für allgemein gültige Beispiele).


Gruss Nico

rai 4. Jul 2004 17:30

Re: ordnerfreigabe mit passwort
 
Zitat:

Zitat von NicoDE
[..]
(Geschmacksfrage - 'es funktioniert' reicht mir persönlich nicht... zumindest für allgemein gültige Beispiele).

Sehe ich auch so. Und ich würde gerne die Unit nochmal komplett veröffentlichen, wenn alles funktioniert - Kann sicher jeder mal gebrauchen. Daher sollte die Allgemeingültigkeit schon gegeben sein.

Dazu sollte aber auch alles stimmen, deshalb:
1. Hat sich nochmal jemand meine UnShareFldr bzw. die NetShareDel insbesondere in Hinblick auf Win9x/ME angesehen - XP funktioniert. Bzw.
2. Stimmt die Boolean-Auswertung des Rückgabe-Wertes NET_API_STATUS = 0 als true (Freigabe erfolgreich) sonst false?

Bin für alle Antworten dankbar

Rai

NicoDE 4. Jul 2004 18:01

Re: ordnerfreigabe mit passwort
 
Zitat:

Zitat von rai
1. Hat sich nochmal jemand meine UnShareFldr bzw. die NetShareDel insbesondere in Hinblick auf Win9x/ME angesehen - XP funktioniert.

Hab' ich im Moment nicht die Zeit für (ohne Delphi eh' gerade schlecht :))
Später vielleicht...

Zitat:

Zitat von rai
2. Stimmt die Boolean-Auswertung des Rückgabe-Wertes NET_API_STATUS = 0 als true (Freigabe erfolgreich) sonst false?

Bei einem Fehler wird es für den Benutzer einer Boolean-Funktion schwer herauszufinden was der Grund für den Fehler war (gibt es das Verzeichnis nicht, oder wurde es schon freigegeben, ...).

rai 4. Jul 2004 19:29

Re: ordnerfreigabe mit passwort
 
Zitat:

Zitat von NicoDE
Hab' ich im Moment nicht die Zeit für (ohne Delphi eh' gerade schlecht :))
Später vielleicht...

Da wäre ich echt dankbar. Vielleicht macht es ja auch kurz jemand anderes. :coder: Danke trotzdem :thuimb:

Zitat:

Zitat von NicoDE
Bei einem Fehler wird es für den Benutzer einer Boolean-Funktion schwer herauszufinden was der Grund für den Fehler war (gibt es das Verzeichnis nicht, oder wurde es schon freigegeben, ...).

Ist natürlich auch wieder richtig. Kennt zufällig jemand die möglichen Rückgabewerte und deren Bedeutung?
Danke :)

mischa 6. Jul 2004 02:42

Re: ordnerfreigabe mit passwort
 
Hallo zusammen,

ich habe eine Komponente gefunden (bei Torry), die auch unter Delphi 6 noch prima läuft. Hier wird auch ShareInfo2 und SharInfo50 verwendet. Allerdings bleibt ein Problem, dass ich nicht hinkriege (aber leider lösen muss):
Unter WinXP wird der Ordner immer mit Vollzugriff für jeden freigegeben! Will man unter W2K/XP eine Freigabe für einen oder mehrere Benutzer / Gruppen realisieren, muss man wohl oder übel SharInfo502 verwenden und einen SecurityDescriptor übergeben. Den erhält man über die Funktion GetSecurityInfo(). Hier muss man dann noch eine SID für den User angeben, die man mittels LookupAccountName() erhält. Soweit habe ich das verstanden (oder nicht? ;-) ).
Ich habe nur leider keinen Wrapper für GetSecurityInfo() gefunden. Hat jemand eine API-Lib dafür?
Mein Code bisher (in einer modifizierten Version der Routine "Share" der obigen Komponente):

Delphi-Quellcode:
    (...)
    // Erst die Buffergrößen ermitteln ...
    SidSize := 0;
    DomainNameSize := 0;
    LookupAccountName(nil, PChar(MyUserName), MyUserSID, SidSize, DomainName, DomainNameSize, SidType);
    // ... dann Speicher allokieren ...
    GetMem(MyUserSID, SidSize);
    DomainName := StrAlloc(DomainNameSize);
    // SID ermitteln
    LookupAccountName(nil, PChar(MyUserName), MyUserSID, SidSize, DomainName, DomainNameSize, SidType);
   
    // und jetzt:
    GetSecurityInfo(MyUserSID ...); // aber woher nehmen?!?

    PMySecDesc := @MySecDesc;

    MyShare.shi502_netname := PWideChar(MYName);
    MyShare.shi502_type := FResourceType;
    MyShare.shi502_remark := PWideChar(MYComment);
    MyShare.shi502_permissions := FNTPermissions;
    MyShare.shi502_max_uses := FMaxConnections;
    MyShare.shi502_current_uses := 0;
    MyShare.shi502_path := PWideChar(MyPath);
    MyShare.shi502_passwd := PWideChar(MyPW);
    MyShare.shi502_security_descriptor := PMySecDesc;
    (...)
Ich hoffe, das ist nicht zu chaotisch ... bin müde :oops:

mischa 6. Jul 2004 07:05

Re: ordnerfreigabe mit passwort
 
Ok, habe doch eine API-Conversation gefunden: GetSecurityInfo() wird in der unit JwaAclApi.pas der Win32API Conversation von Marcel van Brakel bei Jedi deklariert. Muss ich mal testen ... melde mich dann wieder ...

NicoDE 6. Jul 2004 09:40

Re: ordnerfreigabe mit passwort
 
Wenn Du keine Komponente mit einem Acl-Editor-Dialog verwendest (sprich, alles von von Hand schreiben willst), hast Du viel Arbeit vor Dir.

Wenn vordefinierte Accounts ('Jeder', 'Administratoren') ausreichen, kannst Du einige SID-Konstanten verwenden.

Beispiel unter http://www.entwickler-forum.de/webx?14@@.ee704fa/30


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:32 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