System.Security.SecurityException saat menulis ke Log Kejadian

189

Saya sedang berusaha mencoba untuk port aplikasi ASP.NET dari Server 2003 (dan IIS6) ke Server 2008 (IIS7).

Ketika saya mencoba dan mengunjungi halaman di browser saya mendapatkan ini:

Kesalahan Server dalam Aplikasi '/'.

Pengecualian Keamanan

Deskripsi: Aplikasi berusaha melakukan operasi yang tidak diizinkan oleh kebijakan keamanan. Untuk memberikan aplikasi ini izin yang diperlukan, silakan hubungi administrator sistem Anda atau ubah tingkat kepercayaan aplikasi dalam file konfigurasi.

Detail Pengecualian: System.Security.SecurityException: Sumber tidak ditemukan, tetapi beberapa atau semua log peristiwa tidak dapat dicari. Log tidak dapat diakses: Keamanan

Kesalahan Sumber:

Pengecualian yang tidak tertangani dihasilkan selama eksekusi permintaan web saat ini. Informasi mengenai asal dan lokasi pengecualian dapat diidentifikasi menggunakan jejak tumpukan pengecualian di bawah ini.

Jejak Tumpukan:

[SecurityException: Sumbernya tidak ditemukan, tetapi beberapa atau semua log peristiwa tidak dapat dicari. Log yang tidak dapat diakses: Keamanan.]

System.Diagnostics.EventLog.FindSourceRegistration (Sumber string, String machineName, Boolean read only only) +562 System.Diagnostics.EventLog.SourceExists (Sumber string, String machineName) +251

[menggunting]

Inilah hal-hal yang telah saya lakukan untuk mencoba dan menyelesaikannya:

  1. Berikan "Semua Orang" izin akses penuh ke kunci HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Security. Ini berhasil. Tapi tentu saja saya tidak bisa melakukan ini dalam produksi. Jadi saya menghapus izin "Semua Orang" setelah menjalankan aplikasi selama beberapa menit dan kesalahan muncul kembali.

  2. Saya membuat sumber di log Aplikasi dan log Keamanan (dan saya memverifikasi ada melalui regedit) selama instalasi dengan izin tinggi tetapi kesalahan tetap ada.

  3. Saya memberi aplikasi tingkat kepercayaan penuh dalam web.configfile (dan menggunakan appcmd.exe) tetapi tidak berhasil.

Adakah yang tahu apa yang bisa dilakukan di sini?

