我在不在域上的計算機上運行的Windows窗體應用程序需要能夠將文件從本地文件系統移動到UNC路徑。我有該路徑的用戶名和密碼。我想知道是否有任何方法可以直接執行此操作,而不執行net.exe
命令?如何以編程方式訪問文件共享
理想情況下,我不必映射驅動器。
我在不在域上的計算機上運行的Windows窗體應用程序需要能夠將文件從本地文件系統移動到UNC路徑。我有該路徑的用戶名和密碼。我想知道是否有任何方法可以直接執行此操作,而不執行net.exe
命令?如何以編程方式訪問文件共享
理想情況下,我不必映射驅動器。
在這個問題上接受的答案here似乎是值得一看的;它建議使用Win32 API函數WNetUseConnection。
從MSDN:
的WNetUseConnection功能使得 連接到網絡資源。功能 可以將本地設備 重定向到網絡資源。
這看起來完成了你在找什麼,沒有提到net.exe
。這有幫助嗎?
看看this的帖子。它使用P/Invoke來調用Win32 API LogonUser()和朋友。還提供了一些示例代碼。
您可以使用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
};
謝謝你的提示,我會看看到它。我不得不想知道爲什麼在.NET中沒有類似的東西。 – Mykroft 2009-09-17 21:35:43