PDA

View Full Version : Vấn đề hơi lạ một chút trong C#. Cao thủ nào chỉ giáo dùm ?



quanlh
30-06-2005, 08:33
Mình đang viết một cái Window Service sử dụng C#. Mọi thứ đều ổn duy chỉ có một vấn đề như sau.

Đó là copy file từ một ổ đĩa mạng (Map Network Driver)

Trong service, tôi muốn copy file từ một ổ đĩa mạng về máy của mình (máy chạy cái service của tôi) nhưng không copy được, nó luôn thông báo là không tìm thấy file, mặc dù file này hoàn toàn tồn tại.

Nhưng cũng file đó, ổ đĩa mạng đó, nếu tôi không gọi lệnh copy file trong service mà gọi lệnh copy file từ một cái form bình thường trong C#, thì nó lại thực hiện ngon lành.

Không biết là trong service thì có gì khác với một ứng dụng thông thường hay không mà lại bị như vậy. Lưu ý là, nếu copy file không phải từ ổ đĩa mạng, mà là từ ổ đĩa cứng trên máy tính chạy service đó thì trong service vẫn copy được ngon lành.

Cám ơn các bạn đã đọc tin

gianhut
02-07-2005, 14:31
à, thường thì trong mạng LAN nó có dạng như sau: \\pc-name\folder\file.tmp

BẠn có gõ là "\\\\pc-name\\folder\\file.tmp" ko vậy? Mình nghĩ wài chỉ ra cái khả năng này thôi

quanlh
03-07-2005, 08:49
Nếu đơn giản như vậy thì tui hỏi làm gì chứ, trong C chứ không riêng gì C# đều phải làm vậy rồi. Tôi còn map nó thành ổ đĩa mạng rồi mà còn không copy được cơ, vấn đề ở đây có lẽ liên quan đến security, nhưng mình chưa biết cách xử lý thế nào

bienca101
03-07-2005, 14:52
Bạn có thể upload source được kô? Nếu bất tiện thì email cho mình. Mình muốn thử xem sao. Cứ an tâm là thử xong xóa liền, ko có chôm đâu :)

quanlh
04-07-2005, 09:07
Mình upload lên đây bản test thử việc copy file thôi. Bởi vì nếu gửi đầy đủ phần của mình lên thì nhiều thứ linh tinh quá. Liên quan cả đến một cái client bên VB nữa. Nếu bạn muốn cho mình mail, mình sẽ gửi cho, upload lên đây thì chỉ file nho nhỏ thôi

Chạy cmd, gõ lệnh installutil Đường_dẫn\Realese\WindowsService1.exe để cài đặt service này vào window. Mình để default là Manual, bạn vào Service, tìm service có tên là Service to test để start nó lên. Sau đó mở logfile ở ổ C: ra để xem thông báo lỗi.

installutil /u Đường_dẫn\Realese\WindowsService1.exe để remove service này khỏi window

nguoikicuc
04-07-2005, 09:37
Bạn bị lỗi về security rồi. Có 2 cách để giải quyết:

1/ Mount network drive vô computer có webservice running, như vậy webservice sẽ access drive đó dưới dạng "E:\\thu_muc\\ten_file"

2/ Vì đó là network drive, webservice user (user mà webservice dùng để run) sẽ không có đủ permissions. Bạn phải grant access cho user này trên network drive đó

Chúc may mắn.

quanlh
04-07-2005, 10:29
Ông bạn kì cục này nói đúng đó, mình cũng thấy là mình bị dính security. Mình đã map thử ổ đĩa rồi, cũng không copy được. Mình viết đây không phải là web service, mà là service của window, Cotrol Panel - Administrative Tools - Service. User của service mà window sử dụng để chạy thì mình cũng chưa tìm ra nó là cái user nào, mình đã thử mấy user có tên là system, service rồi nhưng đều không ăn thua.

Các bạn có chiêu nào hay hơn không ?

harzix
04-07-2005, 11:47
Mấy pác cải nhau làm gì? Security hay cái gì đó làm gì???!!!
Hehehe... lúc thiết kế Windows Service pác Microsoft không cho chúng ta access tài nguyên ngoài hệ thống(nếu pác nào vượt wa được hãy chỉ mình !!!). MSDN có nói như thế đấy.

