web-dev-qa-db-fra.com

Comment forcer mon programme C # Winforms à s'exécuter en tant qu'administrateur sur n'importe quel ordinateur?

Comment forcer l'exécution de mon programme C # Winforms en tant qu'administrateur sur n'importe quel ordinateur? et tout type d'OS?

J'ai besoin d'une solution de code (tout exemple de code sera excellent)

Merci d'avance

34
Gold

Vous pouvez intégrer ce manifeste dans votre application.

<?xml version="1.0" encoding="utf-8" ?> 
<asmv1:Assembly manifestVersion="1.0" xmlns="urn:schemas-Microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-Microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-Microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <assemblyIdentity version="1.0.0.0" name="MyApplication" />
    <trustInfo xmlns="urn:schemas-Microsoft-com:asm.v2">
        <security>
            <requestedPrivileges xmlns="urn:schemas-Microsoft-com:asm.v3">
                <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
            </requestedPrivileges>
        </security>
    </trustInfo>
</asmv1:Assembly>  
56
Alex Reitbort

Voici l'exemple de code pour exécuter votre application en tant qu'administrateur.

ProcessStartInfo proc = new ProcessStartInfo();
proc.UseShellExecute = true;
proc.WorkingDirectory = Environment.CurrentDirectory;
proc.FileName = Application.ExecutablePath;
proc.Verb = "runas";
try
{
    Process.Start(proc);
}
catch
{
    // The user refused the elevation.
    // Do nothing and return directly ...
    return;
}
Application.Exit();  // Quit itself

Réglez le ProcessStartInfo.Verb sur "runas" le laissera s'exécuter en tant qu'administrateur. Voici la FAQ connexe

http://social.msdn.Microsoft.com/Forums/en-US/winforms/thread/28f84724-af3e-4fa1-bd86-b0d1499eaefa#x_FAQAnswer91

12
Sandeep Pathak

La réponse évidente consiste à ajouter un fichier manifeste au projet C # et à ajouter la ligne suivante:

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

Mais une approche plutôt peu orthodoxe peut également être adoptée. Nous savons que l'accès au registre nécessite des privilèges d'administrateur. Donc, si vous avez une fonction qui contient un accès en écriture au Registre, la fonction lancera un System.Security.SecurityException Si vous n'exécutez pas le programme en tant qu'administrateur. Il est implicite que vous devez appeler cette fonction au début du programme. Si cette exception est levée, vous pouvez informer l'utilisateur d'exécuter le programme en tant qu'administrateur et de fermer le programme.

public void enforceAdminPrivilegesWorkaround()
{
    RegistryKey rk;
    string registryPath = @"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\";

    try
    {
        if(Environment.Is64BitOperatingSystem)
        {
            rk = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry64);
        }
        else
        {
            rk = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry32);
        }

        rk = rk.OpenSubKey(registryPath, true);
    }
    catch(System.Security.SecurityException ex)
    {
        MessageBox.Show("Please run as administrator");
        System.Environment.Exit(1);
    }
    catch(Exception e)
    {
        MessageBox.Show(e.Message);
    }
}

Ici, le true en ligne rk = rk.OpenSubKey(registryPath, true) indique au programme qu'il a besoin d'un accès en écriture au registre.

2
ihayet

Il a besoin du fichier Manifest. Placez simplement un fichier manifeste et choisissez AsInvoker ou AsAdministrator.

Si vous pouvez accéder au processus, vous pouvez utiliser proc.Verb = "runas";

Vérifiez ceci: http://social.msdn.Microsoft.com/Forums/en-US/winforms/thread/db6647a3-85ca-4dc4-b661-fbbd36bd561f

1
abhishek