Olay Günlüğüne yazarken System.Security.SecurityException


189

ASP.NET uygulamasını Server 2003'ten (ve IIS6'dan) Server 2008'e (IIS7) aktarmaya çalışıyorum.

Tarayıcıdaki sayfayı ziyaret etmeye çalıştığımda bunu alıyorum:

'/' Uygulamasında Sunucu Hatası

Güvenlik İstisnası

Açıklama: Uygulama, güvenlik ilkesi tarafından izin verilmeyen bir işlem gerçekleştirmeye çalıştı. Bu uygulamaya gerekli izni vermek için lütfen sistem yöneticinize başvurun veya yapılandırma dosyasındaki uygulamanın güven düzeyini değiştirin.

Özel Durum Ayrıntıları: System.Security.SecurityException: Kaynak bulunamadı, ancak bazı veya tüm olay günlükleri aranamadı. Erişilemeyen günlükler: Güvenlik

Kaynak Hatası:

Geçerli web isteğinin yürütülmesi sırasında işlenmeyen bir özel durum oluşturuldu. Kural dışı durumun kaynağı ve yeri ile ilgili bilgiler aşağıdaki kural dışı durum yığını izlemesi kullanılarak tanımlanabilir.

Yığın izleme:

[SecurityException: Kaynak bulunamadı, ancak olay günlüklerinin bazıları veya tümü aranamadı. Erişilemeyen günlükler: Güvenlik.]

System.Diagnostics.EventLog.FindSourceRegistration (Dize kaynağı, String machineName, Boolean readOnly) +562 System.Diagnostics.EventLog.SourceExists (Dize kaynağı, String machineName) +251

[Kesik]

Bunları çözmek ve çözmek için yaptığım şeyler:

  1. “Herkes” e anahtara tam erişim izni verin HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Security. Bu işe yaradı. Ama doğal olarak bunu üretimde yapamam. Bu yüzden, uygulamayı birkaç dakika çalıştırdıktan sonra “Herkes” iznini sildim ve hata yeniden belirdi.

  2. Uygulama günlüğü ve Güvenlik günlüğünde kaynağı oluşturdum (ve regedit aracılığıyla var olduğunu doğruladım) yükleme sırasında yükseltilmiş izinlerle oluşturdum, ancak hata kaldı.

  3. Ben app web.configdosyasında (ve kullanarak appcmd.exe) tam bir güven seviyesi verdi ama boşuna.

Burada neler yapılabileceğine dair bir fikir var mı?

Not: Bu, bu sorunun devamı niteliğindedir . Verilen cevapları takip ettim ama boşuna (yukarıdaki # 2'ye bakın).


NetworkService olarak çalışan bir .Net hizmetindeki özel bir kaynağa yazmaya çalışırken bunu alıyordum. Olay günlüğü kaynağını .Net Service Setup paketi aracılığıyla ayarlanan hizmet adıyla eşleşecek şekilde değiştirdim ve kayıt defteri izinlerini ayarlamadan çalıştı. Hizmet adını HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ EventLog \ Application içinde zaten bir anahtar olarak görerek fark ettim
Jon Adams


2
Başka bir olası cevap: exe'ye sağ tıklayın ve "Yönetici Olarak Çalıştır" ı seçin
MacGyver

Yanıtlar:


169

Anahtar hakkında Network Serviceokuma izni vermek için EventLog/Security(Firenzi ve royrules22 tarafından önerildiği gibi) http://geekswithblogs.net/timh/archive/2005/10/05/56029.aspx adresindeki talimatları izleyin.

  1. Kayıt Defteri Düzenleyicisi'ni açın:
    1. StartSonra seçinRun
    2. Girin regedt32veyaregedit
  2. Aşağıdaki tuşa gidin / genişletin:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Security

  3. Bu girişi sağ tıklayın ve İzinler'i seçin

  4. Network ServiceKullanıcıyı ekle

  5. Okuma izni verin

GÜNCELLEME: Yukarıdaki adımlar, uygulamayı yüklemek için dağıtım işlemini kullanmadığınız geliştirici makinelerinde uygundur.
Ancak uygulamanızı diğer makinelere dağıtırsanız, yükleme sırasında olay günlüğü kaynaklarını SailAvid ve Nicole Calinoiu'nun yanıtlarında önerildiği gibi kaydetmeyi düşünün .

PowerShell işlevini kullanıyorum (Octopus Deploy.ps1 çağrısı)

function Create-EventSources() {
    $eventSources = @("MySource1","MySource2" )
    foreach ($source in $eventSources) {
            if ([System.Diagnostics.EventLog]::SourceExists($source) -eq $false) {
                [System.Diagnostics.EventLog]::CreateEventSource($source, "Application")
            }
    }
}

IIS7'de "AĞ HİZMETİ" ni Uygulama Havuzunun kimliği olarak atayabilirsiniz (ApplicationPoolIdentity'nin varsayılan olduğunu görebilirsiniz) veya bunun yerine Uygulama Havuzu başına yeni bir kullanıcı oluşturabilir ve bu "Özel hesap" üzerinde izinler ayarlayabilirsiniz. bkz. Uygulama Havuzu için Kimlik Belirleme (IIS 7)
Grokodile

