2010-05-03 143 views
0

一些细节我想访问网络上的共享!

  • 我与VisualWebGUI工作,所以这个程序是像ASP.NET,它部署在IIS 7(用于测试)
  • 对于我的“站点”,匿名身份验证设置为特定用户(DomainName \ DomainUser)。在我的web.config中,我有模拟。这就是我如何让我的应用首先访问共享。

的问题

有一个在这里我们使用Thread类的应用程序的一个点,类似的东西:

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

我所注意到的是,我可以写我的日志(共享上的文本文件),遍及我的代码中的任何地方,除了在我启动的线程中。我加了一些调试输出和我看到的用户是:

  • 多数民众赞成拉开序幕螺纹:NT AUTHORITY \ NETWORK SERVICE
  • 放眼天下,我的代码:域名\ DomainUser(在我的IIS设置中所述)

OK,出于某种原因,线程获取不同的用户(网络服务)。精细。但是,我的共享(和实际的日志文件)被赋予了NETWORK SERVICE用户的'完全控制'(这个共享位于与我的应用程序运行的服务器不同的服务器上)。

如果NETWORK SERVICE有权这个文件夹,为什么还会访问被拒绝?或者是否有办法让我启动的线程拥有与该进程相同的用户?

回答

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(); 
     } 
     } 
    } 
    } 

你会发现我通过对新的线程通过从ASP.NET线程校长,我明明假设你正在使用Windows集成身份验证,所以我没有做太多的错误检查的方式,这只是一个快速示例。

注:对于VWG你会得到从VWG上下文中的用户,并在适当的功能运行的模拟,这个例子是ASP.NET仅仅指刚因为环境是一样的,只是我不知道VWG我的头顶上有物体。

+0

我认为在实际启动线程之前设置CurrentPrincipal属性会更直接;这几乎是原始问题所要求的。基本上newThread.CurrentPrincipal = currentThread.CurrentPrincipal。 – Luke 2010-05-03 20:33:42

+0

@Luke,不幸的是你不能在Thread实例上设置CurrentPrincipal,CurrentPrincipal是一个静态的。 – 2010-05-03 20:44:51

+0

感谢您的回复。我玩过我的代码(使用你的例子中的代码),现在一切都很好。绿色复选标记为你! – JustLooking 2010-05-03 21:20:30

2

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

HTH

+0

这将使你的访问,但它是从安全角度来看,错误的做法。在适当的安全上下文中运行线程会更好。 – Luke 2010-05-03 20:28:48

+0

@Luke - 我同意你的观点,这种方法值得商榷。但他并没有要求正确的方法 - 只是针对特定权限问题的解决方案。 – unclepaul84 2010-05-03 21:08:54

+0

@ uncluepaul84,感谢您的及时回复(我提出了您的答案)。我不是世界上最“网络”的人,所以你的回答是发人深省的。特别是因为我知道这个测试环境中的这对服务器甚至不在一个域中。因此,授予对方访问权将成为一个大的PITA。我实际上会去与其他答案(对于绿色的复选标记),但再次感谢。 – JustLooking 2010-05-03 21:19:21