Pregunta

    

Esta pregunta ya tiene una respuesta aquí:

         

Tengo una aplicación de formularios de Windows ejecutándose en una máquina que no está en un dominio, que necesita poder mover un archivo del sistema de archivos local a una ruta UNC. Tengo un nombre de usuario y contraseña para esa ruta. Me preguntaba si hay alguna manera de hacer esto directamente sin ejecutar el comando net.exe .

Idealmente, no tendría que mapear una unidad.

¿Fue útil?

Solución

La respuesta aceptada en esta pregunta aquí parece que valdría la pena examinarlo; sugiere usar la función Win32 API WNetUseConnection .

Desde MSDN:

  

La función WNetUseConnection hace un   conexión a un recurso de red. los   la función puede redirigir un dispositivo local   a un recurso de red.

Que parece lograr lo que estás buscando, sin mencionar net.exe . ¿Ayuda esto?

Otros consejos

Puede usar WNetAddConnection para lograr esto. Tendrás que invocar. el siguiente código funcionó para mí después de configurar las declaraciones de pInvoke. El segundo bloque de código (a continuación) contiene las declaraciones de pInvoke, simplemente péguelo dentro de una clase.


        public static void CopyFile(string from, string shareName, string username, string password)
        {
            NETRESOURCE nr = new NETRESOURCE();
            nr.dwType = ResourceType.RESOURCETYPE_DISK;
            nr.lpLocalName = null;
            nr.lpRemoteName = shareName;
            nr.lpProvider = null;

            int result = WNetAddConnection2(nr,  password,  username, 0);
            System.IO.File.Copy(from, System.IO.Path.Combine(shareName, System.IO.Path.GetFileName(from)));
        }


Deberá pegar el siguiente código de soporte en una clase (tomada de pInvoke.Net). Asegúrese de agregar una declaración de uso a su código:

using System.Runtime.InteropServices

        [DllImport("Mpr.dll", EntryPoint = "WNetAddConnection2", CallingConvention = CallingConvention.Winapi)]
        private static extern int WNetAddConnection2(NETRESOURCE lpNetResource, string lpPassword,  
                                      string lpUsername, System.UInt32 dwFlags);

        [StructLayout(LayoutKind.Sequential)]
        private class NETRESOURCE
        {
            public ResourceScope dwScope = 0;
            public ResourceType dwType = 0;
            public ResourceDisplayType dwDisplayType = 0;
            public ResourceUsage dwUsage = 0;
            public string lpLocalName = null;
            public string lpRemoteName = null;
            public string lpComment = null;
            public string lpProvider = null;
        };

        public enum ResourceScope
        {
            RESOURCE_CONNECTED = 1,
            RESOURCE_GLOBALNET,
            RESOURCE_REMEMBERED,
            RESOURCE_RECENT,
            RESOURCE_CONTEXT
        };

        public enum ResourceType
        {
            RESOURCETYPE_ANY,
            RESOURCETYPE_DISK,
            RESOURCETYPE_PRINT,
            RESOURCETYPE_RESERVED
        };

        public enum ResourceUsage
        {
            RESOURCEUSAGE_CONNECTABLE = 0x00000001,
            RESOURCEUSAGE_CONTAINER = 0x00000002,
            RESOURCEUSAGE_NOLOCALDEVICE = 0x00000004,
            RESOURCEUSAGE_SIBLING = 0x00000008,
            RESOURCEUSAGE_ATTACHED = 0x00000010,
            RESOURCEUSAGE_ALL = (RESOURCEUSAGE_CONNECTABLE | RESOURCEUSAGE_CONTAINER | RESOURCEUSAGE_ATTACHED),
        };

        public 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
        };

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top