Сервісний центр VPSGroup ремонт комп'ютерної техніки, заправка картриджів, ремонт оргтехніки, Київ, Виставковий центр, Васильківська, 55

Підключення мережевого диска за допомогою C #.

Треба було написати невелику утилітки на C #, яка, серед іншого, повинна підключати користувачеві мережеві диски. Завдання виявилося не зовсім тривіальної, оскільки в .Net немає готового інструменту для роботи з мережевими ресурсами.

В результаті пошуків натрапив на рішення, в якому використовуються використовуються функції з комплекту Win32 API - WNetAddConnection2A для підключення і WNetCancelConnection2A для відключення дисків.Ось власне сам код:

using System.Runtime.InteropServices;

public class NetworkDrive
{
private enum ResourceScope
{
RESOURCE_CONNECTED = 1,
RESOURCE_GLOBALNET,
RESOURCE_REMEMBERED,
RESOURCE_RECENT,
RESOURCE_CONTEXT
}
private enum ResourceType
{
RESOURCETYPE_ANY,
RESOURCETYPE_DISK,
RESOURCETYPE_PRINT,
RESOURCETYPE_RESERVED
}
private enum ResourceUsage
{
RESOURCEUSAGE_CONNECTABLE = 0x00000001,
RESOURCEUSAGE_CONTAINER = 0x00000002,
RESOURCEUSAGE_NOLOCALDEVICE = 0x00000004,
RESOURCEUSAGE_SIBLING = 0x00000008,
RESOURCEUSAGE_ATTACHED = 0x00000010
}
private 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
}
[StructLayout (LayoutKind.Sequential)]
private struct NETRESOURCE
{
public ResourceScope oResourceScope;
public ResourceType oResourceType;
public ResourceDisplayType oDisplayType;
public ResourceUsage oResourceUsage;
public string sLocalName;
public string sRemoteName;
public string sComments;
public string sProvider;
}

[DllImport ( "mpr.dll") ]
private static extern int WNetAddConnection2
(ref NETRESOURCE oNetworkResource, string sPassword,
string sUserName, int iFlags);

[DllImport ( "mpr.dll ")]
private static extern int WNetCancelConnection2
(string sLocalName, uint iFlags, int iForce);

public static void MapNetworkDrive (string sDriveLetter, string sNetworkPath)
{
// Checks if the last character is \ as this causes error on mapping a drive.
if (sNetworkPath.Substring (sNetworkPath.Length - 1, 1) == @ "\")
{
sNetworkPath = sNetworkPath.Substring (0, sNetworkPath.Length - 1);
}
NETRESOURCE oNetworkResource = new NETRESOURCE ()
{
oResourceType = ResourceType .RESOURCETYPE_DISK,
sLocalName = sDriveLetter + ":",
sRemoteName = sNetworkPath
};

// If Drive is already mapped disconnect the current
// mapping before adding the new mapping
if (IsDriveMapped (sDriveLetter))
{
DisconnectNetworkDrive (sDriveLetter, true);
}
WNetAddConnection2 (ref oNetworkResource, null, null , 0);
}
public static int DisconnectNetworkDrive (string sDriveLetter, bool bForceDisconnect)
{
if (bForceDisconnect)
{
return WNetCancelConnection2 (sDriveLetter + ":", 0, 1);
}
else
{
return WNetCancelConnection2 (sDriveLetter + ":", 0, 0);
}
}
public static bool IsDriveMapped (string sDriveLetter)
{
string [] DriveList = Environment.GetLogicalDrives ();
for (int i = 0; i {
if (sDriveLetter + ": \\" == DriveList [i] .ToString ( ))
{
return true;
}
}
return false;
}
}

Код для підключення диска:

NetworkDrive.MapNetworkDrive ( "X", @ "\\ unc \ path");

і для відключення:

NetworkDrive.DisconnectNetworkDrive ( "X", true);

Взято звідси.

.