2009-09-17 8 views
8

Tôi có một ứng dụng biểu mẫu cửa sổ đang chạy trên một máy không có trên miền, cần phải di chuyển tệp từ hệ thống tệp cục bộ sang đường dẫn UNC. Tôi có tên người dùng và mật khẩu cho đường dẫn đó. Tôi đã tự hỏi là có cách nào để làm điều này trực tiếp với ra thực hiện lệnh net.exe?Làm cách nào để truy cập vào một tệp chia sẻ theo chương trình

Lý tưởng nhất là tôi sẽ không phải lập bản đồ ổ đĩa.

Trả lời

4

Câu trả lời được chấp nhận cho câu hỏi này here có vẻ như đáng xem xét; nó cho thấy sử dụng chức năng API Win32 WNetUseConnection.

Từ MSDN:

Các WNetUseConnection chức năng làm cho một kết nối tới một tài nguyên mạng. Chức năng có thể chuyển hướng thiết bị cục bộ đến tài nguyên mạng.

Điều này dường như hoàn thành những gì bạn đang tìm kiếm, không đề cập đến số net.exe. Không giúp đỡ à?

+0

Thanks for the tip tôi sẽ có một cái nhìn vào nó. Tôi phải tự hỏi tại sao không có cái gì đó tương tự đã có trong NET mặc dù. – Mykroft

1

Tôi nghĩ rằng bạn sẽ cần ánh xạ một ổ đĩa. Tôi chưa tìm cách nào xung quanh nó. Tuy nhiên, xem bài này: Câu trả lời

Asp.net Access To Network Share

của người khác đã được chấp nhận, nhưng tôi có mã đăng tải trong câu trả lời khác cho đơn giản hóa một ổ đĩa mạng.

0

Hãy xem this bài đăng. Nó sử dụng P/Invoke để gọi Win32 API LogonUser() và bạn bè. Ngoài ra còn có một số mã ví dụ được cung cấp.

11

Bạn có thể sử dụng WNetAddConnection để thực hiện việc này. Bạn sẽ phải pInvoke. mã dưới đây làm việc cho tôi sau khi tôi thiết lập các khai báo pInvoke. Khối thứ hai của mã (bên dưới) chứa các khai báo pInvoke - chỉ cần gắn nó vào trong một lớp.

 

     public static void CopyFile(string from, string shareName, string username, string password) 
     { 
      NETRESOURCE nr = new NETRESOURCE(); 
      nr.dwType = ResourceType.RESOURCETYPE_DISK; 
      nr.lpLocalName = null; 
      nr.lpRemoteName = shareName; 
      nr.lpProvider = null; 

      int result = WNetAddConnection2(nr, password, username, 0); 
      System.IO.File.Copy(from, System.IO.Path.Combine(shareName, System.IO.Path.GetFileName(from))); 
     } 

 

Bạn sẽ cần dán mã hỗ trợ sau vào một lớp học (được lấy từ pInvoke.Net). Hãy chắc chắn để thêm một Statment sử dụng để mã của bạn:

using System.Runtime.InteropServices 
 

     [DllImport("Mpr.dll", EntryPoint = "WNetAddConnection2", CallingConvention = CallingConvention.Winapi)] 
     private static extern int WNetAddConnection2(NETRESOURCE lpNetResource, string lpPassword, 
             string lpUsername, System.UInt32 dwFlags); 

     [StructLayout(LayoutKind.Sequential)] 
     private class NETRESOURCE 
     { 
      public ResourceScope dwScope = 0; 
      public ResourceType dwType = 0; 
      public ResourceDisplayType dwDisplayType = 0; 
      public ResourceUsage dwUsage = 0; 
      public string lpLocalName = null; 
      public string lpRemoteName = null; 
      public string lpComment = null; 
      public string lpProvider = null; 
     }; 

     public enum ResourceScope 
     { 
      RESOURCE_CONNECTED = 1, 
      RESOURCE_GLOBALNET, 
      RESOURCE_REMEMBERED, 
      RESOURCE_RECENT, 
      RESOURCE_CONTEXT 
     }; 

     public enum ResourceType 
     { 
      RESOURCETYPE_ANY, 
      RESOURCETYPE_DISK, 
      RESOURCETYPE_PRINT, 
      RESOURCETYPE_RESERVED 
     }; 

     public enum ResourceUsage 
     { 
      RESOURCEUSAGE_CONNECTABLE = 0x00000001, 
      RESOURCEUSAGE_CONTAINER = 0x00000002, 
      RESOURCEUSAGE_NOLOCALDEVICE = 0x00000004, 
      RESOURCEUSAGE_SIBLING = 0x00000008, 
      RESOURCEUSAGE_ATTACHED = 0x00000010, 
      RESOURCEUSAGE_ALL = (RESOURCEUSAGE_CONNECTABLE | RESOURCEUSAGE_CONTAINER | RESOURCEUSAGE_ATTACHED), 
     }; 

     public enum ResourceDisplayType 
     { 
      RESOURCEDISPLAYTYPE_GENERIC, 
      RESOURCEDISPLAYTYPE_DOMAIN, 
      RESOURCEDISPLAYTYPE_SERVER, 
      RESOURCEDISPLAYTYPE_SHARE, 
      RESOURCEDISPLAYTYPE_FILE, 
      RESOURCEDISPLAYTYPE_GROUP, 
      RESOURCEDISPLAYTYPE_NETWORK, 
      RESOURCEDISPLAYTYPE_ROOT, 
      RESOURCEDISPLAYTYPE_SHAREADMIN, 
      RESOURCEDISPLAYTYPE_DIRECTORY, 
      RESOURCEDISPLAYTYPE_TREE, 
      RESOURCEDISPLAYTYPE_NDSCONTAINER 
     };