![]() |
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? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:24 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