c# - visual - è necessario un assembly con nome sicuro.(eccezione da hresult: 0x80131044)




Come impone l'esecuzione della mia applicazione.NET come amministratore? (8)

È possibile incorporare un file manifest nel file EXE, che farà sì che Windows (7 o versione successiva) esegua sempre il programma come amministratore.

Puoi trovare ulteriori dettagli nel Passaggio 6: Creare e incorporare un Application Manifest (UAC) (MSDN).

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


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".


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

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

questa è la versione semplificata di questa answer

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




elevated-privileges