2010-11-23 11 views
3

비주얼 C를 결정하는 ++ 2008OpenInputDesktop() 안전/로그인 바탕 화면을

현재 대화 형 사용자가 (윈도우 키 L) 또는 종료 화면 중 잠금 바탕 화면에 있는지 여부를 설정하는 방법

(Vista 또는 7) 로그 아웃 중에 프로그램이 닫힐 때까지 기다리는 중입니다.

HDESK hd = OpenInputDesktop (0, false, READ_CONTROL);

기본 데스크톱의 사용자 앱에서는 정상적으로 작동하지만 보안 데스크톱 개체를 열 수있는 권한이 없기 때문에 잠긴 데스크톱이나 종료 된 데스크톱에서 코드 5 오류와 함께 실패합니다.

SYSTEM 계정으로 실행되는 서비스에서 호출하면 오류 1 (잘못된 함수)이 반환됩니다. 본인은 어떠한 경우에도 서비스가 잘못된 세션 (세션 0)에 있고 다른 세션의 대화 형 데스크톱을 확인할 수 없다고 생각합니다.

현재 대화 형 사용자로 실행되는 앱과 시스템 서비스가 실행 중이므로 둘 중 하나에서 코드를 수행 할 수도 있습니다.

모든 세션, 윈도우 스테이션 및 데스크톱을 열거해야합니까?

심지어 세션 0의 SYSTEM 서비스에서 OpenInputDesktop을 호출 할 수만 있다면 현재 대화 형 데스크톱을 어떻게 결정합니까?

+0

아마도 사용자가 데스크톱을 전환 할 때 응답이 어떻게 될까요? 그게 가능하니? – Peter350

답변

3

나는 당신이이 방법을 시도 할 수 있다고 생각 :

  • 현재 대화 형 사용자에서 실행중인 프로세스에서 :
    사용 WTSRegisterSessionNotification 세션 변경 알림을 등록 할 수 있습니다. 일단 등록되면 대화 형 프로세스는 로그온/로그 오프 알림을 받게됩니다. 자세한 내용은 여기를 참조하십시오.
    http://msdn.microsoft.com/en-us/library/aa383841.aspx
    http://blogs.msdn.com/b/oldnewthing/archive/2006/01/ 서비스에서
  • /509194.aspx
    04 (세션 0에서 실행) :
    • 사용 GetProcessWindowStation는 서비스의 현재 역 핸들을 얻고, 나중에 사용할 수 있도록 저장합니다.
    • WTSGetActiveConsoleSessionId을 사용하면 현재 대화식 세션의 세션 ID를 가져올 수 있습니다.
    • 현재 세션 ID에 해당하는 스테이션 이름을 WTSQuerySessionInformationWTSWinStationName 정보 클래스를 사용하여 가져옵니다.
    • OpenWindowStation을 사용하여이 역을여십시오. SetProcessWindowStation을 사용하여이 스테이션을 서비스 프로세스로 설정하십시오.
    • 이제 OpenInputDesktop을 사용하여 사용자가 로그인했는지 여부를 확인할 수 있습니다.
    • 열린 대화 형 창 스테이션을 닫으려면 CloseWindowStation을 호출하십시오. 이전에 저장 한 스테이션 핸들을 사용하여 SetProcessWindowStation을 호출하여 서비스의 원래 윈도우 스테이션을 재설정하십시오.

PS : 현재 "WinSta0" 윈도우에서 유일하게 상호 작용하는 역입니다.따라서 WTSGetActiveConsoleSessionIdWTSQuerySessionInformation 호출을 건너 뛸 수 있습니다.

+0

두 번째 방법이 제대로 작동하지 않는다고 생각합니다. 세션 0에서 실행중인 서비스는 세션 1의 winsta0을 자신에게 설정하도록 SetProcessWindowStation()을 실패합니다. SetProcessWindowStation()의 윈도우 스테이션은 현재 세션과 연관되어야하기 때문입니다. – sMiLo

1

주의 : MSDN에 대한 WTSQuerySessionInformationWTSWinStationName과 :

참고 : 이름에도 불구 하 고,이 유형을 지정하면 윈도우 스테이션 이름을 반환하지 않습니다. 원격 데스크톱 서비스 세션의 이름을 반환합니다. 각 원격 데스크톱 서비스 세션은 대화 형 윈도우 스테이션과 연결됩니다. 현재 대화식 창 스테이션에 지원되는 유일한 창 스테이션 이름은 "WinSta0"이므로 각 세션은 자체 "WinSta0"창 스테이션과 연관됩니다. 자세한 내용은 창 스테이션을 참조하십시오.

관련 문제