سلام
پیشنهاد اولم آن است که از همان MapDrive استفاده کنید و مدیریت این جزییات را به ویندوز واگذار کنید.
هم میتوانید از دیالوگ مربوطه در MyComputer استفاده کنید و هم از خط فرمان net use استفاده کنید.
حتی می توانید فرمان را با CSharp وتابع Process.Start هم اجرا کنید !
برقراری نگاشت
NET USE Z: \\SERVER_NAME_OR_IP\ROOT /USER:username password /PERSISTENT:YES
لغو نگاشت
NET USE Z: /DELETE
البته باید در خصوص اجرای RunAsAdmin فرمان فوق دقت کنید و تحت همان مجوزی آن را اجرا کنید که برنامه قرار است اجرا شود.
ولی اگر به کار بدون MapDrive مصر هستید ، برای احراز هویت باید از تابع WNetAddConnection2 (
لینک 1
و
لینک 2
) استفاده کنید.
که معمولا افراد یک کلاس کوچک دستی به نام NetworkConnection می سازند تا این امر را انجام دهد.
using System.Runtime.InteropServices;
public class NetworkConnection
: IDisposable
{
[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);
private readonly string m_Path;
public NetworkConnection(string path, string user, string pass)
{
this .m_Path = path;
var netResource = new NetResource()
{
Scope = 0x2, //GlobalNetwork
ResourceType = 0x1, //Disk
DisplayType = ResourceDisplaytype.Share,
RemoteName = this.m_Path
};
int result = WNetAddConnection2(
netResource,
pass,
user,
0);
if (result == 0) return ;
throw new System.ComponentModel.Win32Exception(result);
}
protected virtual void Dispose(bool disposing)
{
WNetCancelConnection2(this .m_Path, 0, true );
}
public void Dispose()
{
this .Dispose(true );
GC.SuppressFinalize(this );
}
~NetworkConnection()
{
this .Dispose(false );
}
[StructLayout(LayoutKind.Sequential)]
public class NetResource
{
public int Scope;
public int ResourceType;
public ResourceDisplaytype DisplayType;
public int Usage;
public string LocalName;
public string RemoteName;
public string Comment;
public string Provider;
}
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
}
}
که با کدی شبیه این قابل استفاده خواهد بود:
using (new NetworkConnection(@"\\SERVER_NAME_OR_IP\ROOT", "username", "password" ))
{
System.IO.Directory.CreateDirectory(@"\\SERVER_NAME_OR_IP\ROOT\New Folder1" ) ;
System.IO.Directory.Move(@"\\SERVER_NAME_OR_IP\ROOT\New Folder1", @"\\SERVER_NAME_OR_IP\ROOT\New Folder2" ) ;
System.IO.File.WriteAllText(@"\\SERVER_NAME_OR_IP\ROOT\New Folder2\file.txt", "HELLO!" ) ;
}