C# 如何以编程方式访问文件共享

C# 如何以编程方式访问文件共享,c#,.net,winforms,file-sharing,C#,.net,Winforms,File Sharing,我有一个windows窗体应用程序运行在一台不在域上的计算机上,它需要能够将文件从本地文件系统移动到UNC路径。我有该路径的用户名和密码。我想知道有没有办法不执行net.exe命令直接执行此操作 理想情况下,我不必绘制驾驶路线图 这个问题的公认答案似乎值得研究;它建议使用Win32 API函数 从MSDN: WNetUseConnection函数将生成一个 连接到网络资源。这个 函数可以重定向本地设备 连接到网络资源 它似乎完成了你想要的,而没有提到net.exe。这有帮助吗?您可以使用WNet

我有一个windows窗体应用程序运行在一台不在域上的计算机上,它需要能够将文件从本地文件系统移动到UNC路径。我有该路径的用户名和密码。我想知道有没有办法不执行
net.exe
命令直接执行此操作


理想情况下,我不必绘制驾驶路线图

这个问题的公认答案似乎值得研究;它建议使用Win32 API函数

从MSDN:

WNetUseConnection函数将生成一个 连接到网络资源。这个 函数可以重定向本地设备 连接到网络资源


它似乎完成了你想要的,而没有提到
net.exe
。这有帮助吗?

您可以使用WNetAddConnection来完成此操作。你得去品脱。在我设置了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)。确保在代码中添加using语句:

using System.Runtime.InteropServices

谢谢你的提示,我会调查一下的。我想知道为什么.NET中没有类似的东西。我想你需要映射一个驱动器。我还没有找到解决办法。然而,请看这篇文章:别人的答案被接受了,但我在另一个答案中发布了代码,用于简化网络驱动器。它使用P/Invoke调用Win32 API LogonUser()和friends。还提供了一些示例代码。

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