5
Değişiklikler yalnızca IIS üzerinde uygulamanızı yeniden başlattıktan sonra geçerli olur
Zé Carlos

7
IIS_IUSRS'e eventlog anahtarını okuma / yazma ve Güvenlik anahtarını okuma izni verdim. Kendi olay kaynağını oluşturduğundan ürünümün eventlog anahtarında yazma erişimine ihtiyacı vardı.
duck9

1
duck9 i IIS8 için düzeltiyorum, daha fazla bilgi için buraya bakın: stackoverflow.com/questions/712203/…
thedrs

1
Ayrıca bu çözüm için serverfault.com/a/81246/219898 adresindeki Uygulama Havuzu Kullanıcıları ve ilgili izinlere de bakın . Teşekkürler @ Michael Freidgeim - büyük bir yardımcı oldu.
Anthony Horne

59

Sorun, yalnızca yönetici için izin verilen erişim anahtarına EventLog.SourceExistserişmeye çalışılmasıdır EventLog\Security.

C # Programında oturum açmak için yaygın bir örnek EventLog:

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);

Program yönetici izinlerine değil sahiptir ve anahtar altında bulunmazsa Ancak, aşağıdaki satırları başarısız EventLog\Applicationolarak EventLog.SourceExistsdaha sonra erişim için çalışacağız EventLog\Security.

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

Bu nedenle önerilen yol, karşılık gelen anahtarı oluşturan bir yükleme komut dosyası oluşturmaktır:

HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ EventLog \ Application \ dotNET Örnek Uygulaması

Daha sonra bu iki çizgi kaldırılabilir.

.regKayıt defteri anahtarını oluşturmak için bir dosya da oluşturabilirsiniz . Aşağıdaki metni bir dosyaya kaydetmeniz yeterlidir create.reg:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Application\dotNET Sample App]

1
Tüm hizmetlerim için yaptığım şey tam olarak bu. Bunun doğru bir şey olduğuna inanıyorum. Olay günlüğünü kullandığım her hizmette yukarıdaki gibi bir .reg dosyası var. Küçük bir not, dosyanın Unicode-32 (cp 1200.) olarak kaydedilmesi gerekir
Valo

Bu cevap hatanın arkasındaki gerçek nedeni açıklar. Kontrol var, tüm anahtarı numaralandırmaya çalışır. varsa, checkExists düzgün çalışır.
DanO

EventLog \ Security bu fonksiyonun anahtarıdır, bu konuda izniniz olduğundan emin olun.
Princa

45

Çözüm, "Ağ Hizmeti" hesabına EventLog / Güvenlik anahtarında okuma izni vermekti.


1
Etrafında benzer çözümler görüyorum. Ama neden böyle olduğunu merak ediyorum. Çünkü birçok hizmetin NetworkService olarak oturum açtığını ve olay günlüğünü / güvenliğini okuyabilmesi gerektiğini görebiliyorum. Öyleyse neden NetworkService için izin eklemek gerekiyor?
h - n

11
Kayıt defterinde normalde tarama yapmayanlar için bu bağlantı yararlı olabilir: social.msdn.microsoft.com/forums/en-US/…
Allan

Güzel bağlantı Allan. Kabul edilen cevabın 3. maddesi önemlidir ve beni bir kere ısırmıştır. Üst EventLog kayıt defteri anahtarında izin verilmesi, kayıt defterindeki alt anahtarlar olmalarına rağmen, Güvenlik ve Sanal Sunucu gibi "erişilemeyen günlüklere" yayılmaz. Tam olay günlüğü erişimi istiyorsanız, üst olay günlüğü düzeyinde ve alt Güvenlik düzeylerinde İKİ izin vermeniz gerekir.
Ben Barreth

