Asp.net-Mvc

從 ASP.NET MVC 應用程序寫入 EventLog 時出現安全異常

  • January 29, 2016

我有一個使用一些業務邏輯創建的庫,其中包括寫入System.Diagnostics.EventLog實例。該庫通常是從 Windows 服務應用程序呼叫的,但現在我試圖從我的 ASP.NET MVC 應用程序呼叫這些相同的庫函式。

我在我的控制器中嘗試了這段程式碼來創建我傳遞給需要寫入日誌的方法的 EventLog 實例。

Dim log = New EventLog("Application", My.Computer.Name, "MyMVCApp")

當庫方法中的程式碼嘗試寫入日誌時,會生成以下錯誤:

[SecurityException: Requested registry access is not allowed.]
System.ThrowHelper.ThrowSecurityException(ExceptionResource resource) +51
Microsoft.Win32.RegistryKey.OpenSubKey(String name, Boolean writable) +7462217
System.Diagnostics.EventLog.CreateEventSource(EventSourceCreationData sourceData) +366
System.Diagnostics.EventLog.VerifyAndCreateSource(String sourceName, String currentMachineName) +194
System.Diagnostics.EventLog.WriteEntry(String message, EventLogEntryType type, Int32 eventID, Int16 category, Byte[] rawData) +205
System.Diagnostics.EventLog.WriteEntry(String message, EventLogEntryType type) +14

我的 Web 應用程序在執行 IIS 6 的 Windows Server 2003 上作為網路服務使用者執行。為了讓網路服務使用者訪問系統資料庫,我需要做些什麼嗎?

是否有更好的方法來創建用於 ASP.NET MVC 應用程序的 EventLog 實例?我只需要引用的框架是否已經創建了一個?

來自 MSDN:“使用網路服務標識執行的應用程序可以使用現有事件源****寫入事件日誌,但由於系統資料庫權限不足,它們無法創建新事件源。”

和…

如果與 EventLog 實例關聯的事件日誌的 Source不存在,則創建一個新的事件源。 "

所以看起來你的事件日誌源不存在,它正在嘗試使用網路服務使用者創建一個新的事件日誌源(這需要寫入系統資料庫,所以不會工作)。

“要使您的 ASP.NET 應用程序能夠使用尚不存在的事件源寫入事件日誌,您有兩個選擇:”

  • 在應用程序安裝時創建新的事件源
  • 在系統資料庫中手動創建新的事件源條目。

因此,需要在應用程序之外創建日誌(您不能以程式方式對這個使用者進行操作。手動操作,或者創建一個簡單的命令行應用程序以簡化安裝)。

完整詳情:

http://msdn.microsoft.com/en-us/library/ms998320.aspx#paght000015_eventlogaccess

我個人建議您不要更改網路使用者權限,而是在 Web 應用程序之外創建日誌源。我的偏好是在控制台應用程序中(這將花費您大約 5 分鐘的時間來編寫,您也可以使用它來準備其他機器)。在 VS.NET 中啟動一個新的控制台應用程序,並添加程式碼以創建日誌源。一個例子:

http://www.dotnetspider.com/resources/23593-Create-Event-log-VB-NET.aspx

然後在使用適當權限登錄時,從 cmd 行執行控制台應用程序。

引用自:https://stackoverflow.com/questions/1610189