全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1957
推到 Plurk!
推到 Facebook!

寫程式透過網路存取Server上的檔案

答題得分者是:jackalan
tonylong
一般會員


發表:6
回覆:3
積分:1
註冊:2002-11-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-04-27 16:39:59 IP:61.30.xxx.xxx 未訂閱
小弟想寫一個程式,client端只能透過程式瀏覽或編輯存放在server上的圖文檔,不可直接從網路芳鄰去存取,本人目前的想法是server上開一個帳號,並將server上的檔案目錄設為隱藏分享且權限僅指定給此一帳號,然後不論哪一個使用者執行程式都是用此一帳號存取Server上的檔案,在程式中我會再根據不同使用者來限定可執行項目。不知這樣的構想是否可行,該如何實作呢?如不可行是否有其他方法呢?請各位先進能指導一下。謝謝!
jackalan
初階會員


發表:20
回覆:88
積分:36
註冊:2003-11-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-04-27 20:50:00 IP:221.226.xxx.xxx 未訂閱
。 發表人 - jackalan 於 2004/04/27 20:55:22
jackalan
初階會員


發表:20
回覆:88
積分:36
註冊:2003-11-08

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-04-27 20:53:00 IP:221.226.xxx.xxx 未訂閱
根据您对网络安全的需要来决定,通过目錄設為隱藏分享且權限僅指定給此一帳號可以实现,但可能存在操作系统的要求,因为9X下是不能限定给某一帐号的,就要加密码了,写起来就必须针对9X和NT、2000、xp写两套代码。并且我也写过动态共享的程序,看似简单但处理起来要注意的细节非常的多。9X和NT使用的函数都不一样,参数也很多,感觉用起来不是让人很放心。 因此我建议您使用发送方式,将服务端的图片用流方式发送给客户端,等待编辑好在自动传回个人认为更方便,流传送的速度也很快,传输也非常简单,传送方法KTOP中非常多,可以搜索以下。这个方式好处在于不需要任何共享,SERVER有足够的权利决定是否允许CLIENT进行操作,也很安全。
tonylong
一般會員


發表:6
回覆:3
積分:1
註冊:2002-11-26

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-04-28 08:55:02 IP:61.30.xxx.xxx 未訂閱
感謝jackalan的回覆,針對幾個問題再向您請教:    
引言: 通过目錄設為隱藏分享且權限僅指定給此一帳號可以实现,但可能存在操作系统的要求,因为9X下是不能限定给某一帐号的,就要加密码了,写起来就必须针对9X和NT、2000、xp写两套代码。
如果說Server端必定是2000,但client端有98、2000Pro、xp等作業系統,如此也要寫兩套代碼嗎?可否說明需透過哪些函數來完成呢?
引言: 因此我建议您使用发送方式,将服务端的图片用流方式发送给客户端,等待编辑好在自动传回个人认为更方便,流传送的速度也很快,传输也非常简单,传送方法KTOP中非常多,可以搜索以下。这个方式好处在于不需要任何共享,SERVER有足够的权利决定是否允许CLIENT进行操作,也很安全。
恕本人愚鈍,這點我不明瞭,看起來像要寫一個有安全管控的木馬程式,可否提供更詳細的說明。
jumo
一般會員


發表:33
回覆:65
積分:24
註冊:2002-04-17

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-04-28 09:47:44 IP:203.204.xxx.xxx 未訂閱
提供你兩種方式, 看看適不適合你    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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-04-28 13:55:23 IP:61.30.xxx.xxx 未訂閱
感謝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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-04-28 20:08:10 IP:218.2.xxx.xxx 未訂閱
呵呵,使用动态共享时请务必注意,因为注意事项非常多,下面是针对两个系统使用的函数,函数颇为复杂,类型上的一点点错误都会导致失败,这两个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;    
系統時間:2024-05-04 4:25:54
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!