2013-05-03 2 views
1

Windows 서비스 (localsystem)로 실행되는 응용 프로그램이 모달 경고를 표시 할 때 기능을 구현하려고합니다. 종료 화면 또는 UAC 경고 화면.Windows 세션 격리를 무시하고 시스템 서비스에서 사용자 세션의 경고 메시지를 표시합니다. Windows 7+

  1. 그것은 나의 이해는 윈도우 비스타 +는 더 이상 응용 프로그램이 시스템을 생성 할 수 없다는 것이다 : 기본적으로 불가능하다 뭔가 내가 구현하는 방법을 모르는 두 가지가 있습니다

    을 몰래 기각하기 모달 창. 그것을 우회하는 것이 가능한가, 그것을 할 수있는 쉬운 방법이 있습니까? 내가 생각할 수있는 유일한 대안은 전체 화면 창을 열고 alt + tab, ctrl + alt + del 등을 가로채는 것입니다.

  2. 또한 사용자 세션에 UI를 표시 할 수 없다고 생각합니다. 서비스이므로 다른 세션에서 실행됩니다. 그 우회를 허용 해킹이 있습니까? 내가 생각할 수있는 한 가지는 : 주어진 세션에서 실행중인 csrss.exe 또는 winlogon.exe에 코드를 찾아 삽입하고 원격 스레드를 호출하는 것입니다. 또 다른 접근법은 obtain handle to winlogon and CreateProcessAsUser()입니다. 또 다른 쉬운 방법이 있습니까?

답변

2

서비스가 로컬 시스템으로 실행되는 경우 WTSQueryUserToken은 주어진 세션에서 코드를 실행하는 토큰을 얻는 가장 쉬운 방법입니다.

모달 창 대신 새 데스크톱 (CreateDesktop)을 만들고이를 전환하는 것이 좋습니다. Ctrl-alt-delete를 억제 할 수는 없지만 control-alt-delete 메뉴를 닫으면 시스템이 일반적으로 데스크탑으로 돌아갈 것이라고 생각합니다. 후크는이를 설치하는 응용 프로그램과 연결된 바탕 화면에만 영향을주기 때문에 다른 모든 특수 키 시퀀스는 표시하지 않아야합니다.

1
  1. "시스템 모드 창"의 의미가 확실하지 않습니다. 로그인 화면에서도 사용자에게 표시되는 메시지를 의미합니까?

  2. 레지스트리에서 UserInteractive가 true로 설정되어 있어도 Vista 이상에서는 서비스에서 Windows GUI에 대한 액세스가 허용되지 않습니다. 이 문제를 해결하는 방법은 몇 가지가 있습니다. 서비스를 제공하는 단순한 도우미 응용 프로그램 (서비스가 아닌 연속 프로세스)이 있습니다. 간단한 메시지 처리를 위해 .NET 원격 처리를 통해 IPC를 사용하는 서비스 쉽게 연결하고 보낼 수 있습니다. 원한다면 좀 더 구체적인 예제를 게시 할 수 있지만 여기서는 구현 방법에 대해 단계적으로 설명합니다 (이 예제에서는 .NET Remoting을 사용하지만 IPC 솔루션에 대해서도 동일한 기본 원칙을 적용해야합니다.

    1. IPC 프로토콜을 사용하여 .NET 원격 서버 (서비스가 아닌 연속 프로세스) 역할을하는 프로그램을 만듭니다. 리모트 인터페이스에는, 새로운 데이터를 받아들이는 멤버가 1 개 이상 포함되어있을 필요가 있습니다. 대부분의 경우, string는 올바르게 동작합니다. 구현 된 클래스는 새 메시지를 지속적으로 처리 할 수 ​​있어야합니다.
    2. 1 단계에서 구현 한 원격 인터페이스를 사용하여 서비스에 연결하고 IPC 서버에 표시 할 메시지를 보냅니다.
    3. IPC 서비스는이 메시지를 처리하여 선호하는 방법을 사용하거나 메시지를 사용자에게 표시하여 사용자에게 표시해야합니다. 개인적으로 최종 사용자가 원하는 경우 메시지를 복사 할 수있는 별도의 스레드에서 모달 폼을 사용합니다.이 방법은 사용자의 컨텍스트에서 프로세스를 시작보다 간단하지만
+0

, 덜 효율적 있습니다; 항상 사용자의 컨텍스트에서 실행되는 추가 프로세스가 필요합니다. –

+0

제 경우에는 이미 서비스를 관리/모니터하는 데 사용되는 트레이 응용 프로그램에 리스너를 붙였습니다. 그렇습니다. 항상 실행중인 다른 프로세스의 존재를 요구하지만, 사용자 로그인시 실행되는 다른 프로세스가 있으므로 거기에 리스너를 던졌습니다. 이 기술은 서비스가 LocalSystem 계정으로 실행되고 있지 않은 경우에도 작동합니다. –