使用UNC路径访问网络资源

在开发ASP.NET网站时,经常需要访问网络资源。但是,如果代码以ASP用户身份运行,可能会因为权限不足而无法访问这些资源。此外,还有服务需要在两个不同域之间的文件共享之间复制文件。本文将介绍如何在不打开安全漏洞的情况下,通过用户凭证访问远程资源。

在开发过程中,遇到了一个问题:ASP.NET网站需要访问网络资源,但是代码运行在ASP用户下,没有足够的共享权限。同时,还有一个服务需要在每天晚上复制两个不同域之间的文件共享。需要一种方法来访问远程资源,而不需要通过改变权限或以特权用户身份运行。

使用代码

UNCAccessWithCredentials类实现了Win32方法NetUseAdd()NetUseDel(),用于创建远程连接。使用NetUseAdd添加的连接在资源管理器中不可见。当活动时,它们会通过DOS命令Net Use显示。

类还实现了IDisposable接口,因此可以使用using()块。一旦到达块的末尾,类会自动在其Dispose()方法中断开UNC连接。

以下是使用该类的示例代码:

C# using (UNCAccessWithCredentials unc = new UNCAccessWithCredentials()) { if (unc.NetUseWithCredentials(uncpath, user, domain, password)) { // 插入需要访问UNC资源的代码 } else { // 连接失败。使用LastError获取系统错误代码 MessageBox.Show( "Failed to connect to " + tbUNCPath.Text + "\r\nLastError = " + unc.LastError.ToString(), "Failed to connect", MessageBoxButtons.OK, MessageBoxIcon.Error); } // 当到达using块的末尾时,类会删除连接。 }

如果需要持久连接,请声明类的实例,并使用NetUseWithCredentials()方法进行连接。一旦连接,就可以根据需要访问远程资源,直到断开连接。不要忘记在完成使用后使用NetUseDelete()方法移除连接。

错误解释

如果方法失败,它们会返回false。如果发生这种情况,请使用类的LastError属性获取Windows系统错误代码。可以使用MSDN系统错误代码页面获取错误描述。

在上面的错误中,错误53是ERROR_BAD_NETPATH - "网络路径未找到"。看起来指定了错误的服务器或共享路径。

要点

在研究如何完成这项任务时,发现了许多有趣的技巧,虽然它们可以完成任务,但并不理想。有些使用了LogonUser()方法,但这只在使用远程用户在执行机器上有登录权限时才有效。还发现了一些程序员运行了shell命令net use

使用APINetUseAdd方法,可以在代码中控制过程,而不需要破解权限或使用DOS命令。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485