PS: Ini tindak lanjut dari pertanyaan ini . Saya mengikuti jawaban yang diberikan tetapi tidak berhasil (lihat # 2 di atas).

encee
sumber
Saya mendapatkan ini ketika mencoba menulis ke sumber kustom di layanan .Net yang berjalan sebagai NetworkService. Saya baru saja mengubah sumber log peristiwa untuk mencocokkan nama layanan yang disetel melalui paket .Net Service Setup dan itu berfungsi tanpa mengatur izin registri. Saya perhatikan dengan melihat nama layanan sebagai kunci yang sudah ada di HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ EventLog \ Application
Jon Adams
2
Jawaban lain yang mungkin: Klik kanan exe dan pilih "Run As Administrator"
MacGyver

Jawaban:

169

Untuk memberikan Network Serviceizin baca pada EventLog/Securitykunci (seperti yang disarankan oleh Firenzi dan royrules22) ikuti instruksi dari http://geekswithblogs.net/timh/archive/2005/10/05/56029.aspx

  1. Buka Editor Registri:
    1. Pilih StartkemudianRun
    2. Masukkan regedt32atauregedit
  2. Navigasi / perluas ke tombol berikut:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Security

  3. Klik kanan pada entri ini dan pilih Izin

  4. Tambahkan Network Servicepengguna

  5. Berikan izin Baca

UPDATE: Langkah-langkah di atas tidak masalah pada mesin pengembang, di mana Anda tidak menggunakan proses penyebaran untuk menginstal aplikasi.
Namun jika Anda menyebarkan aplikasi Anda ke mesin lain, pertimbangkan untuk mendaftarkan sumber log peristiwa selama instalasi seperti yang disarankan dalam jawaban SailAvid dan Nicole Calinoiu .

Saya menggunakan fungsi PowerShell (memanggil Octopus Deploy.ps1)

function Create-EventSources() {
    $eventSources = @("MySource1","MySource2" )
    foreach ($source in $eventSources) {
            if ([System.Diagnostics.EventLog]::SourceExists($source) -eq $false) {
                [System.Diagnostics.EventLog]::CreateEventSource($source, "Application")
            }
    }
}
Michael Freidgeim
sumber
Di IIS7 Anda dapat menetapkan "LAYANAN JARINGAN" sebagai identitas untuk App Pool (Anda mungkin menemukan bahwa ApplicationPoolIdentity adalah default) atau sebaliknya Anda dapat membuat pengguna baru per Pool Aplikasi dan menetapkan izin pada "akun kustom". lihat Tentukan Identitas untuk Kelompok Aplikasi (IIS 7)
Grokodile
5
Perubahan hanya berlaku setelah Anda me-restart aplikasi Anda di IIS
Zé Carlos
7
Saya memberi IIS_IUSRS izin untuk membaca / menulis kunci eventlog, dan membaca kunci Keamanan. Produk saya perlu akses tulis pada kunci eventlog karena ia menciptakan sumber acara sendiri.
duck9
1
duck9 saya benar untuk IIS8, lihat di sini untuk detail lebih lanjut: stackoverflow.com/questions/712203/…
thedrs
1
Lihat juga serverfault.com/a/81246/219898 tentang Pengguna App Pool dan izin terkait - untuk solusi ini. Terima kasih @Michael Freidgeim - sangat membantu.
Anthony Horne
59

Masalahnya adalah bahwa EventLog.SourceExistsmencoba untuk mengakses EventLog\Securitykunci, akses yang hanya diizinkan untuk seorang administrator.

Contoh umum untuk program C # yang masuk EventLogadalah:

string sSource;
string sLog;
string sEvent;

sSource = "dotNET Sample App";
sLog = "Application";
sEvent = "Sample Event";

if (!EventLog.SourceExists(sSource))
    EventLog.CreateEventSource(sSource, sLog);

EventLog.WriteEntry(sSource, sEvent);
EventLog.WriteEntry(sSource, sEvent, EventLogEntryType.Warning, 234);

Namun, baris berikut gagal jika program tidak memiliki izin administrator dan kuncinya tidak ditemukan EventLog\Applicationseperti yang EventLog.SourceExistsakan coba akses EventLog\Security.

if (!EventLog.SourceExists(sSource))
    EventLog.CreateEventSource(sSource, sLog);

Oleh karena itu cara yang disarankan adalah membuat skrip instalasi, yang membuat kunci yang sesuai, yaitu:

HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ EventLog \ Application \ dotNET Contoh Aplikasi

Satu kemudian dapat menghapus dua garis itu.

Anda juga dapat membuat .regfile untuk membuat kunci registri. Cukup simpan teks berikut ke dalam file create.reg:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Application\dotNET Sample App]
Stefan Profanter
sumber
1
Inilah tepatnya yang saya lakukan untuk semua layanan saya. Saya percaya bahwa ini adalah hal yang benar untuk dilakukan. Di setiap layanan tempat saya menggunakan event log, saya memiliki file .reg seperti di atas. Satu catatan kecil file tersebut harus disimpan sebagai Unicode-32 (cp 1200.)
Valo
Jawaban ini menjelaskan alasan sebenarnya di balik kesalahan tersebut. Pemeriksaan yang ada mencoba untuk menghitung seluruh kunci. jika ada, checkExists berfungsi dengan baik.
DanO
EventLog \ Keamanan ini adalah kunci untuk berfungsi, pastikan Anda memiliki izin untuk itu.
Princa
45

Solusinya adalah memberikan izin baca akun "Layanan Jaringan" pada kunci EventLog / Keamanan.

encee
sumber
1
Saya melihat solusi serupa di sekitar. Tapi saya hanya ingin tahu mengapa seperti ini. Karena saya dapat melihat bahwa banyak layanan masuk sebagai NetworkService dan mereka harus dapat membaca log peristiwa / keamanan. Jadi mengapa perlu menambahkan izin untuk NetworkService?
h - n
11
Bagi kita yang biasanya tidak merangkak melalui registri, tautan ini mungkin membantu: social.msdn.microsoft.com/forums/en-US/…
Allan
Tautan bagus, Allan. Poin # 3 dengan jawaban yang diterima adalah penting dan sudah pernah menggigit saya. yaitu memberikan izin pada kunci registri EventLog induk TIDAK menyebar ke "log tidak dapat diakses" seperti Keamanan dan Server Virtual, meskipun mereka adalah kunci anak dalam registri. Jika Anda ingin akses log peristiwa lengkap, Anda harus memberikan izin pada KEDUA tingkat log peristiwa induk dan tingkat Keamanan anak.
Ben Barreth
1
Perubahan hanya berlaku setelah Anda me-restart aplikasi Anda di IIS
Zé Carlos
Bagi yang mencoba Copy / Paste, pastikan ada spasi di antara kata "Layanan Jaringan".
Chris Fremgen
7

