2011-06-15 3 views
4

나는 지금 몇 시간을 찾고 있었고, 지금까지 이걸 가지고 행운이 없었다. 그래서 나는 생각했다.가장 된 사용자로 실행되는 비 UI 스레드가 자동으로 UI 스레드를 가장합니까?

DotNet 4.0에서 실행되는 vb.net으로 작성된 WPF 응용 프로그램은 해시 파일 및 기타 프로세서/시간 집중 루틴과 같은 특정 기능을 수행하는 작업자 스레드를 시작합니다.

로그온 된 사용자가 일반적으로 직접 액세스 할 수없는 네트워크 리소스에 액세스하기 위해 시작되는 스레드 중 일부는 다른 사용자로 가장해야합니다 (응용 프로그램을 통해 네트워크 리소스에 대한 제어 된 액세스가 허용되지만 예를 들어, Windows 탐색기를 통해). 이를 위해 작업자 스레드는 네트워크 리소스에 대한 응용 프로그램 액세스를 허용하는 액세스 권한을 가진 미리 결정된 사용자 계정을 가장합니다.

가장 된 사용자 계정으로 실행되는이 작업 스레드가 작동하는 동안 - 경우에 따라 Users 디렉터리에있는 로컬 SQL 3.5 압축 데이터베이스를 업데이트해야합니다. 이 데이터베이스는 가장 된 사용자가 아닌 로그온 한 사용자 만 액세스 할 수 있습니다.

이 업데이트를 허용하기 위해 가장 된 작업자 스레드에서 SQL 압축 데이터베이스를 업데이트하기 위해 서브 루틴을 호출하는 UI Dispatcher 개체 (스레드가 만들어 질 때 전달되는 개체)에 액세스 할 수 있습니다.

내가 설명 할 수는 없지만 누군가가 이것을 설명 할 수있는 흥미로운 문제는 다음과 같습니다.

작업자 스레드에서 UI Dispatcher를 호출 할 때의 응용 프로그램은 로그온 한 사용자 자격 증명으로 돌아가서 UI 스레드에서 SQL 데이터베이스를 업다운하고 UIthread.dispatcher.invoke 호출이 작업자 스레드로 반환 될 때 - 가장 된 작업자 스레드 계정으로 돌아갑니다.

오늘 - UI 디스패처 스레드를 호출하여 SQL Compact 데이터베이스를 업데이트 할 때 스레드 컨텍스트가 UI 스레드에서 로그온 한 사용자가 아닌 가장 된 사용자에 남아 있습니다. UI 사용자 스레드를 비롯한 모든 스레드에서 가장 된 사용자와 비슷하게 적용됩니다.

UIThread.Dispatcher.Invoke가 UI 스레드의 사용자 컨텍스트 (가장하지 않음)에서 호출되는 코드를 실행해야 올바른 결과가 발생합니다. 또는 impersomated 사용자 컨텍스트가 적용됩니까? 작업자 스레드에서 시작 되었기 때문에 UI 스레드에서 호출 호출 다시?

어제 - UIThread.Dispatcher.Invoked 루틴에 중단 점이 있었을 때 스레드가 로그온 한 사용자 계정에서 실행 중이며 SQL 압축 데이터베이스 업데이트가 작동하는 것을 볼 수있었습니다. 그러나 오늘은 가장 된 계정에서 동일한 코드가 실행되고 데이터베이스를 업데이트하는 동안 액세스가 거부 된 예외가 발생합니다.

작업자 스레드를 시작하기 전에 UI 스레드의 ManagedThreadId를 검사하고 UIThread.Dispatcher.Invoke가 실행될 때 ManagedThreadId가 UI 스레드의 ManagedThreadId로 돌아가는 지 확인할 수 있습니다. 그런 다음 호출이 끝나고 실행될 때 ManagedThreadId가 올바른 작업자 ManagedThreadId로 반환하는 작업자 스레드로 돌아갑니다. 이 시간을 바꾸지 않는 것은 해당 스레드의 사용자입니다. 내가 스레드가 가장을 끝내지 않으면 지금은 가장 된 사용자에게 항상 남아있는 것처럼 보입니다.

누군가가이 문제에 대해 밝힐 수 있습니까? 그리고이 모든 잘못을 저 지르고 다른 방법으로 시도해야한다고 제안 할 수 있습니까?정말로 이해하고 싶은 것은 어제와 현재 사이에이 코드가 변경되지 않은 이유입니다.

긴 게시물에 대한 죄송합니다

건배

로드를.

답변

3

스레드의 실행 컨텍스트를 볼 수 있습니다. 721 C 번호, 3D 에드 페이지를 통해

CLR에서

http://msdn.microsoft.com/en-us/library/system.threading.executioncontext.aspx

는 :

하여 System.Threading 네임 스페이스에서

, 스레드의 실행 컨텍스트가 하나의 흐름 방법을 제어 할 수있는의 ExecutionContext 클래스가 스레드를 다른 스레드로. 개시 스레드의 실행 컨텍스트 도우미 스레드에 유입되지 않는 경우

...

는 도우미 스레드는 마지막으로 그와 관련된 어떤 실행 컨텍스트 사용합니다. 따라서 도우미 스레드는 실행 컨텍스트 상태 (예 : 사용자의 Windows ID)에 의존하는 코드를 실제로 실행하면 안됩니다.

또한, 최근 ASP.NET 응용 프로그램에서 아주 약간의 가장했고, 나는 (즉, 네트워크, 상호 작용하는 가장 싶었 방법, 가장하고 싶어 할 때로 LogonUser는 Win32 API는 정말 세밀한 제어를 제공 , 서비스 등)을 수행 한 다음 단일 스레드 내에서 신속하게 되돌릴 수 있습니다.

http://msdn.microsoft.com/en-us/library/ff647404.aspx#paght000023_impersonatingusinglogonuser

+1

빙고! 너는 천재 야. 발송자 스레드를 호출하기 전에 흐름을 보류하면 문제가 해결되고 예상대로 작동합니다. 많은 도움이되었습니다 – Roddles

+0

굉장! 기꺼이 도움이되었습니다 ... 건배. – Jason

+0

LogonUser API 호출로 가장 사용 중입니다. 그것의 작품은 훌륭합니다. 바로이 문제는 파견 UI 스레드가 응용 프로그램의 모든 측면을 거의 상실한 가장 된 스레드 아래에서 실행되는 오늘날 발생했습니다. 유동성을 억제하는 Explicity가 그 문제를 해결하고 이제는 다시 작용합니다 - 도와 줘서 고마워. – Roddles

관련 문제