1
Değişiklikler yalnızca IIS üzerindeki uygulamanızı yeniden başlattıktan sonra geçerli olur
Zé Carlos

Kopyalamaya / Yapıştırmaya çalışanlar için "Ağ Servisi" kelimeleri arasında boşluk olduğundan emin olun.
Chris Fremgen

7

Benim için tüm 'EventLog' şubesine 'NetworkService' için 'Okuma' izinleri verilmesi işe yaradı.


"Güvenlik" veya "Sanal Sunucu" gibi alt anahtarlar için, izinler üst anahtardan miras alınmayacak şekilde ayarlandığından, ayrı ayrı okuma erişimi vermesi gerekir.
Serge

7

VS2010 altında geliştirdiğim bir konsol programı ile çok benzer bir sorun yaşadım (XP altında VS2008'den yükseltildi) Prog'um bazı günlük kaydı yapmak için EnLib kullanıyor. EntLib'in yeni bir olay kaynağı kaydetme izni olmadığından hata tetiklendi.

Bu yüzden derlenmiş programımı Yönetici olarak başlattım : olay kaynağını kaydetti. Daha sonra VS'den problemsiz bir şekilde gelişmeye ve hata ayıklamaya geri döndüm.

(ayrıca http://www.blackwasp.co.uk/EventLog_3.aspx adresine de başvurabilirsiniz , bu bana yardımcı oldu


7

Bu kural dışı durum benim için zamanlanmış bir görev olarak çalışan bir .NET konsol uygulamasından oluşuyordu ve temelde aynı şeyi yapmaya çalışıyordum - yeni bir Olay Kaynağı oluşturup olay günlüğüne yazma.

Sonunda, görevin aşağıdaki anahtarlarda çalıştığı kullanıcı için tam izinler ayarlamak benim için hile yaptı:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Application
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Security
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog

3
Günümü kurtardın. BTW, okuma izni yeterliydi eventlog\Applicationve eventlog\Security; eventlogyalnızca kökte tam denetim gerekir .
Ruud Helderman

6

Bu sorunu çözmek için hemen hemen her şeyi deniyorum ... Burada bana yardımcı olan cevabı paylaşıyorum:

Sorunu çözmenin başka bir yolu:

  • IIS konsolunda sitenizi yöneten uygulama havuzuna gidin ve sitenizi çalıştıran kimliği not edin (genellikle Ağ Hizmeti)
  • bu kimliğin KEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Eventlog (sağlam tıklama, yetkilendirmeler) 'i okuyabildiğinden emin olun
  • şimdi bu uygulama havuzunun kimliğini Yerel Sistem olarak değiştirin, uygulayın ve Ağ Hizmetine geri dönün

Kimlik bilgileri yeniden yüklenecek ve EventLog'a erişilebilir

içinde http://geekswithblogs.net/timh/archive/2005/10/05/56029.aspx teşekkürler Michael Freidgeim


Uygulama havuzunu "ApplicationPoolIdentity" den "LocalSystem" olarak değiştirmek benim için olay günlükleri oluşturma / okuma sorununu çözdü.
majestzim

4

Aynı sorunla karşılaştım, ancak bir seviyeye çıktım ve HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ EventLog \ anahtarına herkesin tam erişimini vermek zorunda kaldım, bu da benim için sorunu çözdü.


1
Ayrıca uygulamayı LocalSystem olarak çalışacak şekilde ayarlamayı deneyin, böylece kayıt defteri anahtarı oluşturulur, daha sonra NetworkService'e geri dönebilirsiniz.
demoncodemonkey

4

Aynı sorun Windows 7 64 bit için. Yönetici olarak çalıştır sorunu çözdü.


4

System.Diagnostics.EventLog.WriteEntry ("SourceName", "ErrorMessage", EventLogEntryType.Error) kullandığınızda regEdit'te HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ services \ eventlog \ Application altında kullanılan kaynak adıyla yeni bir anahtar oluşturulması gerekir ;

Dolayısıyla, temel olarak, kullanıcının anahtarı oluşturma izni yoktur. Uygulama Havuzu Gelişmiş ayarlarındaki Kimlik değerinden kullandığınız kullanıcıya bağlı olarak aşağıdakileri yapabilirsiniz:

  1. RegEdit'i çalıştırın ve HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ services \ eventlog adresine gidin.
  2. EventLog tuşuna sağ tıklayın ve İzinler ... seçeneğini seçin. 3.Kullanıcıya tam Denetim erişimi ekleyin.

    - "NetworkService" kullanıyorsanız NETWORK SERVICE kullanıcısı ekleyin

    -Eğer "ApplicationPoolIdentity" kullanıcısıysanız, IIS APPPOL {uygulama havuzunuzun adı} ekleyin (kullanıcı aradığında yerel makine konumunu kullanın).

    - "LocalSystem" kullanıyorsanız kullanıcının Yönetici izinlerine sahip olduğundan emin olun. Güvenlik açıkları için önerilmez.

  3. HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ services \ eventlog \ Security için 1'den 3'e kadar olan adımları tekrarlayın

Visual Studio ile hata ayıklama için "NetworkService" (ASP.NET kullanıcısı) kullanın ve site yayımlandığında "AppicationPoolIdentity" kullandım.


3

FYI ... benim sorunum yanlışlıkla "Yerel Sistem" yerine ProcessInstaller özellikleri Hesap olarak "Yerel Hizmet" seçildi. Sadece Yerel Hizmet seçimi ilk gösterir ve ben yakın dikkat değildi gibi MSDN öğretici izleyen herkes için söz.


3

En azından kendi olay kaynağınızı oluşturmak için idari haklar elde etmenin pratik olmadığı durumlarda, henüz büyük bir dezavantaj görmediğim göze çarpan bariz bir çözüm var gibi görünüyor: Zaten orada olan birini kullanın.

Kullanmaya başladığım ikisi ".Net Runtime" ve "Application Error". Her ikisi de çoğu makinede mevcut gibi görünüyor.

Ana dezavantajlar bu olaya göre gruplanamaması ve büyük olasılıkla ilişkili bir Olay Kimliğinizin olmamasıdır. Bu, günlük girişinin "Kaynak .Net'ten Olay Kimliği 0 için açıklama" Çalışma zamanı bulunamadı .... "değerini atlarsanız, ancak günlük girer ve çıktı geniş ölçüde mantıklı görünür.

Ortaya çıkan kod şöyle görünür:

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

Elbette, her ne nedenle olursa olsun bu olay kaynaklarına sahip olmayan bir makinede olma şansınız olduğundan, muhtemelen try {} catch{}başarısız olması ve işleri daha da kötüleştirmesi durumunda sarmak istersiniz , ancak olaylar artık kurtarılabilir.


2

IIS üzerinde çalışmıyorum, ancak 2K8 kutusuna aynı hatayı atan bir uygulama var. Bir 2K3 kutusu üzerinde iyi çalışıyor, şekil gidin.

Çözümüm, uygulamaya yükseltilmiş haklar vermek için "Yönetici olarak çalıştır" oldu ve her şey mutlu çalışıyor. Umarım bu sizi doğru yöne yönlendirir.

Windows 2008, haklar / izinler / yükselti Windows 2003, gar.


2

Merhaba ben bir uygulama geliştirirken aynı sorunla karşılaştı ve uzak bir bilgisayara yüklemek istedim, ben aşağıdakileri yaparak düzeltildi:

1) Kayıt defterinize gidin, bulun: HKLM \ System \ CurrentControlSet \ Services \ EventLog \ Application (??? YOUR_SERVICE_OR_APP_NAME ???)

.NET dağıtımınızı oluştururken tanımladığınız gibi "(??? YOUR_SERVICE_OR_APP_NAME ???)" uygulama hizmet adınız olduğunu unutmayın; örneğin, yeni uygulamanıza "Yeni Uygulamam" adını verdiyseniz, anahtar: HKLM \ System \ CurrentControlSet \ Services \ EventLog \ Application \ Yeni uygulamam

Not2: Hangi eventLog'a yazdığınıza bağlı olarak, uygulamanızın hangi etkinliğe yazıldığına bağlı olarak DEV kutunuzda, \ Application \ (yukarıda belirtildiği gibi) veya ayrıca (\ System) veya (\ Security) de bulabilirsiniz. , (\ Application) her zaman iyi olmalıdır.

2) Yukarıdaki anahtarda olmak, menüden; "DOSYA" -> "Dışa Aktar" ı seçin ve ardından dosyayı kaydedin. (Not: Uygulamanın Olay Görüntüleyicisi'ne yazmak için bu anahtara erişmesi gerektiğinde bu gerekli kayıt defteri ayarlarınızı oluşturur), yeni dosya bir .REG dosyası olur, bağımsız değişken için "Yeni Uygulamam.REG "

3) PRODuction'da dağıtım yaparken, Sunucunun Sisteminin yöneticisine (SA) danışın, uygulama ile birlikte "Yeni Uygulamam.REG" dosyasını teslim edin ve SA'dan bu işlemi tamamladıktan sonra (yönetici olarak) yüklemesini isteyin uygulamanız için anahtar oluşturun.

