需要建议访问asp.net中的远程机器

时间:2010-11-15 12:26:42

标签: c# asp.net

我想访问远程计算机上的某些位置。我想要访问的文件夹可以完全控制每个人。下面给出的代码用于访问网络路径。

 System.IO.DirectoryInfo locationInfo = new System.IO.DirectoryInfo(BackupLocationTxt.Text);
        if (locationInfo.Exists)  
        {
            // do some operations
         }

如果要访问的主机和远程计算机都有os windows xp,应用程序运行正常。如果应用程序在visual studio中运行,应用程序也运行良好。

然后我的问题是,任何一台机器(服务器和远程机器)都有一个os更新的windows xp(如windows 7,server 2008)locationInfo.Exists总是错误。

但是如果应用程序在visual studio中运行,那么它可以独立于os

工作

我在网上搜索了很多。但还没有找到确切的解决方案。有人建议冒充。但我不知道该怎么做。模仿是解决我的问题的方法吗?或者有更好的想法吗?

非常感谢任何帮助

2 个答案:

答案 0 :(得分:9)

你有一个有趣的问题,Null。您是如何配置网站目录安全性的?如果启用了匿名访问,则对Everyone打开的文件夹可能不允许访问,具体取决于服务器的操作系统(有关详细信息,请参阅t his Microsoft KB Article。)

如果站点以匿名方式运行,您可以像在IIS管理器中一样更改站点运行的帐户,也可以启用模拟。当您在Visual Studio中运行该站点时,该站点正在运行您的权限,因此Anonymous不是问题。

您可以使用以下代码输出您网站运行的用户的身份,以帮助弄清楚发生了什么。您可以将用户的站点作为对网络位置的访问权限而不进行任何模拟。向您的页面添加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 StackOverflow question值得一读。

答案 1 :(得分:2)

请尝试System.IO.Directory.Exists

请记住,如果您对目录没有至少只读权限,则Exists方法将返回false