需要在 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 中访问远程机器的建议的主要内容,如果未能解决你的问题,请参考以下文章

将 ASP.NET 5 远程发布到 IIS

IIS 7.5 ASP.Net 和远程共享

Asp.Net 开发实战技术

使用 ASP.NET 模拟读取远程文件

远程调试 ASP.NET VSCode

使用 ASP .Net 管理本地机器上的进程