2011-01-29 3 views
7

별도의 하위 응용 프로그램 도메인에 플러그 인을로드해야하는 응용 프로그램을 개발 중입니다. 하나의 하위 앱 도메인에는 하나의 플러그인 만로드됩니다. 각 플러그인마다 다른 Windows ID가 필요하며 해당 ID는 기본 (상위) 앱 도메인에 사용 된 Windows ID와 다릅니다. 각 플러그인은 하나 이상의 자식 플러그인을로드합니다.응용 프로그램 도메인 수준의 가장

예. 기본 앱 도메인의 ID는 Authority \ Limited입니다 (권한은 도메인 이름 또는 컴퓨터 이름 임). 두 개의 플러그인이 두 개의 하위 앱 도메인에로드됩니다. 로드 된 플러그인의 ID는 Authority \ Privileged1Authority \ Privileged2입니다. 권한 \ 제한는 상기 데이터베이스의 액세스 권한이없는 반면 권한 \ Privileged1권한 \ Privileged2는 데이터베이스 각각 Database1DATABASE2에 필요한 모든 액세스 할 수 있습니다. 자식 응용 프로그램 도메인을 만들 때

, 나는 System.Security.Principal.WindowsPrincipal 인스턴스를 통과 System.AppDomain.SetThreadPrincipal 메서드를 호출합니다. 인스턴스는 System.Security.Principal.WindowsIdentity 복제 된 사용자 토큰 (http://support.microsoft.com/kb/306158 참조)에서 만들어진 인스턴스에서 만들어졌습니다. WindowsPrincipal 인스턴스를 만들 때 기본 앱 도메인에 있으므로 WindowsIdentity.Impersonate 메서드를 생략했습니다.

로드 된 플러그인이 해당 데이터베이스에 성공적으로 로그인하고 일부 T-SQL 문을 실행할 수 있도록 앱 도메인 스레드 보안 주체를 설정하면 충분할 것으로 예상됩니다. 놀랍게도 에 의해 반환 된 값은 데이터베이스 연결을 열 때 WindowsIdentity.GetCurrent() 메서드가 사용됩니다. 메서드에서 반환하는 값은 프로세스 ID 또는 가장 된 ID입니다.

프로세스 ID에는 데이터베이스 작업에 필요한 권한이 없으므로 허용되지 않습니다. 따라서 가장 (impersonation)이 반드시 재생되어야합니다. 그러나 가장은 하위 앱 도메인에서만 발생해야합니다. 각 플러그인은 플러그인로드 및 언로드를 수행하는 데 사용되는 메소드를 노출합니다. 처음에는 가장을 수행하고 그 끝 부분에서 가장을 실행 취소해야한다는 것을 이해합니다. 그러나 가장은 하위 응용 프로그램 도메인에 생성 된 모든 스레드에 대해서도 수행되어야합니다. 각 플러그인은 하위 플러그인 중 하나 이상을로드하고 각 플러그인은 하나 이상의 스레드를 생성 할 수 있기 때문에 가장을 여러 곳에서 수행해야하며 매우 혼란 스럽습니다.

한 번만 그래서 자식 응용 프로그램 도메인에서 양산되는 모든 스레드에 영향을 미치는 가장을 수행 할 수 있습니까?

+1

자식 도메인 대신 하위 프로세스를 사용하고 원하는 계정으로 이러한 프로세스를 실행하는 방법을 고려해 볼 수 있습니다. 명시 적으로 원격을 설정하면 작업이 조금 복잡해 지지만 원격 형식에 적합한 API가 이미있는 것 같습니다. –

+0

응용 프로그램은 임의의 ID로 실행중인 하위 프로세스를 이미 지원합니다. 그러나 하위 응용 프로그램 도메인에 대해 동일한 작업을 지원해야합니다. 감사. –

답변

3

당신이 할 수 없다 - 가장은 스레드 당이며 같은 스레드는 여러 AppDomain의 코드를 호출 스택에 가질 수 있습니다. 이는 주요 코드 (일부 주요 AppDomain)가 별도의 AppDomain에서 플러그인의 논리를 호출하는 플러그인 시스템에 특히 해당됩니다.

기본적으로 플러그인을 호출하기 전에 가장해야하며 완료하면 되돌려 야합니다. 플러그인이 자체 작업을 위해 스레드 풀을 사용하는 경우 제대로 도용해야합니다.

+0

고마워, 알렉세이. 앱 도메인에서 일부 코드를 실행하도록 스레드가 할당되었으며 스레드가 코드 실행을 완료했음을 나타내는 이벤트가 있습니까? 이러한 이벤트가있는 경우 해당 이벤트에 가입하여 한 곳에서 가장 및 정찰을 수행 할 수 있습니다. –

+0

잘 모르겠습니다. 필자는 이것을 필요로하지 않았다. 나는 리모팅을 읽고 System.Runtime.Remoting 네임 스페이스를 통해 알아 낸다. –

+0

충분합니다. 제안 해 주셔서 감사합니다. –

관련 문제