Come posso forzare l'esecuzione della mia applicazione .NET come amministratore?


876

Una volta che il mio programma è installato su un computer client, come posso forzare l'esecuzione del mio programma come amministratore su Windows 7?


3
Oltre a ciò che ha scritto Binary Worrier, potresti voler scrivere un po 'di codice per verificare se disponi dei privilegi di amministratore .. (è quello che stai chiedendo?)
lexu,

39
Non prenderei questo compito alla leggera, però, dovresti verificare a cosa serve effettivamente l'amministratore e vedere se riesci ad aggirarlo. Nessun cliente sarà felice di eseguire sempre un'app in modalità amministratore. Molti clienti più grandi non prenderanno nemmeno in considerazione un'app del genere e se il test del logo è importante per te, non passerà così.
Alex,

2
Alex è molto in discussione. Se possibile, elevare solo quando necessario, altrimenti entrano in gioco Criteri di gruppo, Controllo dell'account utente e una serie di altre variabili. Per lo meno, con UAC, l'utente dovrebbe autorizzare ogni esecuzione invece che solo quando viene eseguita un'azione specifica dell'utente.
Anthony Mason,

Il modo corretto è incorporare un file manifest nella tua applicazione.
Elmue,

Risposte:


1145

Ti consigliamo di modificare il manifest che viene incorporato nel programma. Funziona su Visual Studio 2008 e versioni successive: Progetto + Aggiungi nuovo elemento, selezionare "File manifest dell'applicazione". Cambia l' <requestedExecutionLevel>elemento in:

 <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

L'utente riceve il prompt UAC all'avvio del programma. Usa saggiamente; la loro pazienza può logorarsi rapidamente.


33
Se viene visualizzato un errore ClickOnce durante il tentativo di compilazione, vedere questa risposta: stackoverflow.com/questions/11023998/…
SSS

17
Il tuo progetto deve essere impostato per usare anche il manifest dell'app - in Proprietà progetto, controlla la scheda "Applicazione" e assicurati che "Manifest:" in "Risorse" sia impostato sul tuo app.manifest (o come lo hai chiamato. file manifest).
Victor Chelaru,

7
Ho dovuto ricaricare il progetto prima che VS mi chiedesse di riavviare in modalità amministratore.
Jon,

3
@Alejandro - Sì, UAC può essere disabilitato, ma quando lo è, l'app verrà eseguita automaticamente come amministratore (supponendo che l'utente disponga dei privilegi di amministratore), poiché la disabilitazione di UAC significa che tutto viene eseguito con il privilegio più alto a cui l'utente è autorizzato. È un po 'come lamentarsi che se si installa una serratura fantasia sulla porta, non funzionerà se la porta viene rimossa.
Erik Funkenbusch,

4
@ErikFunkenbusch Non "verrà eseguito automaticamente come amministratore", verrà eseguito con le normali autorizzazioni dell'utente (admin se l'utente è admin o standard se l'utente è standard). Affidarsi a quel caso particolare, anche se è l'impostazione predefinita, è ciò che i buoni programmi eviteranno come la peste. Seguendo la tua analogia, la serratura fantasia è bella e tutto, ma un software progettato correttamente deve anticipare il caso in cui l'intera porta viene rimossa, anche se è un evento raro.
Alejandro,

155

L'aggiunta di un requestedExecutionLevelelemento al tuo manifest è solo metà della battaglia; devi ricordare che UAC può essere disattivato. In tal caso, devi eseguire il controllo alla vecchia maniera e creare una finestra di dialogo di errore se l'utente non è amministratore
(chiama IsInRole(WindowsBuiltInRole.Administrator)il tuo thread CurrentPrincipal).


22
Potresti anche usare <requestedExecutionLevel level="highestAvailable" uiAccess="false" /> anche
Mark Kram

18
@MarkKram: cosa c'entra la più alta disponibilità con questo? La domanda riguarda la forzatura dell'amministratore, il valore più alto disponibile è meno restrittivo del requisito Amministratore e consentirà a un utente non amministratore di avviare l'app senza elevazione senza richiesta di controllo dell'account utente, verranno richiesti solo gli amministratori ...
Anders


Non ricordo più i dettagli esatti ma penso che questo dipenda da cosa intendi per disabili. Mettere il "cursore UAC" fino in fondo non equivale a disabilitare UAC (tranne su Vista). Se UAC è completamente disabilitato, l'intero meccanismo del livello di integrità è disabilitato ed è disponibile solo la classica funzionalità runas.exe di 2000 / XP. Il controllo del ruolo di amministratore gestisce il caso runas.exe.
Anders,

