Pregunta

Tengo un legado de servicio de servidor de Windows y (generado) de la aplicación, que funciona bien en XP-64 y W2K3, pero falla en W2K8.Yo creo que es debido a la nueva "Aislamiento de la sesión 0"característica.

En consecuencia, estoy buscando ejemplos de código/configuración de seguridad mojo que permiten crear un nuevo proceso a partir de un servicio de windows para Windows 2008 Server, que puedo recuperar (y posiblemente superar) el comportamiento anterior.Necesito una solución que:

  1. Crea el nuevo proceso en un valor distinto de cero sesión para obtener alrededor de sesión-0 de aislamiento de restricciones (sin acceso a hardware de gráficos de la sesión 0) - el oficial de MS para esto es:

Debido a que la Sesión 0 no es un usuario sesión, los servicios que se están ejecutando en Sesión 0 no tienen acceso a la controlador de vídeo.Esto significa que cualquier intento de que un servicio se hace para representar gráficos de falla.La consulta de la pantalla resolución y profundidad de color en la Sesión 0 informes de los resultados correctos para el sistema hasta un máximo de 1920 x 1200 en 32 bits por píxel.

  1. El nuevo proceso se consigue un windows de escritorio y estación (por ejemplo,winsta0/defecto) que puede ser usado para crear ventanas de los países en desarrollo.He encontrado una solución (que lanza ACEPTAR en una sesión interactiva) para esta aquí: A partir de un sistema Interactivo Proceso de Cliente en C++

  2. El windows DC, cuando se utiliza como la base para un OpenGL DescribePixelFormat enumeración, es capaz de encontrar y utilizar la aceleración por hardware (formato en un sistema debidamente equipado con hardware de OpenGL.) Tenga en cuenta que nuestra solución actual funciona bien en XP-64 y W2K3, excepto si una sesión de servicios de terminal se está ejecutando (VNC funciona bien.) Una solución que también permitió que el proceso de trabajo (es decir,ejecutar con aceleración de hardware OpenGL incluso cuando una sesión de servicios de terminal está abierto) sería fanastic, aunque no es necesario.

Estoy atascado en el punto #1 en la actualidad, y aunque existen algunas publicaciones similares que hablar de este (como este, y este - no son adecuadas, ya que no hay garantía de una sesión de usuario ha iniciado sesión, a la "toma" de un identificador de sesión, ni estoy ejecutando desde una cuenta LocalSystem (estoy corriendo de una cuenta de dominio para el servicio, por lo que puede ajustar los privilegios de, dentro de la razón, aunque yo preferiría no tener que escalar prioridades para incluir SeTcbPrivileges.)

Por ejemplo, aquí es un stub que creo que debería funcionar, pero siempre devuelve un error 1314 en la SetTokenInformation llamada (aunque el AdjustTokenPrivileges no devuelve errores) he utilizado algunas estrategias alternativas que implican "LogonUser" así (en lugar de abrir el proceso existente token), pero me parece que no puede cambiar el identificador de sesión.

También tengo dudas sobre el uso de la WTSActiveConsoleSessionId en todos los casos (por ejemplo, si no interactivas de usuario se registra en) - a pesar de una prueba rápida de la ejecución del servicio con ninguna de las sesiones sesión en la que parecía devolver un razonable valor de la sesión (1).

Me he quitado el manejo de errores para facilitar la lectura (todavía un poco desordenado - disculpas)

    //Also tried using LogonUser(..) here
OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY
                         | TOKEN_ADJUST_PRIVILEGES | TOKEN_ADJUST_SESSIONID
                         | TOKEN_ADJUST_DEFAULT | TOKEN_ASSIGN_PRIMARY
                         | TOKEN_DUPLICATE, &hToken)

GetTokenInformation( hToken, TokenSessionId, &logonSessionId, sizeof(DWORD), &dwTokenLength )

DWORD consoleSessionId = WTSGetActiveConsoleSessionId();

/* Can't use this - requires very elevated privileges (LOCAL only, SeTcbPrivileges as well)   
   if( !WTSQueryUserToken(consoleSessionId, &hToken))
...
   */

DuplicateTokenEx(hToken, (TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES | TOKEN_ADJUST_SESSIONID | TOKEN_ADJUST_DEFAULT | TOKEN_ASSIGN_PRIMARY | TOKEN_DUPLICATE), NULL, SecurityIdentification, TokenPrimary, &hDupToken))


    // Look up the LUID for the TCB Name privilege.
LookupPrivilegeValue(NULL, SE_TCB_NAME, &tp.Privileges[0].Luid))

    // Enable the TCB Name privilege in the token.
tp.PrivilegeCount = 1;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

    if (!AdjustTokenPrivileges(hDupToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, 0))
    {
        DisplayError("AdjustTokenPrivileges");
           ...
    }

    if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
    {
        DEBUG( "Token does not have the necessary privilege.\n");
    } else {
        DEBUG( "No error reported from AdjustTokenPrivileges!\n");
    }                                                                                                                                                                                        // Never errors here

   DEBUG(LM_INFO, "Attempting setting of sessionId to: %d\n", consoleSessionId );

   if (!SetTokenInformation(hDupToken, TokenSessionId, &consoleSessionId, sizeof(DWORD)))
           *** ALWAYS FAILS WITH 1314 HERE ***

