2014-02-21 90 views
1

我最近將應用程序從使用ASP.NET模擬切換到實際指定應用程序池中的標識。原因是爲了使未來更容易使用async,所以這些線程作爲我的服務帳戶運行。使用應用程序池標識導致異常和事件日誌

由於進行更改,網站遇到了一些問題。在我做出更改的一天,我現在看到這些事件日誌更經常出現(以前是每天2-3次,現在是每天8-10次):

Windows detected your registry file is still in use by other applications or services. The file will be unloaded now. The applications or services that hold your registry file may not function properly afterwards. 

DETAIL - 
3 user registry handles leaked from \Registry\User\S-1-5-21-1695807550-3099950144-3292890465-4346: 
Process 3840 (\Device\HarddiskVolume2\Windows\System32\inetsrv\w3wp.exe) has opened key \REGISTRY\USER\S-1-5-21-1695807550-3099950144-3292890465-4346 
Process 3840 (\Device\HarddiskVolume2\Windows\System32\inetsrv\w3wp.exe) has opened key \REGISTRY\USER\S-1-5-21-1695807550-3099950144-3292890465-4346\Control Panel\International 
Process 3840 (\Device\HarddiskVolume2\Windows\System32\inetsrv\w3wp.exe) has opened key \REGISTRY\USER\S-1-5-21-1695807550-3099950144-3292890465-4346\Software\Microsoft\Windows\CurrentVersion\Explorer 

我也是得到(似乎是隨機的)錯誤交談Active Directory時:

System.Runtime.InteropServices.COMException (0x80005000): Unknown error (0x80005000) 
    at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail) 
    at System.DirectoryServices.DirectoryEntry.Bind() 
    at System.DirectoryServices.DirectoryEntry.get_AdsObject() 
    at System.DirectoryServices.PropertyValueCollection.PopulateList() 
    at System.DirectoryServices.PropertyValueCollection..ctor(DirectoryEntry entry, String propertyName) 
    at System.DirectoryServices.PropertyCollection.get_Item(String propertyName) 
    at System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInitNoContainer() 
    at System.DirectoryServices.AccountManagement.PrincipalContext.DoDomainInit() 
    at System.DirectoryServices.AccountManagement.PrincipalContext.Initialize() 
    at System.DirectoryServices.AccountManagement.PrincipalContext.get_QueryCtx() 
    at System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithTypeHelper(PrincipalContext context, Type principalType, Nullable`1 identityType, String identityValue, DateTime refDate) 
    at System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithType(PrincipalContext context, Type principalType, IdentityType identityType, String identityValue) 
    at System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity(PrincipalContext context, IdentityType identityType, String identityValue) 

自作出改變的是我看到(雖然它似乎比較少見)的最後一個錯誤:

System.Runtime.InteropServices.COMException (0x800703FA): Illegal operation attempted on a registry key that has been marked for deletion. 

    at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail) 
    at System.DirectoryServices.DirectoryEntry.Bind() 
    at System.DirectoryServices.DirectoryEntry.get_AdsObject() 
    at System.DirectoryServices.PropertyValueCollection.PopulateList() 
    at System.DirectoryServices.PropertyValueCollection..ctor(DirectoryEntry entry, String propertyName) 
    at System.DirectoryServices.PropertyCollection.get_Item(String propertyName) 
    at System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInitNoContainer() 
    at System.DirectoryServices.AccountManagement.PrincipalContext.DoDomainInit() 
    at System.DirectoryServices.AccountManagement.PrincipalContext.Initialize() 
    at System.DirectoryServices.AccountManagement.PrincipalContext.get_QueryCtx() 
    at System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithTypeHelper(PrincipalContext context, Type principalType, Nullable`1 identityType, String identityValue, DateTime refDate) 
    at System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithType(PrincipalContext context, Type principalType, IdentityType identityType, String identityValue) 
    at System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity(PrincipalContext context, IdentityType identityType, String identityValue) 

一旦我重置了應用程序問題就會消失。不幸的是,它似乎在一兩天後回來。

有沒有人有這方面的想法?我可以回去使用模擬,因爲直到我將應用程序池標識切換爲特定用戶時纔會發生這種情況。我的Google-fu今天沒給我答案。

+0

當我調用'Domain.GetComputerDomain()'時,如果我沒有足夠的權限,或者'Load User Profile'關閉時_maybe_被調用,我得到'已經標記爲刪除的註冊表項上的非法操作'。因此,有時在訪問域/用戶信息時,它似乎是一個報告嚴重的權限問題。給予管理員權利似乎可以解決這個問題。 – Rory

回答

3

我無法找到問題的根本原因。但是,如果底層代碼依賴於屬於該身份的資源,似乎對多個應用程序池使用相同的身份可能會導致一些問題。

更改應用程序池設置Load User ProfileTrue解決了問題並且事件日誌條目停止發生。

0

我打算試一試,並說你可能沒有正確清理資源。 Microsoft.Win32.RegistryKey對象和System.DirectoryServices.AccountManagement.PrincipalContext均爲IDisposable,並且在不再使用時必須予以處置。

當用戶的會話在更改之前超時時,可能會清理這些資源,並且因爲您已關閉模擬,所以這些資源已不再可用。

+0

感謝您的回覆。我在代碼中不常使用'System.DirectoryServices',但我確實經歷過尋找沒有處理的對象,而且我沒有發現該代碼存在問題。還有一點需要注意的是,我有多個應用程序池以相同的服務帳戶身份運行。是否值得發佈我的少量目錄代碼? –

相關問題