2009-11-12 4 views
1

Je dois écrire un fichier sur un partage Windows sur un ordinateur ne faisant pas partie d'un domaine ASP.net.accéder à un partage Windows à partir d'ASP.NET

J'ai essayé d'implémenter l'emprunt d'identité comme: http://support.microsoft.com/?id=306158 qui encapsule l'appel API LogonUserA. Quelque chose ne fonctionne pas, et je ne sais pas pourquoi. (Il ne semble pas donner de code d'erreur ou de message de raison ...)

Je pense que c'est parce que l'ordinateur distant n'est pas sur un domaine. ? Je ne sais pas.

Je ne peux pas utiliser l'astuce "correspondant à l'utilisateur local/transmettre aux deux machines", quelqu'un peut-il m'aider?

+0

Spécifiez-vous le nom de la machine lorsque vous appelez LogonUser? Lorsque vous spécifiez les informations d'identification de l'utilisateur, vous devez également spécifier l'autorité à laquelle cet utilisateur appartient. Normalement, l'autorité est un domaine, mais dans votre cas c'est la machine distante. –

Répondre

2

De ma réponse sur cette question, pour cette solution:

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

J'ai bien aimé la réponse de Mark Brackett tellement que je l'ai fait ma propre mise en œuvre rapide. Le cas échéant, si quelqu'un d'autre en a rapidement besoin:

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

Fonctionne génial, merci. –

1

Je devais le faire il y a quelques années et la seule façon que j'ai pu trouver était de mapper réellement le lecteur réseau du code en utilisant l'API WNetAddConnection. CodeProject a un managed wrapper pour cela, mais je ne l'ai pas utilisé moi-même. Cela pourrait vous aider à démarrer.

Questions connexes