Domanda

Sfondo: sono affatto un Windows autorizzazioni di protezione / utente esperto. Ho un'applicazione (scritto in C #), che deve essere in grado di scrivere / cancellare file e cartelle nella sua directory root, scrivere / cancellare i file altrove sul disco, scrivere / modificare i valori in Registro di sistema (computer locale) e avviare & smettono di altre applicazioni e servizi. Ho capito che ho bisogno dei privilegi di amministratore per almeno alcune di queste azioni.

Ho provato a fare funzionare questo e su computer con UAC disattivato funziona benissimo senza ulteriori impostazioni. Tuttavia su computer con UAC acceso (qualsiasi livello superiore 'mai comunicare' in Windows 7) andrà in crash. Ho bisogno di lavorare su tutti i computer.

Fino ad ora vorrei solo controllare manualmente la casella di controllo "Esegui questo programma come amministratore" e tutto sarebbe andato bene. Comunque ora abbiamo deciso che ci consentirà ai clienti di installare questo software per conto proprio, e ha bisogno di eseguire "out of the box".

Ho un progetto di distribuzione in Visual Studio 2008 che installa tutto e scrive i necessari start up dei dati nella registrazione. Che cosa devo fare ora è quello di impostare il flag "Esegui questo programma come amministratore". Sto indovinando questo non è così semplice come mi piacerebbe che fosse.

Allora, qual è il modo corretto di fare questo? Questo programma viene avviato all'avvio, e sarebbe irritante per i nostri clienti, se UAC sarebbe pop-up (e possibilmente ridurre la luminosità dello schermo) ogni volta che riavviano il proprio computer.

Grazie per il vostro aiuto.

Modifica Grazie per le vostre risposte. Mi rendo conto che si lavora intorno UAC sarebbe visto di buon occhio, e posso vedere che Microsoft non supporta "liste bianche" quindi sarebbe chiedere il permesso solo una volta. Questo va bene io posso rispettare che, però io ho un po 'di follow-up domande:

  • Si può fornirmi un link che mostrarmi come elevare correttamente il programma per correggere stato elevato? Esiste una letteratura sulle quali sono le opzioni, ecc ... Fondamentalmente mi piacerebbe una guida UAC 101.

  • C'è un modo per elevare lo stato di sicurezza quando ho bisogno dei privilegi extra (e solo allora chiederà con UAC). Fondamentalmente questa applicazione viene eseguito in background, facendo per lo più nulla per la maggior parte del tempo. Ogni tanto si controllerà alcuni file (a questo punto sarà necessario essere in grado di scrivere su disco e leggere il Registro di sistema (sola lettura va bene a questo punto), ma dal momento che è una cartella temporanea non avrebbe importanza dove mi 'd metterlo. Se c'è un luogo in cui l'applicazione può scrivere senza alcun privilegio che sarebbe perfetto.)

    Tuttavia ad un certo punto dovrò preforme tutto il resto delle attività (utente ha bisogno di confermare questa azione in ogni caso), quindi se UAC avrebbe spinto a questo punto che sarebbe stato un problema. Esiste un modo per elevare solo a questo punto, e poi tornare a permessi di default?

  • Sarà un tale lavoro la soluzione con le versioni precedenti di Windows, compreso Vista e XP (e forse più anziani?) Che cosa sarebbe necessario per farlo funzionare?

È stato utile?

Soluzione

Il modo corretto è quello di elevare all'avvio del programma, con il prompt UAC (che è possibile impostare tramite manifesti del programma) -. Cercando di essere intelligente e di bypass è visto di buon occhio

Pensateci -? Se si potesse installare qualcosa che sarebbe elevare automaticamente senza il prompt UAC ... quale sarebbe il punto di UAC

Per aggiungere un manifesto UAC a un programma è sufficiente aggiungere il manifesto in un progetto e modificarlo. Un manifesto di esempio per il controllo dell'account utente è qui . Se si vuole elevare all'ultimo momento possibile, allora avete bisogno di un processo separato uova - non si può elevare un processo esistente. Quindi separare quel po 'fuori e poi avviarlo usando

Process.StartInfo.UseShellExecute = true;
Process.StartInfo.Verb = "runas";

Altri suggerimenti

È necessario ripensare come funziona l'applicazione. Sei del tutto corretto che sarebbe fastidioso per visualizzare un richiesta di elevazione al login. Quindi non farlo. D'altra parte, si può anche avere compiti che da eseguire utilizzando l'accesso amministrativo.

Quindi, si hanno due scelte:

  • Cambia i tuoi compiti in modo che essi non necessitano più di elevazione amministrativa (per esempio, scrivere i file altrove).
  • Suddividere l'applicazione in un componente di servizio Windows e un componente dell'interfaccia utente. Il componente di servizio può essere eseguito con un account elevata (si spera il almeno conto -elevated necessarie per svolgere i compiti che devi fare). Il componente interfaccia utente può parlare con il servizio (tramite named pipe o simili) in caso di necessità.

È possibile dividere il programma in due componenti:

  • un'applicazione utente che esegue senza elevazione
  • un servizio di Windows che è responsabile per le attività che richiedono l'elevazione

Dal momento che si sta utilizzando .NET, la comunicazione tra i componenti è probabilmente più facile fatto usando WCF.

E come nota a margine: la modifica dei file di programmazione in C: \ Program Files non è considerata buona pratica e potrebbe condurre a una serie di altri problemi. Windows ha dedicato posti per memorizzare le impostazioni di configurazione e altri dati di programma.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top