C# Монтирование сетевого диска
От: Zoldan  
Дата: 31.10.14 03:35
Оценка:
Здравствуйте.
Скажите, пожалуйста каким образом можно подключить сетевой диск в 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 библиотеки в проект ?
Re: C# Монтирование сетевого диска
От: alexsoff Россия  
Дата: 31.10.14 08:42
Оценка:
Здравствуйте, 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");
        }
    }
}
Re[2]: C# Монтирование сетевого диска
От: Zoldan  
Дата: 05.11.14 02:09
Оценка:
Здравствуйте, 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 ?
Отредактировано 05.11.2014 2:52 Zoldan . Предыдущая версия .
Re[3]: C# Монтирование сетевого диска
От: alexsoff Россия  
Дата: 05.11.14 07:41
Оценка:
Здравствуйте, Zoldan, Вы писали:

Z>Спасибо. Вроде работает. Остался вопрос — как переименовать диск? На сколько я понимаю это надо рыться в проводнике, и что-то мне подсказывает, что штатными средствами .Net тут ничего не сделаешь. Опять WINAPI ?

Можно через DriveInfo.VolumeLabel, но у сетевых дисков там траблы с правами.
Я бы сделал это через средства .NET копанием в реестре в ветке HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2
Re[4]: C# Монтирование сетевого диска
От: Zoldan  
Дата: 07.11.14 00:07
Оценка:
Здравствуйте, alexsoff, Вы писали:

A>Здравствуйте, Zoldan, Вы писали:


Z>>Спасибо. Вроде работает. Остался вопрос — как переименовать диск? На сколько я понимаю это надо рыться в проводнике, и что-то мне подсказывает, что штатными средствами .Net тут ничего не сделаешь. Опять WINAPI ?

A>Можно через DriveInfo.VolumeLabel, но у сетевых дисков там траблы с правами.
A>Я бы сделал это через средства .NET копанием в реестре в ветке HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2

Да, DriveInfo пытается поменять имя тома жесткого диска, где расположена монтируемая папка. Естественно у него ничего не получается Остановлюсь на варианте с реестром.
Спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.