2012-10-09 138 views
7

私が使用しているエンタープライズライブラリ検証ブロックがWCFと統合されています。 WIN32 API LogonUserとWindowsIdentity.Impersonateで他のユーザーを偽装すると、System.Runtime.InteropServices.COMException (0x8000FFFF): Catastrophic failure (Exception from HRESULT: 0x8000FFFF (E_UNEXPECTED))が報告されます。設定を読み込む際にセキュリティ上の証拠を得るには何か間違っているようです。偽装のコードを削除すると、エラーは発生しません。これらは例外スタックトレースの一部です。いくつかのヘルパーをお願いします。ありがとう。他のユーザーを偽装すると致命的なエラーが発生する

System.Runtime.InteropServices.COMException (0x8000FFFF): Catastrophic failure (Exception from HRESULT: 0x8000FFFF (E_UNEXPECTED)) 
    at System.Security.Policy.PEFileEvidenceFactory.GetLocationEvidence(SafePEFileHandle peFile, SecurityZone& zone, StringHandleOnStack retUrl) 
    at System.Security.Policy.PEFileEvidenceFactory.GenerateLocationEvidence() 
    at System.Security.Policy.PEFileEvidenceFactory.GenerateEvidence(Type evidenceType) 
    at System.Security.Policy.AssemblyEvidenceFactory.GenerateEvidence(Type evidenceType) 
    at System.Security.Policy.Evidence.GenerateHostEvidence(Type type, Boolean hostCanGenerate) 
    at System.Security.Policy.Evidence.GetHostEvidenceNoLock(Type type) 
    at System.Security.Policy.Evidence.GetHostEvidence(Type type, Boolean markDelayEvaluatedEvidenceUsed) 
    at System.Security.Policy.AppDomainEvidenceFactory.GenerateEvidence(Type evidenceType) 
    at System.Security.Policy.Evidence.GenerateHostEvidence(Type type, Boolean hostCanGenerate) 
    at System.Security.Policy.Evidence.GetHostEvidenceNoLock(Type type) 
    at System.Security.Policy.Evidence.RawEvidenceEnumerator.MoveNext() 
    at System.Security.Policy.Evidence.EvidenceEnumerator.MoveNext() 
    at System.Configuration.ClientConfigPaths.GetEvidenceInfo(AppDomain appDomain, String exePath, String& typeName) 
    at System.Configuration.ClientConfigPaths.GetTypeAndHashSuffix(AppDomain appDomain, String exePath) 
    at System.Configuration.ClientConfigPaths..ctor(String exePath, Boolean includeUserConfig) 
    at System.Configuration.ClientConfigPaths.GetPaths(String exePath, Boolean includeUserConfig) 
    at System.Configuration.ClientConfigurationHost.CreateConfigurationContext(String configPath, String locationSubPath) 
    at System.Configuration.Internal.DelegatingConfigHost.CreateConfigurationContext(String configPath, String locationSubPath) 
    at System.Configuration.BaseConfigurationRecord.get_ConfigContext() 
+0

fyi - 類似:https://stackoverflow.com/a/23650343/717732 – quetzalcoatl

答えて

-2

MSのフォーラムでこのスレッドにこれを私の応答を参照してください。

http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataproviders/thread/b5b7a179-3737-4380-b6cf-843f3e71b317/

これは、スレッドのタイトルです:接続COM例外をスローランダムプーリング。

LogonUserのページのテキストを検索できます。

+0

は無関係のようです。唯一の共通点は、 "偽装の問題"です。あなたが指摘したスレッドは、LogonUserとハンドルの処理に焦点を当てています。私たちはここには何も持っていません。ここでは、ファイルを読み込んで失敗する直前に偽装をしようとするConfigurationManagerにいくつかの問題があります。プロセスには偽装を実行する権限がないため、おそらく制限されています-user、non-interactive、etc. – quetzalcoatl

5

app.configを読み込むときに、System.Configuration自体が偽装を実行するという問題があります。この問題を回避するには、実行してこの問題を回避することができました。偽装していない間に、私はこの問題を回避することができました。

ConfigurationManager.GetSection("system.xml/xmlReader"); 

そうすることで、後の偽装が成功しました。

EDIT:これを行うとapp.configが読み込まれメモリにキャッシュされるため、問題の原因となるコードパスは元の資格情報で一度だけ実行されます。

+0

ありがとう、この固定されたもの。これは、.NET 4.xのバグでなければなりません。少なくとも4.5.1ではバグでなければなりません。 .NET 2.0では発生しません。 XmlElementプロパティ値を設定しようとすると問題が発生します。しかし、新しいXmlDocument()。CreateElement( "Test")を作成し、プロパティをその値に設定してから、設定したい値に設定してください。非常に奇妙な。 –

1

長い戦闘と多くのProcMonキャプチャの後、私はいくつかの条件下で、相互運用中と偽装中にセキュリティゾーンをチェックする際に障害が発生することを発見しました。このKBに関連している:

https://support.microsoft.com/en-us/kb/945701?wa=wsignin1.0

レジストリノードとキーが追加されているエンドを確認した場合は、代わりに指示されたようにw3wp.exeを追加することで、自分自身の実行ファイルのファイル名を追加します。これは私のために働いた - YMMV。

関連する問題