Bagi saya, pemberian izin 'Baca' untuk 'NetworkService' ke seluruh cabang 'EventLog' berhasil.

evictorov
sumber
itu tidak terlalu relevan, karena untuk sub-kunci seperti "Keamanan" atau "Server Virtual" perlu memberikan akses baca secara individual, karena izin telah ditetapkan untuk tidak diturunkan dari kunci induk.
Serge
7

Saya memiliki masalah yang sangat mirip dengan program konsol yang saya kembangkan di bawah VS2010 (ditingkatkan dari VS2008 di bawah XP) Prog saya menggunakan EnLib untuk melakukan logging. Kesalahan dipecat karena EntLib tidak memiliki izin untuk mendaftarkan sumber acara baru.

Jadi saya mulai setelah prog yang dikompilasi sebagai Administrator : itu mendaftarkan sumber acara. Kemudian saya kembali mengembangkan dan men-debug dari dalam VS tanpa masalah.

(Anda juga dapat merujuk ke http://www.blackwasp.co.uk/EventLog_3.aspx , itu membantu saya

oldbrazil
sumber
7

Pengecualian ini terjadi untuk saya dari aplikasi .NET konsol yang berjalan sebagai tugas terjadwal, dan saya mencoba melakukan hal yang pada dasarnya sama - membuat Sumber Acara baru dan menulis ke log peristiwa.

Pada akhirnya, pengaturan izin penuh untuk pengguna yang menjalankan tugas pada tombol berikut melakukan trik untuk saya:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Application
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Security
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog
tswann
sumber
3
Kamu menyelamatkan hariku. BTW, izin baca sudah cukup pada eventlog\Applicationdan eventlog\Security; kontrol penuh hanya diperlukan pada eventlogroot.
Ruud Helderman
6

Saya mencoba hampir semua yang ada di sini untuk menyelesaikan masalah ini ... Saya membagikan jawaban yang membantu saya di sini

Cara lain untuk menyelesaikan masalah:

  • di konsol IIS, buka kumpulan aplikasi yang mengelola situs Anda, dan catat identitas yang menjalankannya (biasanya Layanan Jaringan)
  • pastikan identitas ini dapat membaca KEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Eventlog (klik kanan, otorisasi)
  • sekarang ubah identitas kumpulan aplikasi ini ke Sistem Lokal, terapkan, dan kembali ke Layanan Jaringan

Kredensial akan dimuat ulang dan EventLog dapat dijangkau

di http://geekswithblogs.net/timh/archive/2005/10/05/56029.aspx , terima kasih Michael Freidgeim

Gelásio
sumber
Mengubah kumpulan aplikasi dari "ApplicationPoolIdentity" ke "LocalSystem" memecahkan masalah membuat / membaca log peristiwa untuk saya.
majestzim
4

Saya mengalami masalah yang sama, tetapi saya harus naik satu tingkat dan memberikan akses penuh kepada semua orang ke kunci HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ EventLog \, alih-alih turun ke keamanan, yang menyelesaikan masalah bagi saya.

nodonoghue
sumber
1
Coba juga mengatur aplikasi agar dijalankan sebagai LocalSystem, sehingga kunci registri dibuat, lalu Anda dapat kembali ke NetworkService sesudahnya.
demoncodemonkey
4

Masalah yang sama pada Windows 7 64bits. Jalankan sebagai administrator memecahkan masalah.

Dom
sumber
4

Kunci baru dengan nama sumber yang digunakan harus dibuat di bawah HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ services \ eventlog \ Aplikasi di regEdit saat Anda menggunakan System.Diagnostics.EventLog.WriteEntry ("SourceName", "ErrorMessage", EventLogEntryType.Eror);

Jadi pada dasarnya pengguna Anda tidak memiliki izin untuk membuat kunci. Dapat melakukan hal berikut tergantung pada pengguna yang Anda gunakan dari nilai Identity di pengaturan Advanced Pool Aplikasi:

  1. Jalankan RegEdit dan pergi ke HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ services \ eventlog
  2. Klik kanan di tombol EventLog dan opsi Izin ... pilih 3. Tambahkan pengguna Anda dengan akses Kontrol penuh.

    -Jika Anda menggunakan "NetworkService" tambahkan pengguna LAYANAN NETWORK

    -Jika Anda menggunakan "ApplicationPoolIdentity", tambahkan IIS APPPOL {nama kumpulan aplikasi Anda} (gunakan lokasi mesin lokal saat mencari pengguna).

    -Jika Anda menggunakan "LocalSystem" pastikan bahwa pengguna memiliki izin Administrator. Tidak direkomendasikan untuk kerentanan.

  3. Ulangi langkah dari 1 hingga 3 untuk HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ services \ eventlog \ Security

Untuk debugging dengan Visual Studio saya menggunakan "NetworkService" (itu adalah pengguna ASP.NET) dan ketika situs diterbitkan saya menggunakan "AppicationPoolIdentity".

Pablishe
sumber
3

FYI ... masalah saya adalah bahwa secara tidak sengaja memilih "Layanan Lokal" sebagai Akun pada properti ProcessInstaller alih-alih "Sistem Lokal". Hanya menyebutkan untuk orang lain yang mengikuti tutorial MSDN sebagai pilihan Layanan Lokal menunjukkan pertama dan saya tidak memperhatikan ....

DaleS
sumber
3

Tampaknya ada solusi yang sangat jelas untuk ini bahwa saya belum melihat kelemahan besar, setidaknya di mana tidak praktis untuk mendapatkan hak administratif untuk membuat sumber acara Anda sendiri: Gunakan yang sudah ada.

Dua yang saya mulai gunakan adalah ".Net Runtime" dan "Application Error", yang keduanya sepertinya akan hadir di sebagian besar mesin.

Kerugian utama adalah ketidakmampuan untuk dikelompokkan berdasarkan peristiwa itu, dan bahwa Anda mungkin tidak memiliki ID Peristiwa yang terkait, yang berarti entri log mungkin diawali dengan sesuatu dengan efek "Deskripsi untuk ID Peristiwa 0 dari sumber .Net Runtime tidak dapat ditemukan .... "jika Anda menghilangkannya, tetapi log masuk, dan output tampak luas masuk akal.

Kode yang dihasilkan akhirnya tampak seperti:

EventLog.WriteEntry(
    ".Net Runtime", 
    "Some message text here, maybe an exception you want to log",
    EventLogEntryType.Error
    );

Tentu saja, karena selalu ada kemungkinan Anda berada di mesin yang tidak memiliki sumber acara untuk alasan apa pun, Anda mungkin ingin try {} catch{}membungkusnya jika gagal dan membuat segalanya lebih buruk, tetapi acara sekarang dapat disimpan.

tobriand
sumber
2

Saya tidak bekerja pada IIS, tetapi saya memiliki aplikasi yang melempar kesalahan yang sama pada kotak 2K8. Ini berfungsi dengan baik pada kotak 2K3, lanjutkan.

Resolusi saya adalah "Jalankan sebagai administrator" untuk memberikan hak yang lebih tinggi kepada aplikasi dan semuanya bekerja dengan senang hati. Saya harap ini membantu mengarahkan Anda ke arah yang benar.

Windows 2008 adalah hak / izin / elevasi yang benar-benar berbeda dari Windows 2003, gar.

omgtitb
sumber
2

Hai Saya mengalami masalah yang sama ketika saya sedang mengembangkan aplikasi dan ingin menginstalnya pada PC jarak jauh, saya memperbaikinya dengan melakukan hal berikut:

1) Buka registri Anda, cari: HKLM \ System \ CurrentControlSet \ Services \ EventLog \ Aplikasi (??? YOUR_SERVICE_OR_APP_NAME ???)

