2010-03-06 2 views
1

Windows 2000 Pro SP4 상자 (도메인 외부)에서 실행 중이며 Windows XP 상자 (도메인)에서 로컬 사용자로 가장합니다. 여기에 게시 된 질문의 WindowsImpersonationContextFacade와 매우 유사한 코드를 사용하고 있습니다 : How can I temporarily impersonate a user to open a file?. 나는 원격으로 Windows 서비스를 시작하고 중지하고 네트워크 공유에 액세스 (일부 자동화 된 통합 테스트의 경우)하는 가장을 사용하고 있습니다.Windows 2000에서 Windows XP로 가장 연결 끊김 연결 열기

LogonUser를 호출 할 때 LOGON32_PROVIDER_DEFAULT 및 LOGON32_LOGON_NEW_CREDENTIALS를 사용해야했습니다. 모든 것이 아름답게 작동했습니다 (도메인의 Windows XP는 도메인의 Windows XP, 도메인의 Windows XP는 도메인에서 Windows Server 2003, 도메인에서는 Windows XP, 도메인에서는 Windows 2000에서 도메인으로). 한 가지 문제는 도메인 외부의 Windows 2000 Pro SP4에서 실행 중이며 도메인에서 실행중인 Windows XP 상자에서 로컬 사용자로 가장하려고했습니다.

LogonUser를 호출 할 때 Windows 2000 작품을 사용하려면 LOGON32_PROVIDER_WINNT50 및 LOGON32_LOGON_NEW_CREDENTIALS를 사용해야했습니다. 이것은 저에게 95 %의 방법을 제공하는 것처럼 보였습니다. 이제 XP 상자에서 로컬 사용자로 가장하여 서비스를 시작/중지하고 가장 된 자격 증명을 사용하여 네트워크 공유에 액세스 할 수 있습니다. 하나의 문제를 실행하고 있지만 실행 취소 가장을 호출하고 토큰 핸들을 닫으면 원격 상자에 대한 연결이 열린 상태로 유지됩니다. 약 10 건 정도의 가장 (impersonation) 호출 후에는 너무 많은 연결에 대한 무언가가 현재 열려 있다는 오류로 더 이상의 가장 (impersonation) 시도가 실패합니다. 원격 관리 Windows XP 상자에서 컴퓨터 관리 -> 시스템 도구 -> 공유 폴더 -> 세션을 보면 Windows 2000 상자에 대해 약 10 개의 세션을 볼 수 있습니다. 나는 이것을 수동으로 닫을 수있다. (나는 결국 그들 자신을 닫을 수도 있지만 매우 빨리 끝낸다 고 생각한다.) 그리고 나서 가장은 몇 번이나 다시 일하기 시작한다. 이 공개 세션 문제는 Windows 2000 상자에서 로컬로 실행되는 경우 다른 모든 테스트 시나리오에서 문제가되지 않는 것 같습니다.

아이디어가 있으십니까?

편집 1 : 좀 더 테스트 후 많은 다른 것들을 시도,이 열려있는 세션을 재사용하지에 문제가 될 것으로 보인다. Windows 2000에서만 LogonUser를 호출하여 토큰을 얻은 다음 해당 토큰을 사용하여 가장하는 것은 새 세션이 만들어지는 것 같습니다. 나는 Windows XP를 추측하고있다. & Windows Server 2003은 오픈 세션을 재사용하고 있기 때문에 문제가없는 것으로 보인다. LogonUser를 한 번 호출 한 다음 토큰을 캐시하면 "너무 많은 연결"문제를 실행하지 않고 캐싱 된 토큰을 사용해야하는 것처럼 가장하는 호출을 많이 할 수있는 것처럼 보입니다. 이것은 내가 가장을 수행 할 때마다 내 토큰에서 CloseHandle()을 호출 할 수 없기 때문에 추한 작업처럼 보입니다. 누구나 어떤 생각이나 아이디어가 있습니까? 아니면이 못생긴 해킹으로 붙어 있습니까? 감사합니다

+0

Win 2000은 일생을 지원하지 않습니다! – TFD

+2

Windows 2000을 사용하고 싶지 않고 고객의 요구 사항을 충족시키고 청구서를 낸다. – Tallek

답변

1

누군가가 관심이있는 경우에는이 문제에 대한 좋은 해결책을 찾지 못했습니다. 해결 방법은 LogonUser에서 반환 된 토큰을 캐시 한 다음 모든 토큰 호출에서 해당 토큰을 다시 사용하는 것입니다. 이것은 일을 훌륭하게 만들었지 만, 프로덕션 코드에서하고 싶지 않은 것입니다.

0

"서비스를 시작/중지하고 네트워크 공유에 액세스". 코드에 따라 이러한 문제가 발생할 수 있습니다.

호출 취소는 가장 관련된 참여 리소스 만 릴리스하지만 응용 프로그램이 사용하는 모든 리소스는 릴리스하지 않습니다.

+0

이것이 가장 이슈가 아니라면 어떻게 고칠 수 있었 을까? Directory.GetFiles()에 대한 여러 호출에 문제가 있습니다 (다른 것들 중에서도).왜 이것이 원격 상자에 대한 연결을 열린 상태로 유지할 것인가? (Win2000에서만 winXP로만 가능) Win2000 상자에서 이러한 연결을 강제 종료하는 방법은 무엇입니까? – Tallek

+0

.NET 파일 처리에 대해 자세히 읽고 모든 필요한 리소스가 릴리스되었는지 확인해야합니다. "using"및 "Close"는 도움이 될 수 있지만 코드에 크게 의존합니다. –