2012-08-22 17 views
5

La mia app utilizza SetSystemTime() per impostare l'orologio del PC da una sorgente GPS. Funziona bene in Windows 7 con Controllo account utente disabilitato, ma in Windows 8, anche con UAC disabilitato, fallisce. L'errore che torno è ERROR_PRIVILEGE_NOT_HELD. L'utente che ha effettuato l'accesso alla macchina si trova nel gruppo Administrators. Posso farlo funzionare solo se eseguo l'applicazione come "Esegui come amministratore" dal menu di scelta rapida del file in Esplora risorse - ma l'utente che ha effettuato l'accesso è un amministratore.Impossibile impostare l'orologio utilizzando SetSystemTime su Windows 8

Quindi ... cosa devo fare diversamente su Windows 8 per far funzionare SetSysytemTime()? Ho bisogno di privilegi ancora più elevati rispetto ai diritti di amministratore degli attuali utenti? In tal caso, quali sono i privilegi più elevati rispetto all'amministratore? O ho bisogno di impostare l'account utente in modo diverso per consentire a questi tipi di chiamate di funzionare su Windows 8?

MODIFICA: come indicato nei commenti, il tentativo manuale di abilitare il privilegio SE_SYSTEMTIME_NAME non funziona. Né tenta di aggiungere il privilegio utilizzando il metodo MSDN suggerito di LsaAddAccountRights.

+0

L'angolo "UAC disabilitato" è molto angusto, non può essere disabilitato afaik. Quasi sicuramente non su Win8, l'impianto idraulico sottostante viene utilizzato per fornire la sandbox in cui vengono eseguite le app Metro. Avrai bisogno di un manifest per chiedere l'elevazione o avviare la tua app da un processo che è già elevato. –

+0

Dà la possibilità di disattivare UAC ancora ... quindi è una specie di non effettivamente disattivato allora? Che noioso! –

+2

"Il processo di chiamata deve avere il privilegio SE_SYSTEMTIME_NAME Questo privilegio è disabilitato per impostazione predefinita.La funzione SetSystemTime abilita il privilegio SE_SYSTEMTIME_NAME prima di modificare l'ora di sistema e disattiva il privilegio prima di tornare.Per ulteriori informazioni, vedere Esecuzione con privilegi speciali." - Forse in Windows 8, il privilegio non è più abilitato automaticamente e devi farlo da solo con AdjustTokenPrivileges()? Potrebbe valere la pena provare. –

risposta

3

Penso che potrebbe essere correlato al fatto che, con UAC disabilitato su Windows 8, i processi (per impostazione predefinita) vengono eseguiti su Integrità media, non su Integrità elevata (vedere this post).

penso che è necessario richiedere requireAdministrator nella vostra application manifest

+0

Grazie a Damien, avrebbe senso. Quanto fastidioso però.Capisco perché Microsoft voglia (/ ha bisogno) di farlo, rompe semplicemente l'esigenza della nostra applicazione di sincronizzare l'orologio di sistema con il nostro servizio server, poiché l'app client deve essere in grado di funzionare senza l'interazione dell'utente in molti sistemi (alcuni utenti non avrà il login amministrativo per elevare il processo, ma l'app ha ancora bisogno di quel livello di autorizzazione per fare cose di basso livello). Dovrò pensare a una soluzione alternativa, suppongo, poiché la richiesta di autorizzazioni elevate non è pratica. –

+1

@NickShaw - beh, è ​​* un'operazione * privilegiata. Se gli utenti non hanno il permesso di eseguire l'operazione, forse è il momento di riscrivere (parte di?) Questo programma come un servizio? –

+0

La cosa strana è che il mio utente che ha effettuato l'accesso può cambiare l'orologio senza alcuna richiesta, ma la mia app in esecuzione con lo stesso utente non può farlo a meno che non la esegua specificamente "come amministratore". Sono d'accordo però; avere un servizio fare queste operazioni privilegiate è probabilmente il modo migliore per andare. –

4

Se si sposta il cursore verso il basso UAC completamente in "impostazioni Controllo account utente", vuol dire che UAC non mostrerà alcuna richiesta, ma è ancora abilitato. Qualsiasi normale processo continua a funzionare senza privilegi amministrativi, ma elevando ("esegui come amministratore" o dichiarando "requireAdministrator") avverrà senza il consenso dell'utente.

disattivazione della politica di sicurezza "Controllo account utente: esegui tutti gli amministratori in modalità Approvazione amministratore" o impostando la chiave di registro "EnableLUA" per 0 cambierà questo comportamento, ma evitare che tutti Metro moderna interfaccia utente Apps da corsa.

Se gli utenti non dispongono di diritti amministrativi, non è possibile modificare l'orologio di sistema senza utilizzare un servizio.

Se si desidera che l'applicazione si avvii normalmente (ma senza diritti speciali) per gli utenti normali e (auto-) elevare per gli amministratori, è possibile dichiarare "highestAvailable" nel manifest.

+0

Grazie Felix, utile sapere. Sembra che scriverò un servizio per fare il lavoro allora! :) –

Problemi correlati