Perhatikan bahwa "(??? YOUR_SERVICE_OR_APP_NAME ???)" adalah nama layanan aplikasi Anda ketika Anda mendefinisikannya saat Anda membuat penyebaran .NET, misalnya, jika Anda menamai aplikasi baru Anda "App baru", maka kuncinya adalah: HKLM \ System \ CurrentControlSet \ Services \ EventLog \ Application \ My New app

Note2: Bergantung pada eventLog mana Anda menulis, Anda dapat menemukan pada kotak DEV Anda, \ Application \ (seperti disebutkan di atas), atau juga (\ System) atau (\ Security) tergantung pada acara apa aplikasi Anda menulis, kebanyakan , (\ Aplikasi) harus baik setiap saat.

2) Berada di tombol di atas, Dari menu; Pilih "FILE" -> "Ekspor", lalu simpan file tersebut. (Catatan: Ini akan membuat pengaturan registri yang diperlukan ketika aplikasi harus mengakses kunci ini untuk menulis ke dalam Peraga Peristiwa), file baru akan menjadi file .REG, demi argumen, sebut saja "Aplikasi Baru Saya.REG "

3) Ketika menyebarkan pada PRODuction, konsultasikan dengan Administrator Sistem Server (SA), serahkan file "Aplikasi Baru Saya.REG" bersama dengan aplikasi, dan minta SA untuk menginstal file REG ini, setelah selesai (sebagai admin) ini akan buat kunci untuk aplikasi Anda.

