Windows 2008 IIS 7 ASP.NET 寫入 Event Log 發生 安全性例外狀況

Windows 2008 IIS 7 ASP.NET 寫入 Event Log 發生 安全性例外狀況

這篇文章,將說明在 IIS 下使用 ASP.NET 寫入自定 Event Log 所發生的問題,如何透過 ProceessMonitor 來觀察出問題的方式。

 

情境:

你可能是接手站台的轉移,這個站台記錄相關啟動資訊或系統錯誤的資訊,是透過自定 EventLog 方式,將相關資訊記錄下來,
是使用下述的程式碼,建立自定的 EventLog 及寫入一筆log的程式碼,發生以下的錯誤訊息。


    if (!(EventLog.SourceExists("MySource"))) {
            EventLog.CreateEventSource("MySource", "myNewLog");
             
        }

        // Write an informational entry to the event log.    
        EventLog.WriteEntry("MySource", "寫入 MySource");

 

 

安全性例外狀況

描述: 應用程式嘗試執行安全原則不允許的作業。如果要授與這個應用程式所需的權限,請聯繫您的系統管理員,或在組態檔中變更這個應用程式的信任層級。
例外詳細資訊: System.Security.SecurityException: 找不到來源,但無法搜尋部分或全部的事件記錄檔。無法存取的記錄檔: Security。

 

image

 

在這個錯誤的同時,我們可以透過 ProceessMonitor 來觀察問題發生點,會發現是在 Registry 沒有自定的 MySource ,
所以發生了這個錯誤,而詳細的原因請參考KB329291的說明。

image

 

解決步驟:

1. 開始 - 執行 – regedit

2. 在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application  建立 自定的名稱

 

結果:

再度執行原本的程式,就能看到正常的寫入,從 ProcessMonitor 也看到正常的運作。

image

 

image

備註:

1.在其他的參考解決連結中,有特別再給予 Network Service 角色 Full Control 權限在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\ ,
但在這個情境當中,並不需要特別給予這個權限,Network Service 本身就可以寫入 Application 既有本身存在的 EventLog。

ex: 你可以使用這段程式碼進行測試 EventLog.WriteEntry("Application", "寫入 Application"); 

2.如果需要自動化的建立,可參考 KB329291 ,透過 EventLogInstaller  的方式。

 

 

參考連結

PRB: "Requested Registry Access Is Not Allowed" Error Message When ASP.NET Application Tries to Write New EventSource in the EventLog
http://support.microsoft.com/kb/329291/en-us

IIS7: Web Application writing to Event Log generates Security Exception
http://www.christiano.ch/wordpress/2009/12/02/iis7-web-application-writing-to-event-log-generates-security-exception