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

10

我有一个运行在未加入域的机器上的Windows窗体应用程序,需要能够将文件从本地文件系统移动到UNC路径。我知道该路径的用户名和密码。请问是否有直接进行此操作而不使用net.exe命令的方法?

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


我认为你需要映射一个驱动器。我还没有找到绕过它的方法。不过,看看这篇帖子:https://stackoverflow.com/questions/1435753/asp-net-access-to-network-share/1435789#1435789 有人的答案被接受了,但是我在另一个答案中发布了简化网络驱动器的代码。 - David
看一下这个帖子。它使用P/Invoke调用Win32 API LogonUser()和相关函数。文中还提供了一些示例代码。 - Frank Bollack
2个回答

13

您可以使用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))); }

这段代码是用于将一个文件从本地复制到网络共享目录的方法,具体实现是通过WNetAddConnection2函数创建网络连接,然后再使用System.IO.File.Copy方法来进行文件复制操作。

您需要将以下支持代码粘贴到一个类中(从pInvoke.Net获取)。请确保在您的代码中添加using语句:

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 };
这段代码定义了多个C#类和枚举类型,其中包括调用Windows API函数WNetAddConnection2所需的NETRESOURCE类。

4
这个问题的被接受答案 在这里,看起来值得一试;它建议使用Win32 API函数WNetUseConnection

根据MSDN:

WNetUseConnection函数连接到网络资源。该函数可以将本地设备重定向到网络资源。

这似乎可以实现您所需的功能,没有提到net.exe。这有帮助吗?


谢谢你的提示,我会去看一下。不过我不禁要想,为什么.NET里面还没有类似的东西呢? - Mykroft

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接