c# necessario - Come impone l'esecuzione della mia applicazione.NET come amministratore?




strip agility (11)

Una volta che il mio programma è installato su un computer client, come posso forzare il mio programma a funzionare come amministratore su Windows 7?


Answers

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

Aggiungere un elemento requestedExecutionLevel al manifest è solo metà della battaglia; devi ricordare che il UAC può essere disattivato. Se lo è, devi eseguire il controllo del vecchio modo di scuola e aprire una finestra di errore se l'utente non è un amministratore
(chiama IsInRole(WindowsBuiltInRole.Administrator) sul CurrentPrincipal del tuo thread).


Fai clic con il tasto destro del mouse sul tuo eseguibile, vai su Proprietà> Compatibilità e seleziona la casella "Esegui questo programma come amministratore".

Se desideri eseguirlo come amministratore per tutti gli utenti, fai la stessa cosa in "modifica impostazioni per tutti gli utenti".


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

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

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


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 verifica che il tuo progetto non stia escludendo il manifest nella parte inferiore del rubinetto.

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

Puoi creare il manifest usando ClickOnce Security Settings, e poi disabilitarlo:

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

Dopo averlo fatto clic, verrà creato un file nella cartella delle proprietà del progetto chiamato app.manifest una volta creato, è possibile deselezionare l'opzione Enable ClickOnce Security Settings

Apri quel file e cambia questa linea:

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

a:

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

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


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


Mentre si lavora su Visual Studio 2008, fare clic con il tasto destro su Project -> Add New Item e quindi scegliere 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 la tua applicazione per l'esecuzione come amministratore, devi scegliere quella centrale.



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

Uso questo codice quando un'applicazione richiede solo privilegi di amministratore quando viene eseguita in determinate condizioni, ad esempio quando si installa come un servizio. Quindi non ha bisogno di funzionare come amministratore tutto il tempo, come le altre risposte lo forzano.

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

Sebbene questo codice abbia i vantaggi sopra indicati, ha bisogno di rilanciare se stesso 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);
}

È necessario prendere in considerazione la codifica, poiché 1 carattere può essere rappresentato da 1 o più byte (fino a circa 6) e le codifiche differenti gestiranno questi byte in modo diverso.

Joel ha un post su questo:

joelonsoftware.com/articles/Unicode.html





c# .net windows-7 administrator elevated-privileges