C# 에서 GDI+ 사용하여 생성한 이미지를 저장하려니
System.Runtime.InteropServices.ExternalException (0x80004005): GDI+에서 일반 오류가 발생했습니다.
위치: System.Drawing.Image.Save(String filename, ImageCodecInfo encoder, EncoderParameters encoderParams)
위치: [xxxxxxx].[xxxx](Entry entry)
위와 같이 80004005 에러가 생기기도 하고,
메인 쓰레드에 잘 쓰던 기능을 내가 만든 다른 타 쓰레드에서 호출, File 접근, 기록 할 때 마다 Access Denied (= Win32 에 5번 코드) 가 발생했다면 ...
ACL 권한 때문에 분명 Impersonate 시켜서 시작했는데....
분명 메인 쓰레드(=시작 쓰레드)에서는 별 문제 없던 코드였는데
자식 스레드에서 위 에러가 발생한다면
해당 쓰레드가 Impersonate 되지 않았기 때문이다..
그 문제가 되는 쓰레드 생성할 때 원래 쓰레드의 정보를 넘겨주면 해결된다는 거..
즉, Impersonation 은 쓰레드간 (자동으로) 공유되지 않는다는 점.
아래 func 함수에서 쓰레드 생성하는것처럼 Impersonation 정보를 주고 받고 해야함..
자식 쓰레드)
void ThreadProc(object obj){
var identity = (WindowsIdentity) obj;
using(var impersonation = identity.Impersonate()){
// 원래 코드
}
}
부모 쓰레드)
void func(){
Thread thread = new Thread(new ParameterizedThreadProc(WindowsIdentity.GetCurrent() ));
// .....
}
예제라서 WindowsIdentity 이고,, 상황에 따라 적절한 Identity 를 사용하면 될듯...