4) Jalankan aplikasi Anda, seharusnya tidak perlu mengakses apa pun selain kunci ini.

Masalah harus diselesaikan sekarang.

Sebab:

Ketika mengembangkan aplikasi yang menulis apa pun ke dalam EventLog, itu akan memerlukan KUNCI untuk itu di bawah registri Eventlog jika kunci ini tidak ditemukan, itu akan mencoba untuk membuatnya, yang kemudian gagal karena tidak memiliki izin untuk melakukannya. Proses di atas, mirip dengan menggunakan aplikasi (secara manual) sedangkan kami membuat ini sendiri, dan tidak perlu pusing karena Anda tidak mengubah registri dengan menambahkan izin ke SEMUA ORANG yang merupakan risiko keamanan pada server produksi.

Saya harap ini membantu menyelesaikannya.

Heider Sati
sumber
2

Meskipun jawaban penginstal adalah jawaban yang baik, itu tidak selalu praktis ketika berhadapan dengan perangkat lunak yang tidak Anda tulis. Jawaban sederhana adalah membuat log dan sumber acara menggunakan perintah PowerShell New-EventLog ( http://technet.microsoft.com/en-us/library/hh849768.aspx )

Jalankan PowerShell sebagai Administrator dan jalankan perintah berikut untuk mengubah nama log dan sumber yang Anda butuhkan.

New-EventLog -LogName Application -Sumber TFSAggregator

Saya menggunakannya untuk memecahkan Pengecualian Log Kejadian ketika Aggregator menjalankan masalah dari codeplex.

John Brown
sumber
1

Punya masalah serupa dengan semua server 2008 kami. Log keamanan berhenti bekerja sama sekali karena GPO yang mengambil grup Pengguna yang Diotentikasi dan membaca izin dari kunciHKLM\System\CurrentControlSet\Services\EventLog\security

Mengembalikan ini sesuai rekomendasi Microsoft memperbaiki masalah ini. Saya menduga memberikan semua pengguna terotentikasi untuk membaca di level yang lebih tinggi juga akan memperbaiki masalah Anda.

Steve M
sumber
1

Saya mengalami masalah serupa - dalam kasus saya Sumber terkandung <, >karakter. Mesin 64 bit menggunakan basis genap baru - xml yang akan saya katakan dan karakter - karakter ini (diatur dari string) membuat xml tidak sah yang menyebabkan pengecualian. Bisa dibilang ini harus mempertimbangkan masalah Microsoft - tidak menangani Sumber (nama / string) dengan benar.

alflesio
sumber
1

Solusi sangat sederhana - Jalankan Aplikasi Visual Studio dalam mode Admin!

fregat
sumber
Ketika pemecahan masalah di VS dan mendapat kesalahan ini, ini memang memperbaikinya untuk saya
wruckie
Ini akan kesalahan karena bukan VS yang memanggil panggilan ini, itu adalah aplikasi yang kemungkinan berjalan di bawah konteks keamanan yang berbeda.
CodeMonkey1313
0

Aplikasi saya terinstal di server web klien. Daripada mengutak-atik izin Layanan Jaringan dan registri, saya memilih untuk memeriksa SourceExistsdan menjalankan CreateEventSourceinstaller saya.

Saya juga menambahkan coba / tangkap di log.source = "xx"dalam aplikasi untuk mengaturnya ke sumber yang diketahui jika sumber acara saya tidak dibuat (Ini hanya akan muncul jika saya menukar .dll alih-alih menginstal ulang).

basher
sumber
0

coba di bawah ini di web.config

 <system.web>

<trust level="Full"/>

</system.web>
Anjan Kant
sumber
-1

Saya mengalami masalah ini saat menjalankan aplikasi dalam VS. Yang harus saya lakukan adalah menjalankan program sebagai Administrator sekali, maka saya bisa lari dari dalam VS.

Untuk menjalankan sebagai Administrator, cukup arahkan ke folder debug Anda di windows explorer. Klik kanan pada program dan pilih Jalankan sebagai administrator.

Bob Horn
sumber
-3

Membangun kembali solusinya bekerja untuk saya

stephen ebichondo
sumber