บทความนี้ประกอบด้วยข้อมูลเกี่ยวกับการแก้ไขรีจิสทรี ก่อนที่จะแก้ไขรีจิสทรี สิ่งสำคัญคือต้องเข้าใจวิธีคืนค่ารีจิสทรีหากเกิดปัญหาขึ้น สำหรับข้อมูลเกี่ยวกับวิธีการคืนค่ารีจิสทรี ดูหัวข้อวิธีใช้ "การคืนค่ารีจิสทรี" ใน Regedit.exe หรือหัวข้อวิธีใช้ "การคืนค่าคีย์รีจิสทรี" ใน Regedt32.exe
ปรากฏการณ์
เมื่อคุณใช้ ASP.NET เพื่อเขียน "แหล่งเหตุการณ์" ใหม่ลงในบันทึกเหตุการณ์ คุณอาจได้รับข้อความแสดงข้อผิดพลาดต่อไปนี้: System.Security.SecurityException: ไม่อนุญาตให้เข้าถึงรีจิสทรีที่ร้องขอ
สาเหตุที่
กระบวนการ ASP.NET กำลังทำงานอยู่ ผู้ใช้เริ่มต้นคือ ASPNET (NetworkService ภายใต้ IIS6.0) และผู้ใช้รายนี้ไม่ได้รับอนุญาตให้สร้าง "แหล่งเหตุการณ์"
หมายเหตุวิธีแก้ปัญหา
: (Microsoft จะไม่พูดอะไรมากถ้าคุณต้องการทำให้คุณกลัว เช่น การแก้ไขรีจิสทรีจะทำให้ระบบล่ม) หากคุณต้องการแก้ไขปัญหานี้ คุณต้องสร้าง "แหล่งที่มาของเหตุการณ์" โดยผู้ใช้ที่มีสิทธิ์ของผู้ดูแลระบบก่อนที่คุณจะเรียกใช้โปรแกรม Asp.net นี้ มีหลายวิธีในการสร้าง "แหล่งที่มาของเหตุการณ์"
วิธีแรก
ใช้ขั้นตอนต่อไปนี้เพื่อสร้าง "แหล่งที่มาของเหตุการณ์" ภายใต้ "บันทึกแอปพลิเคชัน" ในตัวแก้ไขรีจิสทรี
1 คลิก "Start" จากนั้น "Run"
2. ป้อน "regedit" ในช่อง "เปิด"
3. ค้นหาคีย์ย่อยต่อไปนี้:
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesEventlogApplication
4 คลิกขวาที่ "Application" คลิก "New" จากนั้นคลิก "Item"
5. เปลี่ยนชื่อรายการใหม่นี้เป็น "ทดสอบ"
6. ปิดตัวแก้ไขรีจิสทรี
วิธีที่สอง
มีคลาส EventLogInstaller ในเนมสเปซ System.Diagnostics สร้างและกำหนดค่าบันทึกเหตุการณ์ที่แอปพลิเคชันของคุณอ่านและเขียนขณะรันไทม์ ตามขั้นตอนต่อไปนี้ เราสามารถใช้คลาส 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
ImportsSystem.การวินิจฉัย
นำเข้าระบบ การกำหนดค่า ติดตั้ง
นำเข้า System.ComponentModel
<RunInstaller(True)> _
MyEventLogInstaller คลาสสาธารณะ
สืบทอดตัวติดตั้ง
ส่วนตัว myEventLogInstaller ในฐานะ EventLogInstaller
Public Sub ใหม่ ()
' สร้างอินสแตนซ์ของ 'EventLogInstaller'
myEventLogInstaller = EventLogInstaller ใหม่ ()
' ตั้งค่า 'แหล่งที่มา' ของบันทึกเหตุการณ์..computerDownloadFilesarticle27 ที่จะสร้าง
myEventLogInstaller.Source = "ทดสอบ"
' ตั้งค่า 'บันทึก' ที่สร้างแหล่งที่มา
myEventLogInstaller.Log = "แอปพลิเคชัน"
' เพิ่ม myEventLogInstaller ไปที่ 'InstallerCollection'
โปรแกรมติดตั้งเพิ่ม (myEventLogInstaller)
จบหมวดย่อย
ตัวอย่าง Visual C# .NET
คลาสท้าย
ใช้ระบบ;
โดยใช้ระบบการวินิจฉัย
โดยใช้ System.ComponentModel;
โดยใช้ System.Configuration.Install;
เนมสเปซ EventLogSourceInstaller
-
[RunInstaller(จริง)]
MyEventLogInstaller คลาสสาธารณะ: ตัวติดตั้ง
-
EventLogInstaller ส่วนตัว myEventLogInstaller
สาธารณะ MyEventLogInstaller ()
-
//สร้างอินสแตนซ์ของ EventLogInstaller
myEventLogInstaller = new EventLogInstaller();
// ตั้งค่าแหล่งที่มาของบันทึกเหตุการณ์..computerDownloadFilesarticle27, ที่จะสร้าง
myEventLogInstaller.Source = "TEST";
// ตั้งค่าบันทึกที่แหล่งที่มาถูกสร้างขึ้น
myEventLogInstaller.Log = "Application";
// เพิ่ม myEventLogInstaller ไปยังคอลเลกชันตัวติดตั้ง
โปรแกรมติดตั้งเพิ่ม (myEventLogInstaller);
-
-
}
5. สร้างโปรเจ็กต์นี้และรับ EventLogSourceInstaller.dll
6. เปิดพรอมต์คำสั่ง Visual Studio .NET และไปที่ไดเร็กทอรีที่มี EventLogSourceInstaller.dll
7. เรียกใช้คำสั่งนี้เพื่อสร้าง "แหล่งที่มาของเหตุการณ์": InstallUtil EventLogSourceInstaller.dll
ข้อมูลรายละเอียดเพิ่มเติม
เราทำซ้ำข้อผิดพลาดข้างต้นและแก้ไขปัญหานี้โดยการสร้างเว็บแอปพลิเคชัน
1. ใช้ VB.Net หรือ C# เพื่อสร้าง Asp.net Web Application
2. แทนที่รหัสใน WebForm1.aspx ด้วยรหัสต่อไปนี้:
ตัวอย่าง Visual Basic .NET
<%@ ภาษาของเพจ = "vb" AutoEventWireup = "true" % >
<%@ นำเข้าเนมสเปซ = "System.Diagnostics" % >
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<ภาษาสคริปต์ = "VB" runat = "เซิร์ฟเวอร์" >
ย่อย WriteEvent_Click (Src As Object..computerDownloadFilesarticle27, e As EventArgs)
Dim ev เป็น EventLog ใหม่ ("แอปพลิเคชัน")
'ชื่อแหล่งที่มาของเหตุการณ์
ev.Source = "TEST"
EventLog.CreateEventSource(ev.Source..computerDownloadFilesarticle27, "Application")
ลอง
ev.WriteEntry(TextBox1.ข้อความ)
จับ b เป็นข้อยกเว้น
Response.write ("WriteEntry" & b.message & "<br>")
สิ้นสุดการลอง
ev=ไม่มีอะไร
จบหมวดย่อย
</สคริปต์>
<
เนื้อหา>
<form id="Form1" runat="server">
ข้อความเหตุการณ์:
<asp:textbox id="TextBox1" runat="server" width="233px""></asp:textbox">
<asp:button id="Button1" onclick="WriteEvent_Click" runat="server" NAME="Button1" text="เขียนลงในบันทึกเหตุการณ์"></asp:button>
</แบบฟอร์ม>
</ตัว>
</HTML>
ตัวอย่าง Visual C# .NET
<%@ ภาษาของเพจ = "c#" AutoEventWireup = "true" % >
<%@ นำเข้าเนมสเปซ = "System.Diagnostics" % >
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<ภาษาสคริปต์="C#" runat="เซิร์ฟเวอร์">
เป็นโมฆะ WriteEvent_Click (วัตถุ Src..computerDownloadFilesarticle27, EventArgs e)
-
EventLog ev = EventLog ใหม่ ("แอปพลิเคชัน");
//ชื่อแหล่งที่มาของเหตุการณ์
ev.Source = "TEST";
EventLog.CreateEventSource(ev.Source..computerDownloadFilesarticle27, "Application")
;
-
ev.WriteEntry(TextBox1.ข้อความ);
-
จับ (ข้อยกเว้น b)
-
Response.Write("รายการเขียน " + b.Message + "<br>");
-
EV = โมฆะ;
-
</สคริปต์>
<
เนื้อหา>
<form id="Form1" runat="server">
ข้อความเหตุการณ์:
<asp:textbox id="TextBox1" runat="server" width="233px""></asp:textbox">
<asp:button id="Button1" onclick="WriteEvent_Click" runat="server" NAME="Button1" text="เขียนลงในบันทึกเหตุการณ์"></asp:button>
</แบบฟอร์ม>
</ตัว>
</HTML>
3. กด F5 เพื่อเริ่มโครงการนี้
4. ป้อนอักขระบางตัวในกล่องข้อความแล้วคลิกเขียนลงในบันทึกเหตุการณ์
5. ข้อความแสดงข้อผิดพลาดที่กล่าวถึงในส่วน "อาการ" ด้านบนปรากฏขึ้น
6. เมื่อต้องการแก้ไขปัญหานี้ แสดงความคิดเห็นในบรรทัดของรหัสต่อไปนี้ใน Webform1.aspx
article27, "แอปพลิเคชัน");
รีสตาร์ทโปรเจ็กต์นี้
http://www.cnblogs.com/niit007/archive/2006/08/13/475510.html