Здравствуйте.
Скажите, пожалуйста каким образом можно подключить сетевой диск в C#, а потом еще и поменять имя тома? Я кроме как через сервер сценарий Windows или net use способа не нашел. Пока остановился на первом.
using IWshRuntimeLibrary;
using Shell32;
WshNetwork network = new WshNetwork();
Shell shell = new Shell();
object update = false;
network.MapNetworkDrive("W:", @"\\192.168.16.5\user-heap", ref update);
DriveInfo di = new DriveInfo("W:\\");
if (di.IsReady)
{
object n = @"W:\";
Shell32.Folder f = shell.NameSpace(n);
Shell32.FolderItem fi = f.Items().Item();
fi.Name = "Network disk";
}
Но, при таком подходе приходится с собой таскать Interop.IWshRuntimeLibrary.dll и Interop.Shell32.dll. Может возможно запихать эти 2 библиотеки в проект ?
Здравствуйте, Zoldan, Вы писали:
Z>[]
Можно так:
namespace ConsoleApplication2
{
public class DriveSettings
{
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)
{
if (sNetworkPath.Substring(sNetworkPath.Length - 1, 1) == @"\")
{
sNetworkPath = sNetworkPath.Substring(0, sNetworkPath.Length - 1);
}
NETRESOURCE oNetworkResource = new NETRESOURCE();
oNetworkResource.oResourceType = ResourceType.RESOURCETYPE_DISK;
oNetworkResource.sLocalName = sDriveLetter + ":";
oNetworkResource.sRemoteName = sNetworkPath;
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 < DriveList.Length; i++)
{
if (sDriveLetter + ":\\" == DriveList[i].ToString())
{
return true;
}
}
return false;
}
}
class Program
{
static void Main(string[] args)
{
DriveSettings.MapNetworkDrive("X", @"\\Net\Volume_1");
}
}
}
Здравствуйте, alexsoff, Вы писали:
A>Здравствуйте, Zoldan, Вы писали:
Z>>[]
A>Можно так:
A>A>namespace ConsoleApplication2
A>{
A> public class DriveSettings
A> {
A> private enum ResourceScope
A> {
A> RESOURCE_CONNECTED = 1,
A> RESOURCE_GLOBALNET,
A> RESOURCE_REMEMBERED,
A> RESOURCE_RECENT,
A> RESOURCE_CONTEXT
A> }
A> private enum ResourceType
A> {
A> RESOURCETYPE_ANY,
A> RESOURCETYPE_DISK,
A> RESOURCETYPE_PRINT,
A> RESOURCETYPE_RESERVED
A> }
A> private enum ResourceUsage
A> {
A> RESOURCEUSAGE_CONNECTABLE = 0x00000001,
A> RESOURCEUSAGE_CONTAINER = 0x00000002,
A> RESOURCEUSAGE_NOLOCALDEVICE = 0x00000004,
A> RESOURCEUSAGE_SIBLING = 0x00000008,
A> RESOURCEUSAGE_ATTACHED = 0x00000010
A> }
A> private enum ResourceDisplayType
A> {
A> RESOURCEDISPLAYTYPE_GENERIC,
A> RESOURCEDISPLAYTYPE_DOMAIN,
A> RESOURCEDISPLAYTYPE_SERVER,
A> RESOURCEDISPLAYTYPE_SHARE,
A> RESOURCEDISPLAYTYPE_FILE,
A> RESOURCEDISPLAYTYPE_GROUP,
A> RESOURCEDISPLAYTYPE_NETWORK,
A> RESOURCEDISPLAYTYPE_ROOT,
A> RESOURCEDISPLAYTYPE_SHAREADMIN,
A> RESOURCEDISPLAYTYPE_DIRECTORY,
A> RESOURCEDISPLAYTYPE_TREE,
A> RESOURCEDISPLAYTYPE_NDSCONTAINER
A> }
A> [StructLayout(LayoutKind.Sequential)]
A> private struct NETRESOURCE
A> {
A> public ResourceScope oResourceScope;
A> public ResourceType oResourceType;
A> public ResourceDisplayType oDisplayType;
A> public ResourceUsage oResourceUsage;
A> public string sLocalName;
A> public string sRemoteName;
A> public string sComments;
A> public string sProvider;
A> }
A> [DllImport("mpr.dll")]
A> private static extern int WNetAddConnection2
A> (ref NETRESOURCE oNetworkResource, string sPassword,
A> string sUserName, int iFlags);
A> [DllImport("mpr.dll")]
A> private static extern int WNetCancelConnection2
A> (string sLocalName, uint iFlags, int iForce);
A> public static void MapNetworkDrive(string sDriveLetter, string sNetworkPath)
A> {
A> if (sNetworkPath.Substring(sNetworkPath.Length - 1, 1) == @"\")
A> {
A> sNetworkPath = sNetworkPath.Substring(0, sNetworkPath.Length - 1);
A> }
A> NETRESOURCE oNetworkResource = new NETRESOURCE();
A> oNetworkResource.oResourceType = ResourceType.RESOURCETYPE_DISK;
A> oNetworkResource.sLocalName = sDriveLetter + ":";
A> oNetworkResource.sRemoteName = sNetworkPath;
A> if (IsDriveMapped(sDriveLetter))
A> {
A> DisconnectNetworkDrive(sDriveLetter, true);
A> }
A> WNetAddConnection2(ref oNetworkResource, null, null, 0);
A> }
A> public static int DisconnectNetworkDrive(string sDriveLetter, bool bForceDisconnect)
A> {
A> if (bForceDisconnect)
A> {
A> return WNetCancelConnection2(sDriveLetter + ":", 0, 1);
A> }
A> else
A> {
A> return WNetCancelConnection2(sDriveLetter + ":", 0, 0);
A> }
A> }
A> public static bool IsDriveMapped(string sDriveLetter)
A> {
A> string[] DriveList = Environment.GetLogicalDrives();
A> for (int i = 0; i < DriveList.Length; i++)
A> {
A> if (sDriveLetter + ":\\" == DriveList[i].ToString())
A> {
A> return true;
A> }
A> }
A> return false;
A> }
A> }
A> class Program
A> {
A> static void Main(string[] args)
A> {
A> DriveSettings.MapNetworkDrive("X", @"\\Net\Volume_1");
A> }
A> }
A>}
A>
Спасибо. Вроде работает. Остался вопрос — как переименовать диск? На сколько я понимаю это надо рыться в проводнике, и что-то мне подсказывает, что штатными средствами .Net тут ничего не сделаешь. Опять WINAPI ?
Здравствуйте, alexsoff, Вы писали:
A>Здравствуйте, Zoldan, Вы писали:
Z>>Спасибо. Вроде работает. Остался вопрос — как переименовать диск? На сколько я понимаю это надо рыться в проводнике, и что-то мне подсказывает, что штатными средствами .Net тут ничего не сделаешь. Опять WINAPI ?
A>Можно через DriveInfo.VolumeLabel, но у сетевых дисков там траблы с правами.
A>Я бы сделал это через средства .NET копанием в реестре в ветке HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2
Да, DriveInfo пытается поменять имя тома жесткого диска, где расположена монтируемая папка. Естественно у него ничего не получается
Остановлюсь на варианте с реестром.
Спасибо.