Giải fáp là hãy viết riêng phần truy nhập tài nguyên bên ngoài (ví dụ: C++, C#umanage code...).

Xin nhắc lại các pác nhé, không phải secur đâu, mà là limit thui.

quanlh
04-07-2005, 13:40
He he, thế mà chả nói sớm. Mình cũng đã nghĩ đến cái kiểu này rồi, làm một cái exe chạy ngoài sau đó trong service gọi cái exe đó. Nhưng mà nghĩ đi nghĩ lại thấy cái giải pháp đấy "hơi chuối". Nhưng nếu như trong window hạn chế service như vậy thì có lẽ là giải pháp "chuối" cũng phải làm thôi.

Cám ơn các bạn nhé

PS: Nhưng mà này ông bạn harzix ơi, nếu mình gọi các ứng dụng bên ngoài từ trong service thì nó vẫn lấy context của service, tức là cũng không truy cập được tài nguyên ngoài hệ thống. Mà trong service thì mình cần phải, ít nhất là cũng gọi được cái ứng dụng truy cập được tài nguyên ngoài hệ thống.

Chỉ giúp được không, mình mất thời gian với nó nhiều quá rồi, mà không làm được nó thì không xong việc.

nguoikicuc
05-07-2005, 10:20
Tối buồn ngủ nên nhin lộn windows service thành web service. Nếu bạn nói rõ hơn 1 tí về project của bạn thì mọi người không chừng có thể góp ý kiến được. Thay vì làm windows service thì có thể làm khác đi được không? Tại sao phải đọc files từ network drives? vân vân...

harzix
05-07-2005, 12:29
Nếu bạn thực sự muốn dùng Window Service và muốn đọc file (nói chung các thao tác ảnh hưởng đến máy khác trong mạng), hoặc là bạn viết bằng C++ (không trên .NET) dùng WinAPI, hoặc nếu nuốn dùng .NET (tất nhiên là có Window Service- nếu bạn đang viết firmware, hardware driver...) thì bạn có thể dùng cách "củ chuối" sau (theo mình nghĩ có thể làm được!):
- Dùng .NET remoting (ex. TCPListener, TCPClient)
+ Tạo một process listen ở một Port nào đó (TCPListener) để nhận message từ window service.
+ Khi window service cần thực hiện thao tác, message đến Port của process.

Chúc thành công,

quanlh
06-07-2005, 22:12
Mình đã dùng đủ mọi cách rồi, viết service bằng C++, dùng unmanagecode mà vẫn không được, nhân đây mình sẽ trình bày toàn cảnh cả hệ thống cùng cái dự án của mình để các bạn tham khảo và cho ý kiến, sẽ hơi dài đấy.

Cơ quan mình là một công ty con (CTC) trực thuộc một Tổng công ty (TCT). Nó có 1 mạng LAN riêng và nằm trong hệ thống mạng WAN nối với nhau bằng các đường truyền cáp quang hoặc lease line. Mạng LAN của mình có 1 application server và 3 cái database server. 1 cái chạy Oracle trên UNIX, 1 cái chạy SQL 2000 trên Win 2003 và 1 cái chạy Foxpro 2.6 trên Netware. Các bạn chớ có thắc mắc tại sao lại có nhiều loại database và HĐH như vậy vì nó là lịch sử từ “ngàn xưa” để lại, không thể thay đổi được. Các mạng LAN của các CTC không được nối trực tiếp với nhau, mà tất cả đều nối tập trung về các server nằm trên TCT, do đó chỉ các server trên TCT là có thể truy cập vào các mạng LAN của CTC và các CTC cũng chỉ có thể truy cập vào các máy chủ trên TCT, còn các CTC không thể truy cập lẫn nhau. Việc trao đổi thông tin giữa các CTC là thông qua các ứng dụng trên server của TCT, rất nhiều loại, FTP server, Email server, Web server ...

Còn cái dự án của mình như sau: Công ty mình cần công bố 1 số dữ liệu nằm trong các file dbf của Foxpro 2.6 trên Netware. Mà các số liệu này cần cung cấp 1 cách online (tức thời), cho nên nếu dùng kiểu email hay ftp thì không được mà phải dùng Web thôi. Nhưng do các CTC không thể nhìn thấy nhau nên mình phải xây dựng 1 Website sau đó kiếm 1 chỗ trên Web server của TCT, họ sẽ cho mình 1 cái link sang Web của mình và tất cả các CTC khác có thể truy cập được. Từ trong trang Web, mình sẽ gọi đến 1 cái thư viện, tạm gọi là client, client này sẽ gửi 1 message về Application Server trong mạng LAN của mình thông qua mạng WAN. Trong cái App server này sẽ có 1 cái service, nó sẽ đón các message do cái client kia gửi về, phân tích cái message này, dựa vào đó để sục vào cái Foxpro trên Netware lấy dữ liệu rồi gửi trả về cho client cũng dưới dạng message. Trên App server có 1 ổ đĩa mạng map các file dữ liệu được share trên Netware. App server sẽ đọc dữ liệu từ ổ đĩa mạng này. Vấn đề là service không cho phép truy cập tài nguyên ngoài hệ thống nên mình không sao lấy dữ liệu từ Netware được. Đấy là cái vấn đề mà mình chưa giải quyết được.

Các bạn có giải pháp nào không ?

PS: Rất cảm ơn các bạn đã “kiên nhẫn” đọc

haughtycool
12-08-2005, 15:36
HIiiiiiiii, Hay là xây dựng hệ thống file phân bố?

milkpig86
05-11-2007, 21:07
Làm ơn ai giai thich dùm mình Windown Service dung de lam j ko? minh ko hiểu về nó lắm. ^-^ thanks

haughtycool
07-11-2007, 15:06
Tui biết cách nè, bạn còn cần không?
Đây là vấn đề về sercurity, cần phải dùng C++ làm

haughtycool
07-11-2007, 15:07
Tui biết cách nè, bạn còn cần không?
Đây là vấn đề về sercurity, cần phải dùng C++ làm

haughtycool
07-11-2007, 15:37
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=958729&SiteID=1 <= Thử coi, không được thì PM tui, tui còn 1 cách khác mà source để trên công ty rồi