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

Comment forcer mon programme C# Winforms à s'exécuter en tant qu'administrateur sur n'importe quel ordinateur ? et tout type de système d'exploitation ?

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

Merci d'avance

25
demandé sur Mehrad 2010-08-30 12:10:03

4 réponses

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>  
45
répondu Alex Reitbort 2011-11-20 10:38:41

Voici un 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

Définissez le ProcessStartInfo.Verbe to "runas" va le laisser fonctionner en tant qu'administrateur. Voici FAQ connexes

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

11
répondu Sandeep Pathak 2011-11-20 10:39:56

La réponse évidente est d'ajouter un fichier manifeste au projet C# et d'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 peut informer l'utilisateur pour exécuter le programme en tant qu'administrateur et 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 dans la ligne rk = rk.OpenSubKey(registryPath, true) indique au programme qu'il a besoin d'un accès en écriture au registre.

2
répondu ihayet 2016-09-26 12:41:59

Il a besoin du fichier manifeste. Il suffit de placer un fichier manifeste et choisissez AsInvoker ou AsAdministrator.

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

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

1
répondu abhishek 2010-08-30 08:24:09