2010-08-30 11 views
24

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

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

Merci à l'avance

+0

Copie possible de [Comment forcer l'exécution de mon application .NET en tant qu'administrateur?] (Http://stackoverflow.com/questions/2818179/how-to-force-my-net-application-to-run-as -administrateur) – amens

Répondre

43

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> 
+13

pour les étapes complètes, y compris comment ajouter un fichier manifeste dans VS http://philippsen.wordpress.com/tag/requestedexecutionlevel-manifest/ –

10

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 à « runas » va le laisser fonctionner en tant qu'administrateur. Voici lié FAQ

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

+1

Je pense que OP demande comment forcer son application à toujours sous avec admin priv pas comment exécuter une application à partir de l'application AC# en tant qu'administrateur –

+0

cela a causé mon application de planter .. – CodeIt

2

La réponse évidente est d'ajouter un fichier manifeste au projet C# et ajoutez la ligne suivante:

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

Mais, peut aussi adopter une approche plutôt peu orthodoxe. 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 de 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 dans la ligne rk = rk.OpenSubKey(registryPath, true) indique au programme qu'il a besoin d'un accès en écriture au registre.