文包含有關編輯註冊表的資訊。在編輯註冊表之前,請務必先了解在發生問題時如何還原註冊表。有關如何還原註冊表的信息,請查看Regedit.exe 中的“還原註冊表”幫助主題,或Regedt32.exe 中的“還原註冊表項”幫助主題。
現象
當你使用asp.net 向事件日誌中寫入一個新的「事件來源」時,可能會得到以下錯誤訊息: System.Security.SecurityException: 不允許所要求的註冊表存取權
原因
執行asp.net進程的預設悵戶是ASPNET(在IIS6.0下面是NetworkService),而此使用者並沒有權限來建立「事件來源」。
解決方法
注意:(編輯登錄會導致系統崩潰之類的微軟嚇你的話就不多說)。如果你需要解決此問題,在你執行此Asp.net程式之前,則必須由具有管理員權限的使用者來建立一個「事件來源」。下面有幾個方法用來建立「事件來源」。
第一個方法
使用下列步驟在登錄編輯中在”應用程式日誌」下方建立一個「事件來源」
1. 點擊“開始”,再點擊“運行”。
2. 在「開啟」方塊中輸入「regedit」。
3. 找到下列子鍵:
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesEventlogApplication
4. 右鍵點選「Application」點選「新建」再點「項目」
5. 將此新項目重新命名為「Test」
6. 關閉登錄編輯器
第二個方法
在System.Diagnostics命名空間中有一個EventLogInstaller類別。它能夠創建和配置你的應用程式在運行時要讀寫的事件日誌。透過下列步驟,我們能夠使用EventLogInstaller類別來建立一個「事件業源」
1. 用VB.NET或C#來建立一個名為EventLogSourceInstaller的「類別庫」。
2. 在專案中加入對System.Configuration.Install.dll,的參考。
3. 將自動產生的Class.VbClass.cs更命名為MyEventLogInstaller.vbMyEventLogInstaller.cs。
4. 在MyEventLogInstaller.vb 或MyEventLogInstaller.cs中的內容替換為以下程式碼:
Visual Basic .NET Sample
Imports System.Diagnostics
Imports System.Configuration.Install
Imports System.ComponentModel
<RunInstaller(True)> _
Public Class MyEventLogInstaller
Inherits Installer
Private myEventLogInstaller As EventLogInstaller
Public Sub New()
' Create an instance of 'EventLogInstaller'.
myEventLogInstaller = New EventLogInstaller()
' Set the 'Source' of the event log..computerDownloadFilesarticle27, to be created.
myEventLogInstaller.Source = "TEST"
' Set the 'Log' that the source is created in.
myEventLogInstaller.Log = "Application"
' Add myEventLogInstaller to 'InstallerCollection'.
Installers.Add(myEventLogInstaller)
End Sub
End Class
Visual C# .NET Sample
using System;
using System.Diagnostics;
using System.ComponentModel;
using System.Configuration.Install;
namespace EventLogSourceInstaller
{
[RunInstaller(true)]
public class MyEventLogInstaller : Installer
{
private EventLogInstaller myEventLogInstaller;
public MyEventLogInstaller()
{
//Create Instance of EventLogInstaller
myEventLogInstaller = new EventLogInstaller();
// Set the Source of Event Log..computerDownloadFilesarticle27, to be created.
myEventLogInstaller.Source = "TEST";
// Set the Log that source is created in
myEventLogInstaller.Log = "Application";
// Add myEventLogInstaller to the Installers Collection.
Installers.Add(myEventLogInstaller);
}
}
}
5. 產生此項目,得到EventLogSourceInstaller.dll。
6. 開啟Visual Studio .NET 指令提示,前往EventLogSourceInstaller.dll所在目錄。
7. 執行此命令來建立「事件來源」:InstallUtil EventLogSourceInstaller.dll
更詳盡的資訊
我們透過一個建立一個Web Application來重現以上錯誤以及解決此問題。
1. 使用VB.Net或C#建立一個Asp.net Web Application。
2. WebForm1.aspx中的程式碼替換為以下程式碼:
Visual Basic .NET Sample
<%@ Page Language="vb" AutoEventWireup="true" %>
<%@ Import namespace="System.Diagnostics" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<script language="VB" runat="server">
Sub WriteEvent_Click(Src As Object..computerDownloadFilesarticle27, e As EventArgs)
Dim ev As New EventLog("Application")
' Event's Source name
ev.Source = "TEST"
EventLog.CreateEventSource(ev.Source..computerDownloadFilesarticle27, "Application")
Try
ev.WriteEntry(TextBox1.Text)
Catch b as exception
Response.write ("WriteEntry " & b.message & "<br>")
End Try
ev = Nothing
End Sub
</script>
<body>
<form id="Form1" runat="server">
Event message:
<asp:textbox id="TextBox1" runat="server" Width="233px"></asp:textbox>
<asp:button id="Button1" onclick="WriteEvent_Click" runat="server" NAME="Button1" text="Write to event log"></asp:button>
</form>
</body>
</HTML>
Visual C# .NET Sample
<%@ Page Language="c#" AutoEventWireup="true" %>
<%@ Import namespace="System.Diagnostics" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<script language="C#" runat="server">
void WriteEvent_Click(Object Src..computerDownloadFilesarticle27, EventArgs e)
{
EventLog ev = new EventLog("Application");
// Event's Source name
ev.Source = "TEST";
EventLog.CreateEventSource(ev.Source..computerDownloadFilesarticle27, "Application");
try
{
ev.WriteEntry(TextBox1.Text);
}
catch (Exception b)
{
Response.Write("WriteEntry " + b.Message + "<br>");
}
ev = null;
}
</script>
<body>
<form id="Form1" runat="server">
Event message:
<asp:textbox id="TextBox1" runat="server" Width="233px"></asp:textbox>
<asp:button id="Button1" onclick="WriteEvent_Click" runat="server" NAME="Button1" text="Write to event log"></asp:button>
</form>
</body>
</HTML>
3. 按F5啟動此項目。
4. 在TextBox輸入一些字符,然後點擊Write to Event Log。
5. 在上面「現象」部分提到的錯誤訊息會出現。
6. 要解決此問題,在Webform1.aspx將下面這行程式碼註釋
EventLog.CreateEventSource(ev.Source..computerDownloadFilesarticle27, "Application");
7. 重新啟動此項目。
http://www.cnblogs.com/niit007/archive/2006/08/13/475510.html