在开发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命令。