2009-11-12 4 views
1

Мне нужно записать файл на общий ресурс Windows на компьютере, не являющемся частью домена из ASP.net.доступ к общей папке Windows из ASP.NET

Я попытался реализовать олицетворение как: http://support.microsoft.com/?id=306158, который обертывает вызов LogonUserA api. Однако что-то не работает, и я не знаю, почему. (Кажется, он не дает никакого кода ошибки или сообщения о причине ...)

Я думаю, это потому, что удаленный компьютер НЕ находится в домене. ? Я не знаю.

Я не могу использовать трюк «совпадение локального пользователя/пропуск на обеих машинах», может кто-то помочь?

+0

Вы указываете имя машины при вызове LogonUser? Когда вы указываете учетные данные пользователя, вы также должны указать полномочия, которым принадлежит этот пользователь. Обычно это домен, но в вашем случае это удаленная машина. –

ответ

2

Из моего ответа на этом question, дать этому попытку:

using (new NetworkConnection(@"\\server\read", readCredentials)) 
using (new NetworkConnection(@"\\server2\write", writeCredentials)) { 
    File.Copy(@"\\server\read\file", @"\\server2\write\file"); 
} 

мне понравилось Mark Brackett «s ответа так много, что я сделал свою собственную быструю реализацию. Вот если кто-то еще нуждается в этом в спешке:

public class NetworkConnection : IDisposable 
{ 
    string _networkName; 

    public NetworkConnection(string networkName, 
     NetworkCredential credentials) 
    { 
     _networkName = networkName; 

     var netResource = new NetResource() 
     { 
      Scope = ResourceScope.GlobalNetwork, 
      ResourceType = ResourceType.Disk, 
      DisplayType = ResourceDisplaytype.Share, 
      RemoteName = networkName 
     }; 

     var result = WNetAddConnection2(
      netResource, 
      credentials.Password, 
      credentials.UserName, 
      0); 

     if (result != 0) 
     { 
      throw new Win32Exception(result, "Error connecting to remote share"); 
     } 
    } 

    ~NetworkConnection() 
    { 
     Dispose(false); 
    } 

    public void Dispose() 
    { 
     Dispose(true); 
     GC.SuppressFinalize(this); 
    } 

    protected virtual void Dispose(bool disposing) 
    { 
     WNetCancelConnection2(_networkName, 0, true); 
    } 

    [DllImport("mpr.dll")] 
    private static extern int WNetAddConnection2(NetResource netResource, 
     string password, string username, int flags); 

    [DllImport("mpr.dll")] 
    private static extern int WNetCancelConnection2(string name, int flags, 
     bool force); 
} 

[StructLayout(LayoutKind.Sequential)] 
public class NetResource 
{ 
    public ResourceScope Scope; 
    public ResourceType ResourceType; 
    public ResourceDisplaytype DisplayType; 
    public int Usage; 
    public string LocalName; 
    public string RemoteName; 
    public string Comment; 
    public string Provider; 
} 

public enum ResourceScope : int 
{ 
    Connected = 1, 
    GlobalNetwork, 
    Remembered, 
    Recent, 
    Context 
}; 

public enum ResourceType : int 
{ 
    Any = 0, 
    Disk = 1, 
    Print = 2, 
    Reserved = 8, 
} 

public enum ResourceDisplaytype : int 
{ 
    Generic = 0x0, 
    Domain = 0x01, 
    Server = 0x02, 
    Share = 0x03, 
    File = 0x04, 
    Group = 0x05, 
    Network = 0x06, 
    Root = 0x07, 
    Shareadmin = 0x08, 
    Directory = 0x09, 
    Tree = 0x0a, 
    Ndscontainer = 0x0b 
} 
+0

Работы потрясающие, спасибо. –

1

Мне пришлось сделать это несколько лет назад, и единственный способ, который я смог найти, - это на самом деле отобразить сетевой диск из кода с помощью API WNetAddConnection. Для этого CodeProject имеет managed wrapper, но я не использовал его сам. Это может помочь вам начать.

Смежные вопросы