1
Ho impostato EnableLUA su 0 su Server 2008 R2 e mi sono rimosso dal gruppo Administrators, riavviato e ora un exe che specifica level = "requestAdministrator" viene eseguito senza alcuna richiesta
Tal Aloni,

87

I passaggi dettagliati sono i seguenti.

  1. Aggiungi il file manifest dell'applicazione alla soluzione
  2. Cambia l'impostazione dell'applicazione in "app.manifest"
  3. Aggiorna tag di "richiestoExecutionLevel" per richiedere Amministratore.

Aggiunta di file in Soluzione

Seleziona il file manifest dell'applicazione

Seleziona l'opzione Manifest

Aggiorna file manifest

Si noti che utilizzando questo codice è necessario disattivare le impostazioni di sicurezza di ClickOnce, per farlo, accedere a Proprietà -> Sicurezza -> Sicurezza ClickOnce


New Item...non è un'opzione nel mio progetto di servizio di installazione. Come farei per aggiungere l'app manifest? Posso aggiungerlo al mio progetto principale ma non è il programma di installazione.
HackSlash,

61

Ho implementato del codice per farlo manualmente:

using System.Security.Principal;
public bool IsUserAdministrator()
{
    bool isAdmin;
    try
    {
        WindowsIdentity user = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(user);
        isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);
    }
    catch (UnauthorizedAccessException ex)
    {
        isAdmin = false;
    }
    catch (Exception ex)
    {
        isAdmin = false;
    }
    return isAdmin;
}

45
Questo rileva solo se il contesto è in esecuzione come amministratore, non prevede che l'applicazione venga eseguita come amministratore come richiesto dall'OP
Matt Wilko,

5
Non credo che esista un modo programmatico per forzare un'applicazione a elevare i propri permanenti. Se ci fosse, sarebbe piuttosto un rischio per la sicurezza, no?
Mark Richman,

6
Sebbene la tua soluzione sia buona, ma la domanda era diversa. ;)
Yash,

vedere una versione refactored di questo metodo qui stackoverflow.com/a/50186997 (soggettivo)
Hakan Fıstık,

Questo non risponde alla domanda!
Elmue,


19

Mentre lavori su Visual Studio 2008, fai clic con il pulsante destro del mouse Project -> Add New Iteme scegli Application Manifest File.

Nel file manifest, troverai il tag requestedExecutionLevele puoi impostare il livello su tre valori:

<requestedExecutionLevel level="asInvoker" uiAccess="false" />

O

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

O

<requestedExecutionLevel level="highestAvailable" uiAccess="false" />

Per impostare la tua applicazione come amministratore, devi scegliere quella centrale.


Questo funziona Tuttavia, ha fatto apparire una finestra cmd vuota quando si esegue l'applicazione CMD (usando l'app c # cmd per eseguire qualche exe in background).
WM,

13

Come da

<requestedExecutionLevel level="highestAvailable" uiAccess="false" />

vorrai aggiungere un manifest dell'applicazione se non ne hai già uno o non sai come aggiungerne uno. Poiché alcuni progetti non aggiungono automaticamente un file manifest separato, prima vai alle proprietà del progetto, vai alla scheda Applicazione e controlla per assicurarti che il tuo progetto non escluda il manifest nella parte inferiore del tocco.

  • Quindi, fai clic con il pulsante destro del mouse sul progetto
  • Aggiungi un nuovo elemento
  • Infine, trova e fai clic su File manifest dell'applicazione

12

In Visual Studio 2010 fai clic con il pulsante destro del mouse sul nome del tuo progetto. Premi "Visualizza impostazioni di Windows", questo genera e apre un file chiamato "app.manifest". All'interno di questo file sostituisci "asInvoker" con "requestAdministrator" come spiegato nelle sezioni commentate all'interno del file.


6
Questa risposta riguarda VB.NET :-), non VS 2010 in generale. Le risposte "Aggiungi nuovo elemento" riguardano C #. In C ++ puoi farlo nelle impostazioni del progetto.
Philm,

12

Un altro modo per farlo, solo nel codice, è rilevare se il processo è in esecuzione come admin come nella risposta di @NG. . Quindi riaprire l'applicazione e chiudere quella corrente.

Uso questo codice quando un'applicazione necessita solo dei privilegi di amministratore quando viene eseguita in determinate condizioni, ad esempio durante l'installazione come servizio. Quindi non è necessario che funzioni sempre come amministratore come le altre risposte lo costringono.

Nota nel codice seguente NeedsToRunAsAdminè un metodo che rileva se nelle condizioni attuali sono richiesti i privilegi di amministratore. Se questo restituisce falseil codice non si eleverà da solo. Questo è un grande vantaggio di questo approccio rispetto agli altri.

