需要在 asp.net 中访问远程机器的建议
Posted
技术标签:
【中文标题】需要在 asp.net 中访问远程机器的建议【英文标题】:Need suggestion for accessing remote machine in asp.net 【发布时间】:2010-11-15 12:26:41 【问题描述】:我想访问远程机器上的某些地方。我想访问的文件夹对每个人都有完全的控制权。下面给出的代码用于访问网络路径。
System.IO.DirectoryInfo locationInfo = new System.IO.DirectoryInfo(BackupLocationTxt.Text);
if (locationInfo.Exists)
// do some operations
如果要访问的主机和远程计算机都具有 os windows xp,则应用程序运行良好。如果应用程序在 Visual Studio 中运行,该应用程序也运行良好。
那么我的问题是,任何一台机器(服务器和远程机器)的操作系统都比 windows xp 更新(如 windows 7,server 2008)locationInfo.Exists 总是假的。
但如果应用程序在 Visual Studio 内部运行,那么它可以独立于操作系统正常工作
我在网上搜索了很多。但是还没有找到确切的解决方案。有人建议冒充。但我不知道该怎么做。模仿是我的问题的解决方案吗?或者有什么更好的主意??
任何帮助将不胜感激
【问题讨论】:
还没有回复。 :( . 我的问题有什么问题吗??还是需要更多解释?? 【参考方案1】:你有一个有趣的问题,Null。您如何配置您的站点目录安全性?如果启用匿名访问,则对所有人开放的文件夹可能不允许访问,具体取决于服务器的操作系统(有关详细信息,请参阅 this Microsoft KB Article)。
如果站点以匿名方式运行,您可以更改站点在 IIS 管理器中运行的帐户,或者您可以启用模拟。当您在 Visual Studio 中运行该站点时,该站点正在使用您的权限运行,因此匿名不是问题。
您可以使用以下代码来输出您的网站正在运行的用户的身份,以帮助了解正在发生的事情。您可以让您的网站运行的用户无需任何模拟即可访问网络位置。为您的页面添加一个 ASP:Label 并查看您的运行身份:
lblSomeLabel.Text = System.Security.Principal.WindowsIdentity.GetCurrent().Name
模拟可能会给您带来额外的安全风险,因此您应该在进行更改之前多阅读一些内容 - 但是,您用于模拟的用户不需要是域管理员。在您的情况下,用户可能只需要对网络位置具有完全访问权限。
您可以阅读有关如何启用模拟on this Microsoft KB Article 的更多信息。下面是我推荐的该页面的一些代码。下面的代码不会让您的整个网站以模拟模式运行,而是仅运行您遇到问题的部分。
public void Page_Load(Object s, EventArgs e)
if(impersonateValidUser("username", "domain", "password"))
//Insert your code that runs under the security context of a specific user here.
undoImpersonation();
else
//Your impersonation failed. Therefore, include a fail-safe mechanism here.
private bool impersonateValidUser(String userName, String domain, String password)
WindowsIdentity tempWindowsIdentity;
IntPtr token = IntPtr.Zero;
IntPtr tokenDuplicate = IntPtr.Zero;
if(RevertToSelf())
if(LogonUserA(userName, domain, password, LOGON32_LOGON_INTERACTIVE,
LOGON32_PROVIDER_DEFAULT, ref token) != 0)
if(DuplicateToken(token, 2, ref tokenDuplicate) != 0)
tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);
impersonationContext = tempWindowsIdentity.Impersonate();
if (impersonationContext != null)
CloseHandle(token);
CloseHandle(tokenDuplicate);
return true;
if(token!= IntPtr.Zero)
CloseHandle(token);
if(tokenDuplicate!=IntPtr.Zero)
CloseHandle(tokenDuplicate);
return false;
private void undoImpersonation()
impersonationContext.Undo();
另外,在搜索安全文章时,我发现 this *** question 值得一读。
【讨论】:
非常感谢。我试过模仿。你能看看这个问题***.com/questions/4213528/…【参考方案2】:改用System.IO.Directory.Exists
。
请记住,如果您没有对该目录的最低只读权限,则 Exists 方法将返回 false
【讨论】:
以上是关于需要在 asp.net 中访问远程机器的建议的主要内容,如果未能解决你的问题,请参考以下文章