![]() |
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. |
Re: ordnerfreigabe mit passwort
Zitat:
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. |
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:
erklären und ein beispiel beilegen
function NetShareAdd
|
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 ;-) |
Re: ordnerfreigabe mit passwort
wenn möglich soll es eigentlich unter allen windowsversionen laufen
|
Re: ordnerfreigabe mit passwort
Moin Remote,
Zitat:
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. |
Re: ordnerfreigabe mit passwort
ich will halt eine eifache ordnerfreigabe im netzwerk mit passwort
|
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. |
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) |
Re: ordnerfreigabe mit passwort
Moin Remote,
von welchem Betriebssystem ist denn hier die Rede? |
Re: ordnerfreigabe mit passwort
also ich hab Me aber wie immer soll es natürlich auch bei allen anderen funzen
|
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. |
Re: ordnerfreigabe mit passwort
Zitat:
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: |
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 ![]() kannst Du auch ein Beispiel finden Oder such' mal selber nach ![]() [/EDIT] |
Re: ordnerfreigabe mit passwort
Zitat:
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. |
Re: ordnerfreigabe mit passwort
Moin Rai,
hast Du Dir mal angeschaut, was die beiden Links in meinem letzten Posting zu Tage fördern? |
Re: ordnerfreigabe mit passwort
Zitat:
Und in einer Nachtschicht ist jetzt folgende Unit entstanden: (Die wesentichen Teile stammen aus der JEDI-API Libary)
Delphi-Quellcode:
Ich hatte leider kurzfristig noch nicht die Möglichkeit unter Win9x/ME zu testen aber XP funktioniert wunderbar.
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. Gruß Rai |
Re: ordnerfreigabe mit passwort
Zitat:
Vielleicht helfen Dir die Prototypen weiter:
Delphi-Quellcode:
Zudem steht in den Strukturen ziemlicher Schrott, die 9x-Version sollte etwa so aussehen:
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';
Delphi-Quellcode:
Und ein Rückgabewert hätte Deiner Funktion auch nicht schaden können :)
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; ps: komisch dass damals in Spotlight niemand meinen kompletten Wrapper fürs Archiv vorgeschlagen hat... nu isses längst nicht mehr zu finden. |
Re: ordnerfreigabe mit passwort
Zitat:
|
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? |
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 |
Re: ordnerfreigabe mit passwort
Zitat:
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:
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 |
Re: ordnerfreigabe mit passwort
Zitat:
Zitat:
Zitat:
Zitat:
Gruss Nico |
Re: ordnerfreigabe mit passwort
Zitat:
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 |
Re: ordnerfreigabe mit passwort
Zitat:
Später vielleicht... Zitat:
|
Re: ordnerfreigabe mit passwort
Zitat:
Zitat:
Danke :) |
Re: ordnerfreigabe mit passwort
Hallo zusammen,
ich habe eine Komponente gefunden ( ![]() 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:
Ich hoffe, das ist nicht zu chaotisch ... bin müde :oops:
(...)
// 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; (...) |
Re: ordnerfreigabe mit passwort
Ok, habe doch eine API-Conversation gefunden: GetSecurityInfo() wird in der unit JwaAclApi.pas der
![]() ![]() |
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 ![]() |
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