2009-10-22 33 views
9

Tôi có một thư viện mà tôi đã tạo với một số logic nghiệp vụ bao gồm viết cho một cá thể System.Diagnostics.EventLog. Thư viện này thường được gọi từ một ứng dụng Windows Service, nhưng bây giờ tôi đang cố gắng gọi những hàm thư viện đó từ ứng dụng ASP.NET MVC của tôi.Ngoại lệ bảo mật khi ghi vào một EventLog từ ứng dụng ASP.NET MVC

Tôi đã thử mã này bên trong bộ điều khiển của mình để tạo cá thể EventLog mà tôi chuyển vào phương thức cần ghi vào nhật ký.

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

Các lỗi sau đây được tạo ra khi các mã trong phương pháp thư viện cố gắng ghi vào nhật ký:

[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 

ứng dụng web của tôi đang chạy như người sử dụng dịch vụ mạng trên Windows Server 2003 đang chạy IIS 6 Có điều gì tôi cần làm để cung cấp cho người dùng Dịch vụ Mạng truy cập vào sổ đăng ký không?

Có cách nào tốt hơn để tạo cá thể EventLog để sử dụng trong ứng dụng ASP.NET MVC không? Có ai đã tạo ra bởi khung mà tôi chỉ cần tham khảo?

Trả lời

19

Từ MSDN: "Các ứng dụng chạy bằng cách sử dụng sắc dịch vụ mạng có thể viết thư cho sự kiện đăng nhập bằng cách sử dụngnguồn sự kiện hiện có, nhưng họ không thể tạo nguồn sự kiện mới vì các điều khoản đăng ký không đủ."

Và ...

"Nếu Nguồn cho các bản ghi sự kiện liên quan đến việc dụ EventLog không tồn tại, một nguồn sự kiện mới được tạo ra."

Vì vậy, trông giống như sự kiện của bạn nguồn đăng nhập không tồn tại, và nó đang cố gắng tạo một nguồn bản ghi sự kiện mới bằng cách sử dụng Người dùng Dịch vụ Mạng (yêu cầu phải ghi vào sổ đăng ký, vì vậy sẽ không hoạt động).

"Để kích hoạt ứng dụng ASP.NET của bạn để viết vào nhật ký sự kiện sử dụng một nguồn sự kiện đó không tồn tại, bạn có hai lựa chọn:"

  • Tạo nguồn sự kiện mới tại ứng dụng cài đặt thời gian
  • Tạo thủ công mục nhập nguồn sự kiện mới trong sổ đăng ký.

Vì vậy, cần tạo nhật ký bên ngoài ứng dụng (bạn không thể làm điều đó một cách có lập trình với người dùng này. Làm theo cách thủ công hoặc tạo ứng dụng dòng lệnh đơn giản để đơn giản hóa cài đặt).

Để biết chi tiết đầy đủ:

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

Cá nhân tôi muốn khuyên bạn nên không làm thay đổi các điều khoản sử dụng net, nhưng thay vì tạo ra các nguồn log bên ngoài ứng dụng web. Sở thích của tôi là trong một giao diện điều khiển ứng dụng (mà sẽ đưa bạn về 5 phút để viết, và bạn cũng có thể sử dụng để chuẩn bị các máy khác). Bắt đầu một ứng dụng giao diện điều khiển mới trong VS.NET và thêm mã để tạo nguồn nhật ký.Một ví dụ:

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

Sau đó, chỉ cần chạy ứng dụng giao diện điều khiển từ dòng cmd, khi đăng nhập có quyền phù hợp.

5

Nếu bạn không chắc chắn nguồn sự kiện nào mà nó đang cố gắng tạo, câu trả lời được chấp nhận ở trên sẽ khó tìm ra.

Một giải pháp đơn giản hơn là chuyển đổi nhóm ứng dụng để tạm thời sử dụng LocalSystem, sau đó chạy ứng dụng và tạo ra lỗi. Nó sẽ có thể tạo nguồn nhật ký sự kiện có liên quan và sau đó bạn có thể chuyển nó trở lại bằng NetworkService.

0

Tôi không biết tại sao bạn không thể tạo EventLog của riêng mình thay vì viết vào Nhật ký ứng dụng.

Bạn có thể tạo ứng dụng cửa sổ/bảng điều khiển với mã sau và chạy nó với tư cách quản trị viên, thao tác này sẽ tạo nhật ký mới cho bạn.

if (!EventLog.Exists("LOG_NAME")) 
    EventLog.CreateEventSource("LOG_NAME", "LOG_NAME"); 

điều này sẽ tạo một bản ghi mới bên trong nhật ký sự kiện và hiển thị trong nhật ký ứng dụng và dịch vụ.

if (!EventLog.SourceExists("MyMVCApp")) 
    EventLog.CreateEventSource("MyMVCApp", "LOG_NAME"); 

này sẽ tạo ra một nguồn mới bên trong tùy chỉnh "LOG_NAME" và bạn có thể sử dụng mã

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

để tạo ra một bản ghi tùy chỉnh.

+0

Xem cách gán quyền cho nhật ký: http://stackoverflow.com/questions/1823433/eventlog-permission-failing-in-asp-net-on-win7/35086503#35086503 –

Các vấn đề liên quan