Toda la salida de depuración se ve bien hasta el SetTokenInformation llamada - veo sesión 0 es mi proceso actual período de sesiones, y en mi caso, tratando de establecer la sesión 1 (el resultado de la WTSGetActiveConsoleSessionId).(Tenga en cuenta que estoy registrado en el W2K8 cuadro a través de VNC, no RDC)

Así una de las preguntas:

  1. Es este enfoque válido, o son todos los servicios de procesos iniciados restringido a la sesión 0 intencionalmente?
  2. Hay un mejor enfoque (corto de "Iniciar en" inicio de sesión y de auto-inicio de sesión para los servidores?)
  3. Hay algo mal en este código, o una forma diferente de crear un token de proceso donde yo puede cambiar el id de sesión para indicar quiero generar el proceso en una nueva sesión?Hice trate de usar LogonUser en lugar de OpenProcessToken, pero que no funciona tampoco.(No me importa si todos los nuevos procesos comparten la misma no-cero de la sesión o no en este punto.)

Cualquier ayuda que se agradece mucho, gracias!

¿Fue útil?

Solución

Para cualquier persona interesada en la resolución de este problema:

He discutido este tema con MS de Apoyo para la LogonSDK equipo.Parece que no es posible totalmente suplantar a un usuario interactivo a través de programación, de tal manera que se obtenga una consola física y asociados GDI construcciones, y hemos sido esencialmente "suerte" que ha funcionado hasta ahora.Se confirmó que la sesión 0 el aislamiento era la raíz de la causa de la regresión.

Su recomendación es para habilitar el inicio automático de sesión para una sesión interactiva, y refactorizar el servicio a hablar de un nuevo componente de cliente en la sesión interactiva.Para abordar la seguridad desventaja de esto, se recomienda la implementación de una sustitución de la carcasa para colocar el servidor en un "Kiosco" el modo de inicio de sesión (por ejemplo,ningún Explorador de acceso sin credenciales apropiadas, etc.)

En la parte de arriba, este debería abordar las cuestiones que hemos estado encontrando con servicio de terminal sesiones de matar a nuestros aceleración de hardware.

Voy a ser la presentación de una solicitud a los estados miembros consideren que este tipo de "granja de render caso de uso" para "proxy sesión de usuario" en próximas versiones, de tal manera que un servidor puede generar hardware-acelerado los procesos sin poner en peligro la seguridad de que requieren de un cliente existente proceso de usuario para iniciar sesión en la consola.

Otros consejos

No he completado el curso de formación, pero he encontrado un "aislamiento de la Sesión 0 solución" tutorial en el Microsoft-sitio web de MSDN:

http://msdn.microsoft.com/en-us/windows7trainingcourse_sessionisolation_unit.aspx

Tengo el mismo período de sesiones-0-aislamiento problema que se manifiesta dentro de una tarea programada.

farmComm será el lanzamiento de la aplicación(s) de su elección en la sesión 0, con interfaz gráfica de usuario no visible, pero con acceso a hardware de gráficos, si los usuarios están conectados o no.También responde a la actividad del usuario en cualquier sesión activa (incluyendo la sesión 0 o el "seguro de escritorio," cuando la sesión activa).Está diseñado para ejecutar aplicaciones así cuando los usuarios están inactivos, y termina al usuario reanudar desde el ralentí, pero esas condiciones de operación podría ser fácilmente alterado en el origen de AutoHotkey secuencias de comandos.

https://github.com/r-alex-hall/farmComm

Genera aplicaciones en la sesión 0 "invisible", pero puede ser fácilmente modificado (el cambio de una variable con el valor de "ocultar" para "mostrar") para disponer de las GUIs de nuevos procesos visible (si es que tiene una interfaz gráfica de usuario).Si son visibles, sin embargo, pueden desencadenar Windows nags a ver "mensajes" en la sesión 0, y/o sólo será visible desde la sesión 0 (que, parece, se incluye el tiempo de las "computadoras de escritorio" es visible, por ejemplo cuando una estación de trabajo está bloqueado, o desconectado de las sesiones de usuario, o ningún usuario ha iniciado sesión).

En este escrito, si alguno de Escritorio Remoto (RDP) sesión está iniciada, mientras que los procesos generados por farmComm ejecutar, farmComm terminará de los procesos y el intento de re-lanzamiento para responder a la sesión RDP, que, si son aplicaciones que intentan acceder a hardware de gráficos, puede causar choque (porque RDP restringe el acceso a hardware de gráficos).Probablemente este RDP problema podría ser resuelto por los alrededores ...o usted puede ajustar la fuente de nunca terminar los procesos, o nunca migrar a otras sesiones.(NOTA:un posible cambio planificado es permitir que usted script si y cuando farmComm termina, no termina, se suspende o se reanuda procesos-o para el caso, el script se ejecute completamente diferentes procesos cuando los usuarios curriculum vitae de inactividad).

Los scripts pueden ser compilados a archivos ejecutables, que en mi distribución, están.

Los ejes de este conjunto de herramientas son una versión particular de paexec (que lanza aplicaciones en la sesión 0), y AutoHotkey muy fiable respuestas a la actividad del usuario (o falta de ella), y la recuperación de información del sistema acerca de una sesión.La opción para iniciar los procesos de "oculto" (con interfaz gráfica de usuario no visible) es también a través de AutoHotkey.

Divulgación:Yo secuencias de comandos (o codificado) farmComm, y publicado en el Dominio Público.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top