我有一个在不在域上的计算机上运行的Windows窗体应用程序,它需要能够将文件从本地文件系统移动到UNC路径。我有该路径的用户名和密码。我想知道有没有办法直接执行net.exe
命令?
理想情况下,我不必映射驱动器。
答案 0 :(得分:11)
您可以使用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)。确保在代码中添加使用语句:
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
};
答案 1 :(得分:4)
这个问题here的公认答案似乎值得研究;它建议使用Win32 API函数WNetUseConnection。
来自MSDN:
WNetUseConnection 功能 连接到网络资源。该 function可以重定向本地设备 到网络资源。
这似乎可以实现您所寻找的目标,而不提及net.exe
。这有帮助吗?
答案 2 :(得分:1)
我认为你需要映射一个驱动器。我还没有办法解决它。但是,请看这篇文章:
Asp.net Access To Network Share
其他人的答案已被接受,但我在另一个答案中发布了代码,以简化网络驱动器。
答案 3 :(得分:0)
看一下this帖子。它使用P / Invoke来调用Win32 API LogonUser()和朋友。还提供了一些示例代码。