2012-01-18 17 views
11

Sto sviluppando un programma del disco della partizione e per me per leggere il \\\\.\\PhysicalDrive0 ho bisogno dei diritti di admin.È possibile che l'eseguibile richieda i diritti di amministratore? (Windows 7)

Mi chiedo se è possibile, nel tempo di esecuzione, che il programma ottenga i diritti di amministratore? C'è qualche win api per questo?

Voglio farlo perché voglio che il programma venga eseguito con diritti di amministratore solo quando sta leggendo/scrivendo il disco. Per ragioni di sicurezza, non voglio che il programma esegua tutto il tempo con i diritti di amministratore, perché qualcuno potrebbe trovare un bug (stack o heap overflow per esempio) in qualche modulo ed eseguire comandi arbitrari come adm.

+0

No. Dovresti spostare quel codice in un altro progetto .exe che presenta un manifest che richiede il permesso di elevazione UAC. Avvia quello .exe quando necessario. –

+0

Grazie per tutte le risposte! Il trucco di separare il processo farà il lavoro. –

+1

@HansPassant: non necessariamente _another_ .exe. Guarda Task Manager, che si riavvia con i diritti di amministratore se scegli "Visualizza processi per tutti gli utenti". – MSalters

risposta

13

Non si può acquisire privilegi elevati dopo che il processo è iniziato. Le opzioni disponibili sono:

  1. Inserire la parte dell'applicazione che richiede privilegi elevati in un processo separato e manifestarla con requireAdministrator.
  2. Eseguire la parte dell'applicazione che richiede privilegi elevati come oggetto COM out-of-proc. Propeties
+0

Vedere [questo articolo] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms679687 (v ​​= vs.85) .aspx) in MSDN per il metodo di elevazione COM. – Deanna

5

Non ho mai visto un modo per trasferire i diritti dopo l'avvio di un processo. L'unico modo che conosco è che il processo sia creato come privilegiato.

Non vedo l'ora altre risposte in caso ci sia un altro modo.

(aggiornamento)
L'articolo Teach Your Apps To Play Nicely With Windows Vista User Account Control (circa a metà) conferma che i diritti di amministratore possono essere concessi solo al momento della creazione del processo.

+0

Il collegamento è interrotto. –

+0

@bronzeman: corretto. – wallyk

2

hai bisogno di incorporare manifesta con requireAdministrator bandiera

http://msdn.microsoft.com/en-us/library/bb756929.aspx

+0

Nessuna domanda. – Voo

+0

Così come il programma richiede l'accesso a parti di computer di basso livello, non vedo alcun motivo per cui non dovrebbe funzionare con i privilegi di amministratore.La stessa ragione si applicherebbe ai sottoprocessi privilegiati avviati ogni volta che l'operazione priviligata deve essere eseguita –

+2

Per esattamente la stessa ragione per cui OpenSSH non sta eseguendo tutto con i diritti di root, solo perché deve ascoltare alla porta 22. Qualsiasi altra cosa è orribile design e viola uno dei principi più basilari della progettazione sicura del codice. [C'è anche un articolo su wiki] (http://en.wikipedia.org/wiki/Privilege_separation) – Voo

1

del progetto (Alt + Invio) -> Linker -> manifest -> Livello esecutivo UAC (in VS2015, nel 2010 è simile) -> requireAdministrator o highestAvailable

Edit: Inoltre, se è l'aggiornamento del programma, semplicemente fai in modo che il nome del tuo programma inizi con Update e Windows lo riconoscerà automaticamente.

Problemi correlati