c# eseguire privilegi - Come forzare il mio programma Win # C eseguito come amministratore su qualsiasi computer?




2 Answers

Puoi incorporare questo manifest nella tua 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>  
avviare solo

Come forzare il mio programma Win # C eseguito come amministratore su qualsiasi computer? e qualsiasi tipo di sistema operativo?

Ho bisogno di una soluzione di codice (qualsiasi codice di esempio sarà eccellente)

Grazie in anticipo




La risposta ovvia è di aggiungere un file manifest al progetto C # e aggiungere la seguente riga:

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

Ma può anche essere adottato un approccio non ortodosso. 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 di accesso in scrittura al registro.




Related