2010-08-30 11 views
24

Come forzare il mio programma C# Winforms come amministratore su qualsiasi computer? e qualsiasi tipo di sistema operativo?Come forzare il mio programma C# Winforms nell'esecuzione come amministratore su qualsiasi computer?

ho bisogno di soluzione di codice (qualsiasi codice di esempio sarà eccellente)

Grazie in anticipo

+0

Possibile duplicato di [Come forzare l'esecuzione dell'applicazione .NET come amministratore?] (Http://stackoverflow.com/questions/2818179/how-to-force-my-net-application-to-run-as -amministratore) – amens

risposta

43

È possibile incorporare questa manifesta nella vostra applicazione.

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

per i passaggi completi incluso come aggiungere un file manifest in VS http://philippsen.wordpress.com/tag/requestedexecutionlevel-manifest/ –

10

Ecco il codice di esempio per eseguire l'applicazione come amministratore.

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 

Impostare la ProcessStartInfo.Verb a “runas” saranno farlo funzionare come admin. Qui è legato FAQ

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

+1

Penso che OP stia chiedendo come forzare la sua applicazione a sottomettersi sempre con admin non come eseguire alcuna applicazione dall'app # ac in quanto l'amministratore –

+0

ha causato l'arresto anomalo dell'applicazione. – CodeIt

2

La risposta ovvia è quella di aggiungere un file manifesto per il progetto C# e aggiungere la seguente riga:

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

Ma, un approccio poco ortodosso può anche essere presa. Sappiamo che l'accesso al registro richiede privilegi di amministratore. Quindi, se si dispone di una funzione che contiene un accesso di scrittura del registro, la funzione genererà un System.Security.SecurityException se non si esegue il programma come amministratore. È implicito che devi chiamare questa funzione all'inizio del programma. Se viene generata questa eccezione, è possibile informare l'utente di eseguire il programma come amministratore e chiudere il programma.

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); 
    } 
} 

Qui, il true in linea rk = rk.OpenSubKey(registryPath, true) dice al programma che ha bisogno l'accesso in scrittura al Registro di sistema.

Problemi correlati