2012-08-22 6 views
5

Mi aplicación usa SetSystemTime() para configurar el reloj de la PC desde una fuente de GPS. Esto funciona bien en Windows 7 con User Account Control deshabilitado, pero en Windows 8, incluso con UAC deshabilitado, falla. El error que recibo es ERROR_PRIVILEGE_NOT_HELD. El usuario que inició sesión en la máquina está en el grupo Administradores. Solo puedo hacer que funcione si ejecuto la aplicación como "Ejecutar como administrador" desde el menú contextual del archivo en el Explorador, pero el usuario que ha iniciado sesión ES un Administrador.No se puede establecer el reloj usando SetSystemTime en Windows 8

Entonces ... ¿qué debo hacer de manera diferente en Windows 8 para obtener SetSysytemTime() para trabajar? ¿Necesito aún más privilegios elevados que los derechos de administrador de los usuarios actuales? Si es así, ¿qué tiene privilegios más altos que el Administrador? ¿O debo configurar la cuenta de usuario de manera diferente para permitir que este tipo de llamadas funcionen en Windows 8?

EDITAR: Como se señala en los comentarios, el intento de habilitar manualmente el privilegio SE_SYSTEMTIME_NAME no funciona. Tampoco trata de agregar el privilegio utilizando el método MSDN sugerido de LsaAddAccountRights.

+0

El ángulo "UAC deshabilitado" es muy turbio, no se puede deshabilitar afaik. Casi definitivamente no está en Win8, la tubería subyacente se utiliza para proporcionar la caja de arena en la que se ejecutan las aplicaciones Metro. Necesitará un manifiesto para pedir elevación o iniciar su aplicación desde un proceso que ya está elevado. –

+0

Le da la opción de desactivar el UAC aún ... ¿entonces no está desactivado? ¡Que molesto! –

+2

"El proceso de llamada debe tener el privilegio SE_SYSTEMTIME_NAME. Este privilegio está deshabilitado de manera predeterminada. La función SetSystemTime habilita el privilegio SE_SYSTEMTIME_NAME antes de cambiar la hora del sistema y deshabilita el privilegio antes de regresar. Para obtener más información, vea Ejecutar con privilegios especiales." - tal vez en Windows 8, el privilegio no se habilita automáticamente y tienes que hacerlo tú mismo con AdjustTokenPrivileges()? Podría valer la pena intentarlo. –

Respuesta

3

Creo que podría estar relacionado con el hecho de que, con el UAC deshabilitado en Windows 8, los procesos (de forma predeterminada) se ejecutan en Integridad Media, no en Alta Integridad (consulte this post).

Creo que se necesita para solicitar requireAdministrator en su application manifest

+0

Gracias, Damien, eso tendría sentido. Qué molesto sin embargo.Entiendo por qué Microsoft quiere (/ necesito) hacer esto, simplemente rompe la necesidad de nuestra aplicación de sincronizar el reloj del sistema con nuestro servicio de servidor, ya que la aplicación del cliente debe poder ejecutarse sin interacción del usuario en muchos sistemas (algunos usuarios) no tendrá el inicio de sesión administrativo para elevar el proceso, pero la aplicación aún necesita ese nivel de permiso para hacer cosas de bajo nivel). Tendré que pensar en una solución provisional, supongo, ya que solicitar permisos elevados no es práctico. –

+1

@NickShaw - bueno, es * una operación privilegiada. Si los usuarios no tendrán permiso para realizar la operación, tal vez sea hora de volver a escribir (¿parte de?) Este programa como un servicio? –

+0

Lo curioso es que mi usuario conectado puede cambiar el reloj sin ninguna solicitud, pero mi aplicación que se ejecuta bajo el mismo usuario no puede, a menos que específicamente lo ejecute "como administrador". Estoy de acuerdo; tener un servicio de estas operaciones privilegiadas es probablemente la mejor manera de hacerlo. –

4

Si mueve el control deslizante hacia abajo UAC por completo en "Cuenta de Usuario Ajustes de control", significa que el UAC no mostrará ningún mensaje, pero todavía está habilitado. Cualquier proceso normal aún se ejecuta sin privilegios administrativos, pero la elevación (por "ejecutar como administrador" o por haber declarado "requireAdministrator") se realizará sin el consentimiento del usuario.

Desactivación de la Política de Seguridad "Control de cuentas de usuario: ejecutar todos los administradores en Modo de aprobación de administrador" o establecer la clave de registro "EnableLUA" a 0 va a cambiar este comportamiento, pero evitar que todo metro moderna interfaz de usuario de aplicaciones de funcionamiento.

Si sus usuarios no tienen derechos administrativos, no puede cambiar el reloj del sistema sin utilizar un servicio.

Si desea que su aplicación comience normalmente (pero sin derechos especiales) para usuarios normales y (auto-) eleve para administradores, puede declarar "highestAvailable" en su manifiesto.

+0

Gracias Félix, útil saber. ¡Parece que voy a escribir un servicio para hacer el trabajo! :) –

Cuestiones relacionadas