寫程式透過網路存取Server上的檔案 |
答題得分者是:jackalan
|
tonylong
一般會員 發表:6 回覆:3 積分:1 註冊:2002-11-26 發送簡訊給我 |
|
jackalan
初階會員 發表:20 回覆:88 積分:36 註冊:2003-11-08 發送簡訊給我 |
|
jackalan
初階會員 發表:20 回覆:88 積分:36 註冊:2003-11-08 發送簡訊給我 |
根据您对网络安全的需要来决定,通过目錄設為隱藏分享且權限僅指定給此一帳號可以实现,但可能存在操作系统的要求,因为9X下是不能限定给某一帐号的,就要加密码了,写起来就必须针对9X和NT、2000、xp写两套代码。并且我也写过动态共享的程序,看似简单但处理起来要注意的细节非常的多。9X和NT使用的函数都不一样,参数也很多,感觉用起来不是让人很放心。 因此我建议您使用发送方式,将服务端的图片用流方式发送给客户端,等待编辑好在自动传回个人认为更方便,流传送的速度也很快,传输也非常简单,传送方法KTOP中非常多,可以搜索以下。这个方式好处在于不需要任何共享,SERVER有足够的权利决定是否允许CLIENT进行操作,也很安全。
|
tonylong
一般會員 發表:6 回覆:3 積分:1 註冊:2002-11-26 發送簡訊給我 |
感謝jackalan的回覆,針對幾個問題再向您請教:
引言: 通过目錄設為隱藏分享且權限僅指定給此一帳號可以实现,但可能存在操作系统的要求,因为9X下是不能限定给某一帐号的,就要加密码了,写起来就必须针对9X和NT、2000、xp写两套代码。如果說Server端必定是2000,但client端有98、2000Pro、xp等作業系統,如此也要寫兩套代碼嗎?可否說明需透過哪些函數來完成呢? 引言: 因此我建议您使用发送方式,将服务端的图片用流方式发送给客户端,等待编辑好在自动传回个人认为更方便,流传送的速度也很快,传输也非常简单,传送方法KTOP中非常多,可以搜索以下。这个方式好处在于不需要任何共享,SERVER有足够的权利决定是否允许CLIENT进行操作,也很安全。恕本人愚鈍,這點我不明瞭,看起來像要寫一個有安全管控的木馬程式,可否提供更詳細的說明。 |
jumo
一般會員 發表:33 回覆:65 積分:24 註冊:2002-04-17 發送簡訊給我 |
提供你兩種方式, 看看適不適合你 1.
(1)利用網路芳鄰, 將分享目錄的名字加上$, 如 X$, 這樣在網芳內就看不到, 然後在Client端設定連線磁碟機.
(2)然後檔案就可以直接存取, 如 image1.Picture.LoadFromFile() 2.
(1)設定IIS或是其他網頁伺服器, 用TWebBrowser連上主機抓資料
(2)如果是一般的資料, 可以參考 http://delphi.ktop.com.tw/topic.php?topic_id=20654 這一篇文章, 如果是檔案的話....我還沒試過< > 不管哪種方式, 權限都要規劃好, 不然使用者上去隨便亂改, 就麻煩囉< >
|
tonylong
一般會員 發表:6 回覆:3 積分:1 註冊:2002-11-26 發送簡訊給我 |
感謝jumo的回覆,再向您請教:
引言: 1. (1)利用網路芳鄰, 將分享目錄的名字加上$, 如 X$, 這樣在網芳內就看不到, 然後在Client端設定連線磁碟機. (2)然後檔案就可以直接存取, 如 image1.Picture.LoadFromFile()如果在Client端設定連線磁碟機,使用者不就可以不經程式直接存取檔案了?但我是希望所有使用者一定要透過我寫的程式才能瀏覽、編輯或刪除Server上的檔案。所以一開始的想法是,在Server上將目錄分享但存取權限僅指定給一個特定帳號(至於目錄要不要隱藏並不重要),程式透過特定帳號去存取Server上的檔案,使用者並不知道此一帳號的存在,使用者登入網域時也都以各自的帳號登入,所以對Server上的該目錄並無存取權限,無法利用網芳直接進行存取,只能利用程式存取,在程式中我也會根據不同使用者做出限制。但問題是我不知道要如何利用程式送出該特定帳號去存取Server上的檔案。 引言: 2. (1)設定IIS或是其他網頁伺服器, 用TWebBrowser連上主機抓資料 (2)如果是一般的資料, 可以參考 http://delphi.ktop.com.tw/topic.php?topic_id=20654 這一篇文章, 如果是檔案的話....我還沒試過 >>< face="Verdana, Arial, Helvetica"> 這個方向我再找些資料研究一下。謝謝! |
jackalan
初階會員 發表:20 回覆:88 積分:36 註冊:2003-11-08 發送簡訊給我 |
呵呵,使用动态共享时请务必注意,因为注意事项非常多,下面是针对两个系统使用的函数,函数颇为复杂,类型上的一点点错误都会导致失败,这两个FUNCTION我已经对类型做了正确转换,而且在一个商业软件里使用了很长时间,您可以放心使用: bt/2000/XP下声明如下:
type TNTFunct = function(servername:Widestring; level: DWORD; Buf: PBYTE; parm_err: PDWORD ):Integer; stdcall; type TNShareDel = function(ServerName:Widestring; NetName: Widestring; Reserved: DWord): Integer; StdCall; type TSHARE_INFO_502 = record shi502_netname: PWideChar; shi502_type: DWORD; shi502_remark: PWideChar; shi502_permissions: DWORD; shi502_max_uses: DWORD; shi502_current_uses: DWORD; shi502_path: PWideChar; shi502_passwd: PWideChar; shi502_reserved: DWORD; shi502_security_descriptor: PSECURITY_DESCRIPTOR; end; function ShareResource(ServerName,FilePath,NetName, Remark : string): Integer; var hDll : THandle; ShInfo: TSHARE_INFO_502; parm_err:PDWORD; _FilePath,_NetName, _Remark : PWideChar; _ServerName : Pchar ; MyNTFunct: TNTFunct; MyStr1,MyStr2 : String; begin hDll := LoadLibrary('Netapi32.DLL'); if hDll > 32 then begin NetName := Lowercase(NetName); MyNTFunct := GetProcAddress(hDll,'NetShareAdd'); MyStr1 := trim(FilePath); MyStr2 := trim(NetName); GetMem(_FilePath,255); GetMem(_NetName,255); StringToWideChar(MyStr1,_FilePath,255); //字符串转换,一定要转换正确 StringToWideChar(MyStr2,_NetName,255); //开始创建结构 with ShInfo do begin shi502_netname := _NetName; shi502_type := STYPE_DISKTREE ; shi502_remark := nil ; shi502_max_uses := $FFFFFFFF; shi502_current_uses := 10; shi502_path := _FilePath; shi502_passwd := nil; shi502_reserved := 0; shi502_security_descriptor := nil; shi502_permissions := ACCESS_ALL; end; try Result := MyNTFunct('',502,@ShInfo,nil); Finally //释放内存 FreeMem(_FilePath,255); FreeMem(_NetName,255); end; end; end;9x下: Function SetShareFor9x(DirPath,ShareName:string):boolean; Function SetShareFor9x(DirPath,ShareName:string):boolean; const LM20_NNLEN = 12; SHPWLEN = 8; SHI50F_RDONLY = 1; SHI50F_FULL = 2; SHI50F_DEPENDSON = (SHI50F_RDONLY or SHI50F_FULL); SHI50F_ACCESSMASK = (SHI50F_RDONLY or SHI50F_FULL); SHI50F_PERSIST = 256; SHI50F_SYSTEM = 512; STYPE_DISKTREE = 0; ACCESS_NONE = 0; 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_ALL = (ACCESS_READ or ACCESS_WRITE or ACCESS_CREATE or ACCESS_EXEC or ACCESS_DELETE or ACCESS_ATRIB or ACCESS_PERM); type share_info_2= record shi2_netname : PWideChar; shi2_type : DWORD; shi2_remark : PWideChar; shi2_permissions : DWORD; shi2_max_uses : DWORD; shi2_current_uses : DWORD; shi2_path : PWideChar; shi2_passwd : PWideChar; end; share_info_50 = packed record shi50_netname : array [0..LM20_NNLEN] of Char; shi50_type : Byte; shi50_flags : Short; shi50_remark : PChar; shi50_path : PChar; shi50_rw_password: array [0..SHPWLEN] of Char; shi50_ro_password: array [0..SHPWLEN] of Char; end; var hDll : THandle; NetShareAddWin9x : function(pszServer : PChar; sLevel : Short; pbBuffer : Pointer; cbBuffer : Short):DWORD;stdcall; NetShareDelWin9x : Function(pszServer : PChar; pszNetName : PChar; usReserved : Short):DWORD;stdcall; si50 : share_info_50; si2 : share_info_2; tamano : Short; err : DWORD; EsNT: Boolean; Begin try result := false; if trim(DirPath)='' then exit; if Not DirectoryExists(DirPath) Then exit; if trim(ShareName)='' then exit; hDll := LoadLibrary('SvrApi.dll'); if hDll > 32 then begin NetShareAddWin9x := GetProcAddress(hDll, 'NetShareAdd'); tamano := sizeof(si50); FillChar(si50,tamano,0); StrCopy(si50.shi50_netname,Pchar(ShareName)); si50.shi50_type := STYPE_DISKTREE; si50.shi50_flags := SHI50F_Full; //SHI50F_RDONLY; si50.shi50_path := Pchar(DirPath); result := NetShareAddWin9x(pchar(''),50,@si50,tamano)=0; FreeLibrary(hDll); end; except result := false; FreeLibrary(hDll); end; End; |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |