How do I access a file share programmatically

0 votes
asked Sep 17, 2009 by mykroft

I have a windows forms app running on a machine that is not on a domain, that needs to be able to move a file from the local filesystem to a UNC path. I have a username and password for that path. I was wondering is there any way to do this directly with out execing the net.exe command?

Ideally I wouldn't have to map a drive.

4 Answers

0 votes
answered Sep 17, 2009 by david

I THINK you will need to map a drive. I haven't ound a way around it yet. However, see this post: Access To Network Share

Someone else's answer was accepted, but I have code posted in another answer for simplifying a network drive.

0 votes
answered Sep 17, 2009 by donut

The accepted answer on this question here seems like it would be worth looking into; it suggests using the Win32 API function WNetUseConnection.

From MSDN:

The WNetUseConnection function makes a connection to a network resource. The function can redirect a local device to a network resource.

Which seems to accomplish what you're looking for, with no mention of net.exe. Does this help?

0 votes
answered Sep 17, 2009 by frank-bollack

Take look at this post. It uses P/Invoke to call Win32 API LogonUser() and friends. There is also some example code provided.

0 votes
answered Sep 17, 2009 by jmarsch

You can use WNetAddConnection to accomplish this. You will have to pInvoke. the code below worked for me after I set up the pInvoke declarations. The second block of code (below) contains the pInvoke declarations -- just stick it inside of a class.

        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)));

You will need to paste the following supporting code into a class (taken from pInvoke.Net). Make sure to add a using statment to your code:

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);

        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,

        public enum ResourceType

        public enum ResourceUsage
            RESOURCEUSAGE_CONNECTABLE = 0x00000001,
            RESOURCEUSAGE_CONTAINER = 0x00000002,
            RESOURCEUSAGE_NOLOCALDEVICE = 0x00000004,
            RESOURCEUSAGE_SIBLING = 0x00000008,
            RESOURCEUSAGE_ATTACHED = 0x00000010,

        public enum ResourceDisplayType

Welcome to Q&A, where you can ask questions and receive answers from other members of the community.
Website Online Counter