Domanda

Una volta installato il mio programma su una macchina client, come faccio a forzare il mio programma a funzionare come amministratore su Windows 7?

È stato utile?

Soluzione

Ti consigliamo di modificare il manifest che viene incorporato nel programma. Funziona su Visual Studio 2008 e superiore: progetto + Aggiungi nuova elemento, selezionare "File manifest dell'applicazione". Cambiare il <requestedExecutionLevel> elemento a:

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

L'utente ottiene il Uac prompt quando iniziano il programma. Usare saggiamente; La loro pazienza può consumarsi rapidamente.

Altri suggerimenti

Aggiungendo un requestedExecutionLevel L'elemento per il tuo manifest è solo metà della battaglia; Devi ricordarlo Uac può essere spento. In tal caso, è necessario eseguire il controllo della vecchia scuola e creare una finestra di dialogo Errore se l'utente non è amministratore
(chiamata IsInRole(WindowsBuiltInRole.Administrator) Sul tuo thread's CurrentPrincipal).

I passaggi dettagliati sono i seguenti.

  1. Aggiungi il file manifest dell'applicazione alla soluzione
  2. Modifica l'impostazione dell'applicazione in "App.Manifest"
  3. Aggiorna il tag di "RequededExecutionLevel" a RequisiteAdMinistar.

Adding file in Solution

Select Application Manifest File

Select Manifest option

Update Manifest file

Si noti che utilizzando questo codice è necessario disattivare le impostazioni di sicurezza di ClickOnce, per farlo, vai all'interno delle proprietà -> Sicurezza -> ClickOnce Security

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;
}

È possibile incorporare un file manifest nel file EXE, che farà eseguire sempre Windows (7 o più) per eseguire sempre il programma come amministratore.

Puoi trovare maggiori dettagli in Passaggio 6: creare e incorporare un manifest dell'applicazione (UAC) (MSDN).

Mentre si lavora su Visual Studio 2008, fare clic con il tasto destro su Project -> Add New Item e poi ho scelto Application Manifest File.

Nel file manifest, troverai il tag requestedExecutionLevel, e 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 l'applicazione in esecuzione come amministratore, devi scegliere quello centrale.

Secondo

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

Ti consigliamo di 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, vai prima alle proprietà del progetto, vai a Applicazione Scheda e controlla per assicurarsi che il progetto non escluda il manifest nella parte inferiore del rubinetto.

  • Successivamente, Progetto di clic destro
  • Aggiungi un nuovo elemento
  • Ultimo, trova e fai clic su File manifest dell'applicazione

In Visual Studio 2010 Fare clic con il tasto destro del mouse sul nome del progetto. Premi "Visualizza le impostazioni di Windows", questo genera e apre un file chiamato "App.Manifest". All'interno di questo file sostituire "Asinvoker" con "RequisitiAdMinistator" come spiegato nelle sezioni commentate all'interno del file.

Un altro modo di farlo, solo nel codice, è rilevare se il processo è in esecuzione come amministratore come in La risposta di @ng.. E poi apri di nuovo l'applicazione e chiudi quella attuale.

Uso questo codice quando un'applicazione necessita di privilegi di amministrazione solo quando eseguita in determinate condizioni, ad esempio quando si installa come servizio. Quindi non è necessario funzionare come amministratore sempre come le altre risposte lo costringono.

Nota nel codice seguente NeedsToRunAsAdmin è un metodo che rileva se in condizioni attuali sono richiesti i privilegi di amministratore. Se questo ritorna false Il codice non si eleverà. Questo è un grande vantaggio di questo approccio rispetto agli altri.

Sebbene questo codice abbia i vantaggi sopra indicati, è necessario rilanciarsi come un nuovo processo che non è sempre quello che vuoi.

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);
}

Questa è una versione semplificata di questo Rispondere, sopra da @ng

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

È possibile creare il manifest utilizzando le impostazioni di sicurezza clickonce e quindi disabilitarlo:

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

Dopo averlo fatto clic, verrà creato un file nella cartella Proprietà del progetto chiamato app.Manifest Una volta creato questo, puoi deselezionare il Enable ClickOnce Security Settings opzione

Apri quel file e modifica questa riga:

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

a:

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

Ciò renderà il programma richiedere privilegi di amministratore.

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

Se si desidera eseguirlo come amministratore per tutti gli utenti, fai la stessa cosa in "Modifica impostazione per tutti gli utenti".

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