2013-11-22 1 views
0

제한된 액세스 권한이있는 위치에서 이미지를 읽고 내 wpf 응용 프로그램의 속성으로 반환하려고합니다. 여기 A first chance exception of type 'System.Runtime.InteropServices.COMException' occurred in PresentationCore.dll Additional information: Catastrophic failure (Exception from HRESULT: 0x8000FFFF (E_UNEXPECTED))가장을 사용하여 이미지 읽기

코드 것 :

public BitmapImage GetImage() 
{ 
    var bitmap = new BitmapImage(); 
    var impersonation = new ImpersonationManager(Resources.Username, 
       Resources.Domain, 
       Resources.Password); 
    using (impersonation.SafeTokenHandle) 
    { 
     using (var newId = new WindowsIdentity(impersonation.SafeTokenHandle.DangerousGetHandle())) 
     { 
      using (newId.Impersonate()) 
      { 
       bitmap.BeginInit(); 
       bitmap.UriSource = new Uri(@"\\restrictedpath\\to\\image.jpg", UriKind.Absolute); 
       bitmap.EndInit(); 
      } 
     } 
    } 
    return bitmap; 
} 

창문의 내가 restrictedpath에 액세스 할 수 없습니다에서이 응용 프로그램을 실행하고 사용자하지만 creds 문제는이 오류를 해결하기 위해 보이지 않을 수 있다는 것입니다 나는 가장을 위해 사용하고 있습니다. 그렇지 않으면 가장이 잘 작동합니다. ImpersonationManager은 단지 래퍼입니다.

이 작업을 수행 할 수 있습니까?

+0

URI가 그렇게 작동하지 않습니다. 'C : \\ restrictedpath \\ to \\ image.jpg''또는 더 나은'@ "C : \ restrictedpath \ to \ image.jpg"와 같은 드라이브 문자가 있어야합니다. 그러나 예외는 설명하지 않습니다. – Clemens

+0

@Clemens 음, 사실이 아닙니다. UNC 경로는 잘 작동합니다 ... 그렇지 않은 경우 어떻게 매핑되지 않은 공유 드라이브에 액세스 할 수 있습니까? 그리고이 코드는 예외를 제외하고 잘 동작합니다. 내가 그 드라이브에 접근 할 수 있다면 좋다. 전적으로'@'에 동의합니다.이 예제를 실제 코드에서 패치하고 놓쳤습니다. – Nicros

+0

UNC 경로 인 경우'@ "\\ restrictedpath \ to \ image.jpg"로 작성해야합니다. 여기서'restrictedpath'는 서버 이름입니다. – Clemens

답변

0

누구든지이 문제에 빠지면 알아 냈습니다.

public BitmapImage GetImage() 
{ 
    var bitmap = new BitmapImage(); 

    var impersonation = new ImpersonationManager(Resources.Username, 
       Resources.Domain, 
       Resources.Password); 
    using (impersonation.SafeTokenHandle) 
    using (var newId = new WindowsIdentity(impersonation.SafeTokenHandle.DangerousGetHandle())) 
    using (newId.Impersonate()) 
    { 
     using (Stream stream = File.OpenRead(@"\\restrictedpath\\to\\image.jpg")) 
     { 
      bitmap.BeginInit(); 
      stream.Flush(); 
      stream.Position = 0; 
      bitmap.StreamSource = stream; 
      bitmap.CacheOption = BitmapCacheOption.OnLoad; 
      bitmap.EndInit(); 
      bitmap.Freeze(); 
     } 
    } 

    return bitmap; 
} 

그와 bitmap.Freeze() 내 문제로 처리했다 : 나는 비트 맵의 ​​스트림 소스에 그에서 파일을 읽은 다음 할당 스트림을 열 수 있었다.

관련 문제