4) Uygulamanızı çalıştırın, bu anahtardan başka bir şeye erişmesi gerekmez.

Sorun şu ana kadar çözülmeli.

Sebep olmak:

EventLog içine bir şey yazan bir uygulama geliştirirken, bu anahtar bulunmazsa, Eventlog kayıt defteri altında bunun için bir ANAHTAR gerekir, daha sonra bunu yapmak için hiçbir izinleri için başarısız onu oluşturmak için çalışacaktı. Yukarıdaki işlem, bir uygulamayı (manuel olarak) dağıtmaya benzerken, bunu kendimiz oluşturuyoruz ve üretim sunucularında güvenli bir risk olan HERKES'e izinler ekleyerek kayıt defterini değiştirmediğiniz için baş ağrısına gerek yok.

Umarım bu çözüme yardımcı olur.


2

Yükleyici yanıtı iyi bir yanıt olsa da, yazmadığınız yazılımlarla uğraşırken her zaman pratik değildir. Basit bir yanıt, PowerShell komutunu kullanarak New-EventLog günlüğünü ve olay kaynağını oluşturmaktır ( http://technet.microsoft.com/en-us/library/hh849768.aspx )

PowerShell'i Yönetici olarak çalıştırın ve ihtiyacınız olan günlük adını ve kaynağını değiştirerek aşağıdaki komutu çalıştırın.

Yeni-EventLog -LogName Uygulama -Source TFSAggregator

Toplayıcı codeplex'ten sorunu çalıştırdığında Olay Günlüğü Özel Durumunu çözmek için kullandım .


1

Tüm 2008 sunucularımızda da benzer bir sorun vardı. Güvenlik Günlüğü, Kimliği Doğrulanmış Kullanıcılar grubunu alan ve anahtardan okuma iznini alan bir GPO nedeniyle tamamen çalışmayı durdurduHKLM\System\CurrentControlSet\Services\EventLog\security

Bunu Microsoft'un önerisi üzerine geri koymak sorunu düzeltti. Kimliği doğrulanmış tüm kullanıcılara daha yüksek bir seviyede okuma yapma sorununuzu da düzeltir.


1

Ben benzer bir sorunu çarptı - Kaynak içeriyordu benim durumumda <, >karakterler. 64 bit makineleri söyleyebilirim yeni çift log - xml tabanı kullanıyor ve bu karakterler (dizeden ayarlanır) istisnaya neden olan geçersiz xml oluşturur. Muhtemelen bu, Kaynak (ad / dize) doğru şekilde işlenmeyen Microsoft sorunu olarak düşünülmelidir.


1

Çözüm çok basit - Visual Studio Uygulamasını Yönetici modunda çalıştırın!



Bu, bu çağrıyı çağıran VS değil, muhtemelen farklı bir güvenlik bağlamında çalışan uygulama olduğu için hata verir.
CodeMonkey1313

0

Uygulamam istemci web sunucularına yüklenir. Ağ Hizmeti izinleri ve kayıt defteri ile uğraşmak yerine, yükleyicimi kontrol etmeyi SourceExistsve çalıştırmayı CreateEventSourceseçtim.

Ayrıca log.source = "xx"olay kaynağım oluşturulmamışsa bilinen bir kaynağa ayarlamak için uygulamada bir deneme / yakalama ekledim (Bu yalnızca ben yeniden yüklemek yerine bir .dll takas sıcak olur).


0

web.config dosyasında aşağıyı deneyin

 <system.web>

<trust level="Full"/>

</system.web>

-1

VS içinde bir uygulama çalıştırırken bu sorunu yaşadım. Tek yapmam gereken programı bir kez Yönetici olarak çalıştırmaktı, o zaman VS içinden çalışabilirdim.

Yönetici olarak çalıştırmak için Windows Gezgini'nde hata ayıklama klasörünüze gidin. Programa sağ tıklayın ve Yönetici olarak çalıştır'ı seçin.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.