實驗一:預設的Run Account (新增一個aspx的頁面,並於加入底下程式碼)
protected void Page_Load(object sender, EventArgs e) { Label1.Text = System.Security.Principal.WindowsIdentity.GetCurrent().Name; }上面的程式碼執行結果如下
由上圖可知,預設為NETWORK SERVICE的帳號在執行asp.net的頁面
實驗二: 當使用impersonate時
執行結果如下
由上圖可知,使用impersonate之後的Run Account改為匿名的帳號了,如下
實驗三:WCF的Run Account
請先新增一WCF Service,並撰寫程式碼如下
//制定ServiceContract(IWCFService.cs) [ServiceContract] public interface IWCFService { [OperationContract] string GetRunAccount(); } //實做契約 public class WCFService : IWCFService { public string GetRunAccount() { //回傳Run Account return System.Security.Principal.WindowsIdentity.GetCurrent().Name; } }
然後請先增Client proxy (這裡就不介紹怎麼新增Client Proxy了),且在aspx中呼叫WCFService,程式碼如下
protected void Page_Load(object sender, EventArgs e) { //Label1.Text = System.Security.Principal.WindowsIdentity.GetCurrent().Name; WCFServiceReference.WCFServiceClient client = new WCFServiceReference.WCFServiceClient(); Label1.Text = client.GetRunAccount(); client.Close(); }
期執行結果如下
注意,這裡出現的Run Account確實讓我感到非常意外,我原本以為應該是與實驗二的結果一樣才是,經過google大神的指導,我才知道這裡的Run Account是follow Application pool的,如下
所以當我們在這裡修改程式集區的執行帳戶時
執行的結果如下
確實是聽從Application Pool的執行帳號
結論:
沒寫過不知道,寫了之後就知道。這種地方一般的WCF書籍並不會寫到,而且可能也不會有很多機會Host on IIS的時候需要調整執行帳戶的。但事情就是這麼巧,就這樣讓我碰到了,這個問題我花了兩天才找出來,從呼叫COM object開始追,最後追到這裡才追到。另外,其實在impersonate的時候,也可以指定其他帳戶,但這個其他帳戶都是屬於ASP.NET的,對WCF並不會起作用喔。
沒有留言:
張貼留言