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