Podnoszenie uprawnień w trakcie działania programu C# (elevating permissions)

By | 11 maja 2013

Natrafiłem ostatnio na problem podnoszenia uprawnień w trakcie działania programu. Wiedziałem jak zrobić żeby wymusić uruchamianie aplikacji z odpowiednimi uprawnieniami, ale nie spotkałem się z kodem który umożliwiałby mi nagle w trakcie działania programu to zrobić.

elevate Dowiedziałem się przede wszystkim tego że gdy aplikacja zaczyna swoją pracę, dostaję uprawnienia, których w czasie działania tegoż programu nie można zmienić. Trochę mnie to zasmuciło, ale nie zaspokoiło mojej ciekawości, więc zacząłem drążyć w jaki sposób to obejść.

Jak się okazuje, wystarczy uruchomić nowy proces z podniesionymi uprawnieniami i można to rozwiązać to jako uruchomienie samego siebie z podniesionymi uprawnieniami, albo po prostu uruchomienie polecenia potrzebującego uprawnień w nowym procesie z wyższymi uprawnieniami.

Ja osobiście wybrałem sposób pierwszy czyli uruchomienie przez aplikację samej siebie, bo w ten sposób raz udzielone uprawnienia będą wiążące na cały czas działania programu.


using System;
using System.Diagnostics;
using System.Security.Principal;
namespace Praca_na_plikach
{
 class Program
 {

static Boolean czyAdministrator()
 {
 WindowsIdentity id = WindowsIdentity.GetCurrent();
 WindowsPrincipal principal = new WindowsPrincipal(id);
 return principal.IsInRole(WindowsBuiltInRole.Administrator);
 }

static void PodniesUprawnienia()
 {
 // Uruchamia samego siebie jako administrator
 ProcessStartInfo proc = new ProcessStartInfo();
 proc.UseShellExecute = true;
 proc.WorkingDirectory = Environment.CurrentDirectory;
 // W trybie aplikacji konsolowej odkomentować następną linijkę:
 // proc.FileName = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;
 // W trybie aplikacji okienkowej odkomentować następną linijkę:
 // proc.FileName = Application.ExecutablePath;
 proc.Verb = "runas";

try
 {
 Process.Start(proc);
 }
 catch
 {
 return;
 }
 }

static void Main(string[] args)
 {

 if (!czyAdministrator())
 {
 // wykonujemy funkcje podnoszącą uprawnienia
 PodniesUprawnienia();
 // uruchamia się ta sama aplikacja z podniesionymi
 // a ta ma ukończyć działanie dlatego return
 return;
 }
 else
 {
 // kod do wykonania po podniesieniu uprawnień
 Console.WriteLine("Podniesione uprawnienia!");
 Console.ReadKey();
 }

// Kod wykonywany zawsze i dla administratora i dla zwykłego użytkownika
 Console.WriteLine("Kod który ma się wykonać zawsze!");
 Console.ReadKey();
 }
 }
}

UWAGA!! Zależnie od tego czy piszemy aplikację konsolową czy też nie, musimy pamiętać o od komentowaniu jednej z linijek:


// W trybie aplikacji konsolowej odkomentować następną linijkę:
// proc.FileName = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;
// W trybie aplikacji okienkowej odkomentować następną linijkę:
// proc.FileName = Application.ExecutablePath;

Ponieważ bez tego program nie będzie w stanie się poprawnie wykonać (nie będzie wiedział jaki plik uruchomić jako administrator).

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *