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