从需要用户名和密码的 UNC 路径获取文件
本文关键字:UNC 路径 获取 文件 密码 用户 | 更新日期: 2023-09-27 18:32:41
我有一个类库,它在应用程序中以[用户a]身份运行。应用程序需要从已设置为共享的网络定位中获取文件(其名称和内容(。共享位于 Windows 环境和运行应用程序的同一域中。
正在运行的应用程序: 用户帐户:[用户 a] 域名: 我的域名
网络共享: 能够访问的用户:[用户 b] 共享: ''192.168.1.1''文件夹 域名: 我的域名
我需要在应用程序中使用我的文件连接到''192.168.1.1''文件夹''文件夹''并获取文件名及其内容。一个简单的 Directory.GetFiles 应该没问题(如果可能的话(。
我在网上查看了一些关于网络凭据的答案,但这些答案正在传递给网络请求。我只想在标准目录IO列表中使用它并收集文件内容。
我觉得应该有一种方法可以做到这一点,而不必使用某人的 400 行长的项目 - 当然,我可以很容易地使用 .NET 做到这一点,我只是不知道要使用哪个类。
干杯
像这样:
#region WNetUseConnection
[DllImport("Mpr.dll", EntryPoint = "WNetUseConnection", CallingConvention = CallingConvention.Winapi)]
private static extern int WNetUseConnection(IntPtr hwndOwner, NETRESOURCE lpNetResource, string lpPassword, string lpUserID, int dwFlags, string lpAccessName, string lpBufferSize, string lpResult);
[DllImport("Mpr.dll", EntryPoint = "WNetCancelConnection2", CallingConvention = CallingConvention.Winapi)]
private static extern int WNetCancelConnection2(string lpName, int dwFlags, bool fForce);
[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
};
#endregion WNetUseConnection
以下是使用它的方法:(如果执行此操作一次就足够了,您不必在每次访问共享之前重复此操作。
// Initialize connection to file share
NETRESOURCE nr = new NETRESOURCE();
nr.dwType = ResourceType.RESOURCETYPE_DISK;
nr.lpRemoteName = "''192.168.1.1";
string user = "user B";
string password = "password for user B";
WNetUseConnection(IntPtr.Zero, nr, password, user, 0, null, null, null);