web-dev-qa-db-fra.com

Mapper le lecteur réseau par programmation en C # sur Windows 10

J'ai suivi l'approche pour mapper un lecteur réseau par programme dans le lien suivant: Mappage du lecteur réseau à l'aide de C #

Le lecteur semble être connecté correctement car je peux interroger des répertoires et des fichiers en C #. MAIS je ne vois pas le lecteur sur mon ordinateur. Mon objectif est de mapper certains lecteurs par programme pour mes utilisateurs. Je ne veux pas utiliser batch/cmd ... Y a-t-il peut-être un problème avec Windows 10 ou ce code est-il juste bon pour les approches de programmation.

Sincères amitiés

Utilisation du code:

Utility.NetworkDrive.MapNetworkDrive("R", @"\\unc\path");
var dirs = Directory.GetDirectories("R:"); // got many Nice directories...
Utility.NetworkDrive.DisconnectNetworkDrive("R", true);

Code complet:

namespace Utility
{
    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 < DriveList.Length; i++)
            {
                if (sDriveLetter + ":\\" == DriveList[i].ToString())
                {
                    return true;
                }
            }
            return false;
        }

    }

}
9
Mario

Le repos de mon ordinateur portable a semblé résoudre le problème de chaque fenêtre. Les trois approches ci-dessous fonctionnent comme un charme. Mon préféré est bien sûr l'approche C # "only".

        // Approach 1
        Utility.NetworkDrive.MapNetworkDrive("R", @"\\unc\path");
        var dirs1 = Directory.GetDirectories("R:");
        Utility.NetworkDrive.DisconnectNetworkDrive("R", true);

        // Approach 2
        DoProcess("net", @"use R: \\unc\path");
        var dirs2 = Directory.GetDirectories("R:");
        DoProcess("net", "use /D R:");

        // Approach 3
        DoProcess("cmd", @"/c C:\local\path\to\batch\connect.cmd");
        var dirs3 = Directory.GetDirectories("R:");
        DoProcess("cmd", @"/c C:\local\path\to\batch\diconnect.cmd");

    public static string DoProcess(string cmd, string argv)
    {

        Process p = new Process();
        p.StartInfo.UseShellExecute = false;
        p.StartInfo.RedirectStandardOutput = true;
        p.StartInfo.FileName = cmd;
        p.StartInfo.Arguments = $" {argv}";
        p.StartInfo.CreateNoWindow = true;
        p.Start();
        p.WaitForExit();
        string output = p.StandardOutput.ReadToEnd();
        p.Dispose();

        return output;

    }
4
Mario

Si vous utilisez @ Mario's Approach 2 et que vous souhaitez conserver le lecteur, supprimez la ligne suivante:

DoProcess("net", "use /D R:");
0
RanchMobile