Sebbene questo codice abbia i vantaggi sopra indicati, deve riavviarsi come nuovo processo che non è sempre quello desiderato.

private static void Main(string[] args)
{
    if (NeedsToRunAsAdmin() && !IsRunAsAdmin())
    {
        ProcessStartInfo proc = new ProcessStartInfo();
        proc.UseShellExecute = true;
        proc.WorkingDirectory = Environment.CurrentDirectory;
        proc.FileName = Assembly.GetEntryAssembly().CodeBase;

        foreach (string arg in args)
        {
            proc.Arguments += String.Format("\"{0}\" ", arg);
        }

        proc.Verb = "runas";

        try
        {
            Process.Start(proc);
        }
        catch
        {
            Console.WriteLine("This application requires elevated credentials in order to operate correctly!");
        }
    }
    else
    {
        //Normal program logic...
    }
}

private static bool IsRunAsAdmin()
{
    WindowsIdentity id = WindowsIdentity.GetCurrent();
    WindowsPrincipal principal = new WindowsPrincipal(id);

    return principal.IsInRole(WindowsBuiltInRole.Administrator);
}

1
+1 per l'approccio solo codice. Nota che hai bisogno di UAC abilitato per avere la possibilità di avviare qualsiasi cosa runascome amministratore da un utente non amministratore, altrimenti si aprirà silenziosamente con le autorizzazioni dell'utente corrente (spuntato su Windows 7 64 bit). Per quanto ne so, l'unica cosa che puoi fare con UAC disabilitato e manca il diritto di amministrazione è di fermare l'esecuzione in un momento opportuno.
reallynice

9

È possibile creare il manifest utilizzando le Impostazioni di sicurezza di ClickOnce e quindi disabilitarlo:

Right click on the Project -> Properties -> Security -> Enable ClickOnce Security Settings

Dopo aver fatto clic su di esso, verrà creato un file nella cartella delle proprietà del Progetto chiamato app.manifest una volta creato, è possibile deselezionare l' Enable ClickOnce Security Settingsopzione

Apri quel file e cambia questa riga:

<requestedExecutionLevel level="asInvoker" uiAccess="false" />

per:

 <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />

Ciò renderà il programma necessario i privilegi di amministratore.


7

Questa è una versione semplificata di questa risposta , sopra di @NG

public bool IsUserAdministrator()
{
    try
    {
        WindowsIdentity user = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(user);
        return principal.IsInRole(WindowsBuiltInRole.Administrator);
    }
    catch
    {
        return false;
    }
}

1
Questo non risponde alla domanda!
Elmue,

@Elmue è più logico aggiungere il tuo commento alla risposta originale che ho appena refactored, puoi trovare un link a quella risposta nella mia.
Hakan Fıstık,

-3

Fare clic con il tasto destro del mouse sull'eseguibile, selezionare Proprietà> Compatibilità e selezionare la casella "Esegui questo programma come amministratore".

Se vuoi eseguirlo come amministratore per tutti gli utenti, fai la stessa cosa in "cambia impostazione per tutti gli utenti".


4
Questo non risponde alla domanda. "Una volta che il mio programma è installato su un computer client", non "come faccio".
Joe,

Scusa se non sono chiaro. Una volta installato il programma, modifica questa impostazione nelle proprietà del tuo eseguibile (il tuo programma principale, non il programma di installazione). Vuole forzare l'esecuzione del suo programma come amministratore.
SlickJayD

2
È meglio impostare i requisiti di amministrazione nel manifest. Direi che risponde alla domanda, ma a malapena.
BradleyDotNET,

3
@Joe Per essere onesti, la risposta accettata non risponde alla domanda dei PO in quanto richiede la reinstallazione dell'applicazione exe. Non è certo una soluzione per "Una volta installato il mio programma". Se mai questa risposta declassata è più corretta della risposta accettata, quindi non capisco perché quella risposta abbia più di 400 voti.
NickG

In realtà, risponde perfettamente a entrambe le domande. Non ci sono molte possibilità di cambiare manifest dopo l'installazione e i programmi non dovrebbero cercare di elevare le loro autorizzazioni una volta in esecuzione - in molti ambienti - è un buon percorso per essere chiamato malware. Nella maggior parte delle aziende, questa risposta è la migliore perché mette a disposizione dell'utente e dei suoi permessi. Scrivo molto codice che non posso né "vedere" né eseguire una volta che è in produzione. Cerca di non essere più intelligente delle tue preoccupazioni di sicurezza.
jinzai,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.