我想访问网络上的分享!

时间:2010-05-03 19:18:06

标签: c# asp.net windows permissions multithreading

一些细节

  • 我正在使用VisualWebGUI,因此这个应用程序就像ASP.NET一样,它部署在IIS 7上(用于测试)
  • 对于我的“网站”,匿名身份验证设置为特定用户(DomainName \ DomainUser)。在我的web.config中,我有模仿。这就是我让我的应用程序首先访问共享的方式。

问题

应用程序中有一点我们使用Thread类,类似于:

Thread myThread = new Thread(new ThreadStart(objInstance.PublicMethod));
myThread.Start();

我注意到的是,我可以在我的代码中的任何地方写入我的日志(共享中的文本文件),除了我启动的主题。我添加了一些调试输出,我看到的用户是:

  • 启动的主题:NT AUTHORITY \ NETWORK SERVICE
  • 我的代码中的其他任何位置:DomainName \ DomainUser(在我的IIS设置中描述)

好的,由于某种原因,线程获得了不同的用户(NETWORK SERVICE)。精细。但是,我的共享(和实际日志文件)被赋予了NETWORK SERVICE用户的“完全控制权”(此共享位于与我的应用程序运行的服务器不同的服务器上)。

如果NETWORK SERVICE拥有此文件夹的权限,为什么我会拒绝访问?或者有没有办法让我启动的线程与进程拥有相同的用户?

2 个答案:

答案 0 :(得分:3)

您还可以获取新线程来模拟发出请求的用户。例如,如果您在Page.Load事件中启动请求,它可能看起来像这样。

  public partial class MyPage : System.Web.UI.Page
  { 
    protected void Page_Load(object sender, EventArgs e)
    {      
      Thread myThread = new Thread(new ParameterizedThreadStart(ThreadMethod));
      myThread.Start(HttpContext.Current.User); 
    }

    private void ThreadMethod(object state)
    {
      WindowsPrincipal principal = state as WindowsPrincipal;

      WindowsImpersonationContext impersonationContext = null;
      try
      {
        if (principal != null)
        {
          Thread.CurrentPrincipal = principal;
          impersonationContext = WindowsIdentity.Impersonate(((WindowsIdentity)principal.Identity).Token);
        }

        // Do your user specific stuff here...
      }
      finally
      {
        if (impersonationContext != null)
        {
          impersonationContext.Undo();
        }
      }
    }
  }

您会注意到我将Principal从ASP.NET线程传递到新线程,我显然假设您正在使用Windows集成身份验证,因此我没有做错误检查的方式,这只是一个快速样品

注意:对于VWG,你可以从VWG上下文中获取用户并在相应的函数中运行模拟代码,这个例子是ASP.NET jsut因为环境是相同的,只是我做不知道我头顶的VWG物体。

答案 1 :(得分:2)

NT AUTHORITY \ NETWORK SERVICE是本地计算机帐户。对于远程服务器,它看起来像您的IIS计算机的Active Directory帐户(COMPUTERNAME $)。您需要将日志目录的访问权限授予IIS框的AD计算机帐户。

HTH