如何以编程方式访问文件共享[复制](How do I access a file share pro

2019-07-18 10:54发布

这个问题已经在这里有一个答案:

  • 访问共享文件(UNC)从远程,非信任域具有凭证 10个回答

我有一个机器,是不是一个域,需要能够从本地文件系统文件移动到一个UNC路径上运行的Windows窗体应用程序。 我对那个路径的用户名和密码。 我想知道有没有什么办法可以直接与出execing的做到这一点net.exe命令?

理想情况下我也不会映射驱动器。

Answer 1:

在这个问题上接受的答案在这里似乎将是值得探讨; 它建议使用Win32 API函数WNetUseConnection 。

从MSDN:

WNetUseConnection功能使得对网络资源的连接。 该功能可以在本地设备重定向到网络资源。

这似乎完成你要找的内容,没有提到net.exe 。 这是否帮助?



Answer 2:

您可以使用WNetAddConnection做到这一点。 你将不得不PInvoke的。 下面的代码为我工作后,我成立了PInvoke的声明。 的代码(下面)包含的PInvoke声明的第二块 - 只是坚持它一类的内部。


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


您将需要以下支持的代码粘贴到一个类(从pInvoke.Net拍摄)。 确保一个使用statment添加到您的代码:

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



Answer 3:

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

Asp.net Access To Network Share

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



Answer 4:

就拿看这个帖子。 它使用P / Invoke来调用Win32 API LogonUser的()和朋友。 还提供了一些示例代码。



文章来源: How do I access a file share programmatically [duplicate]