Share folder dengan Delphi
April 7, 2008 at 1:44 pm | Posted in Applications, Code Samples, Tutorials | 6 CommentsTags: delphi, netapi32.dll, netshareadd, netsharedel
oleh Zamrony P. Juhara
Hari ini ada pertanyaan menarik yang diajukan oleh member milis Delphindo mengenai bagaimana membuat dan menghapus shared folder dengan Delphi. Berhubung saya tidak terlalu sibuk dan belum pernah membuatnya, saya jadi tergelitik untuk melakukannya. Setelah browsing cari informasi sana-sini akhirnya saya tahu cara melakukannya. Dan inilah tutorial singkatnya.
Sekilas NetAPI32.dll
Fungsi-fungsi memanipulasi network dibungkus dalam DLL bernama NetAPI32.dll. Untuk hal-hal terkait sharing resource (folder, printer, communication device dan lain-lain), tersedia fungsi NetShareAdd(), NetShareDel(), NetShareEnum(),NetShareCheck().
Ok kita hanya akan fokus bagaimana membuat shared folder dan menghapusnya. Oleh karena itu saya hanya akan menjelaskan cara penggunaan NetShareAdd() dan NetShareDel().
Membuat Shared Folder
Untuk menjadikan sebuah folder menjadi shared folder, Anda menggunakan NetShareAdd(). AFAIK, Delphi belum menyediakan unit header untuk NetAPI32.dll sehingga Anda perlu membuat unit header dimana deklarasi NetShareAdd() dan NetShareDel() ditempatkan,. Untungnya Anda tidak perlu pusing. Unit bernama netapi32.pas yang saya buat sudah cukup untuk mengkompilasi demo yang akan kita buat.
Deklarasi fungsi NetShareAdd() adalah sebagai berikut:
function NetShareAdd(ServerName : PWideChar; Level : DWORD; buf : Pointer; parm_err:PDWORD):NET_API_STATUS; stdcall;
Parameter ServerName adalah nama server dimana shared folder akan dibuat. Parameter ini bisa diisi dengan nama komputer atau IP address. Contoh nama komputer saya \\zamrony.
Parameter Level menentukan tipe informasi yang akan dilewatkan ke parameter buf. Bila diisi 2 maka buf diasumsikan bertipe pointer ke struktur data SHARE_INFO_2. Deklarasi record ini adalah seperti listing dibawah ini:
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; PSHARE_INFO_2 = ^SHARE_INFO_2;
Jika Level diisi 502, buf diasumsikan berisi pointer ke record SHARE_INFO_502 yang deklarasinya adalah sebagai berikut:
SHARE_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:PSecurityDescriptor; end; PSHARE_INFO_502 = ^SHARE_INFO_502;
Apa bedanya? SHARE_INFO_502 berisi informasi lebih advance terutama dengan adanya security descriptor yang utamanya digunakan pada sistem NT. Saya menggunakan XP, dan SHARE_INFO_2 sudah cukup bagi saya.
Parameter terakhir adalah parm_err, akan diisi dengan status kesalahan. Saya tidak butuh jadi cukup saya isi dengan nil.
Ok mari kita bicarakan field-field pada SHARE_INFO_2.
Field pertama shi2_netname harus diisi dengan nama shared folder tersebut. Contoh jika kita ingin sebuah folder diakses lewat network dengan alamat \\zamrony\data_penting. Maka shi_netname diisi dengan data_penting.
Field kedua shi2_type diisi dengan tipe resource yang akan di-share. Untuk folder, Anda menggunakan STYPE_DISKTREE. Potongan kode berikut ini berisi daftar tipe-tipe resource.
const STYPE_DISKTREE =0; STYPE_PRINTQ =1; STYPE_DEVICE =2; STYPE_IPC =3;
Field shi3_remark diisi dengan deksripsi singkat folder yang di-share. Deskripsi ini akan ditampilkan ketika kursor mouse berada di atas shared folder.
Field berikutnya adalah shi2_permissions. Field ini harus diisi dengan level akses yang diinginkan apakah read-only, read-write atau lainnya. Kode berikut berisi daftar akses yang dapat diberikan ke shared folder.
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);
Field shi2_max_uses diisi dengan jumlah koneksi maksimum yang diijinkan.
Field shi2_current_uses diisi dengan jumlah koneksi saat ini.
Field shi2_path diisi dengan nama folder yang akan di-share. Contoh c:\\Downloads\data_penting.
Field terakhir adalah shi2_passwd berisi password yang digunakan untuk mengakses folder tersebut lewat network. Jika tidak ingin menggunakan password, isi dengan nil.
Contoh kode berikut ini akan menciptakan shared folder berdasarkan input user.
procedure TForm1.btnAddShareClick(Sender: TObject); var shareInfo:SHARE_INFO_2; servername,netname,path,pass:widestring; status:NET_API_STATUS; begin netname:=edShareName.Text; servername:=edServerName.Text; path:=edPath.Text; pass:=edPassword.Text; zeroMemory(@shareInfo,sizeof(SHARE_INFO_2)); //set nama sharing shareInfo.shi2_netname:=PWideChar(netname); //share folder shareInfo.shi2_type:=STYPE_DISKTREE; //keterangan folder yg disharing shareInfo.shi2_remark:=PWideChar('sharing folder '+netname); //atur permisssion if chkbxAccessRead.Checked then shareInfo.shi2_permissions:=shareInfo.shi2_permissions or ACCESS_READ; if chkbxAccessWrite.Checked then shareInfo.shi2_permissions:=shareInfo.shi2_permissions or ACCESS_WRITE; if chkbxAccessExec.Checked then shareInfo.shi2_permissions:=shareInfo.shi2_permissions or ACCESS_EXEC; if chkbxAccessCreate.Checked then shareInfo.shi2_permissions:=shareInfo.shi2_permissions or ACCESS_CREATE; if chkbxAccessDelete.Checked then shareInfo.shi2_permissions:=shareInfo.shi2_permissions or ACCESS_DELETE; if chkbxAccessAttrib.Checked then shareInfo.shi2_permissions:=shareInfo.shi2_permissions or ACCESS_ATRIB; if chkbxAccessPerm.Checked then shareInfo.shi2_permissions:=shareInfo.shi2_permissions or ACCESS_PERM; if chkbxAccessAll.Checked then shareInfo.shi2_permissions:=shareInfo.shi2_permissions or ACCESS_ALL; shareInfo.shi2_max_uses:=strtoint(edMaxUser.Text); shareInfo.shi2_current_uses:=0; shareInfo.shi2_path:=PWideChar(path); //tanpa password shareInfo.shi2_passwd:=PWideChar(pass); status:=NetShareAdd(PWideChar(servername),2,@shareInfo,nil); if status<>NERR_SUCCESS then raise Exception.Create('Gagal membuat share'); end;
Pada contoh di atas status bertipe NET_API_STATUS. Tipe ini pada dasarnya adalah tipe DWORD. Ada beberapa bagian dikode tersebut dimana saya mengkopi data dari string ke widestring. Konversi dari Ansi string ke Unicode akan dikerjakan otomatis. Ini untuk memastikan bahwa string yang di-typecast ke PWideChar berisi pointer ke string Unicode.
Menghapus Shared Folder
Untuk menghapus shared folder. Caranya lebih simple. Anda hanya membutuhkan nama server dimana shared folder tersebut berada dan nama sharingnya. Berikut ini adalah deklarasi NetShareDel() yang berfungsi menghapus shared folder.
function NetShareDel(ServerName: PWideChar; NetName : PWideChar; Reserved : DWORD):NET_API_STATUS; stdcall;
Contoh untuk menghapus shared folder yang datanya diinputkan oleh user.
procedure TForm1.btnDeleteShareClick(Sender: TObject); var servername,netname:widestring; status:NET_API_STATUS; begin netname:=edShareName.Text; servername:=edServerName.Text; status:=NetShareDel(PWideChar(servername), PWideChar(netName),0); if status<>NERR_SUCCESS then raise Exception.Create('Gagal menghapus share'); end;
Penutup
Ok cukup sederhana kan? Untuk source code demo lengkap bagaimana menciptakan shared folder di Delphi, silakan download di sini. Demo ditulis dengan kompiler Turbo Delphi Explorer 2006.
6 Comments »
RSS feed for comments on this post. TrackBack URI
Leave a reply to tyo Cancel reply
Blog at WordPress.com.
Entries and comments feeds.
article yang bagus, keep it flow bro ….
Comment by pozlast— July 15, 2008 #
Pak Zamrony, saya sudah coba code dari bapak, tapi setelah itu saya mencoba buka share folder yang telah dibuat, dari komputer lain ternyata muncul “Folder is not accessible. You might not have permission to use this network resource. Contact the administrator of this server to find out you have access permissions”. Itu kenapa ya pak?
tks,.
Comment by widy— September 11, 2008 #
fungsi dari Resource sharing
Comment by ahmadi— April 2, 2009 #
pak,,mau tanya..
klo ngebuka share folder,,tp kan ada hak aksesnya..
nah cara nanem username n password di delphi nya gimana yah??
mohon pencerahannya..makasih pak..^_^..
Comment by inrdi— July 9, 2010 #
pak clo misalnya saya ingin mengirim file ke komputer lain melalui jaringan LAN gmana caranya?
Comment by tyo— May 11, 2011 #
pak Zamrony, untuk source code demo lengkap sudah tidak valid. bisa diinfo supaya saya bisa download. terima kasih š
Comment by widy— November 20, 2011 #