2010-05-03 151 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