czwartek, 15 lipca 2010

Jak wspierać mechanizm UAC w aplikacji opartej o .NET[PL]

Promuj
UAC, to z j. ang. User Account Controll, czyli technologia wprowadzona w Windows Vista (i dalej utrzymywana w Windows 7) zapobiegająca uruchamianiu aplikacji z podwyższonymi uprawnieniami. Przy uruchamianiu aplikacji, która wymaga zwiększonych uprawnień, użytkownik musi wyrazić jawną zgodę na uruchomienie, a aplikacja powinna zadbać o to by się w odpowiednim momencie o to spytać.
Jak obsłużyć UAC w .NET? Załóżmy, że tworzymy aplikację (UAC-test.exe), która powinna pracować na koncie Administratora, czyli przed uruchomieniem powinno pojawić się odpowiedni monit, w którym aplikacja żąda większych uprawnień. Jak to zrobić?
Nic prostszego dodajemy „Application Manifest” do naszego projektu i w odpowiednim miejscu (wewnątrz elementów: assembly/trustInfo/security) dodajemy linię (lub modyfikujemy istniejącą):
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> 
I teraz mamy już odpowiedni monit:

Promuj

4 komentarze:

  1. Ciekawa i przydatna informacja. Dobrze że wywołanie jest takie proste. Jednak szkoda, że tak niewiele opisałeś. Zaraz po przeczytaniu naszły mnie wątpliwości co do tego, czy ta linijka wywołuje tylko monit, czy od razu nadaje aplikacji prawa administratora i mogę sobie tworzyć katalogi i pliki w dowolnym miejscu na dysku

    OdpowiedzUsuń
  2. Ciekawy wpis, aczkolwiek zastanawia mnie jak aplikacja może otrzymać uprawnienia za pomocą UAC w czasie pracy. Czy wogóle możliwe jest osiągnięcie tego z poziomu kodu .NET?

    OdpowiedzUsuń
  3. Red - O ile wiem nie da się zmienić poziomu praw aplikacji podczas działanie.
    Da się jedynie zrestartować aplikację z przywilejami, albo uruchomić drugą.
    http://www.codeproject.com/KB/vista-security/UAC_Shield_for_Elevation.aspx

    OdpowiedzUsuń
  4. @Anonimowy
    Jeżeli chodzi o pytanie, czy powyższy sposób to wywołanie samego monitu, czy też przyznanie uprawnień, to odpowiedź brzmi jedno i drugie, pod warunkiem, że użytkownik wyrazi zgodę i dysponuje odpowiednimi uprawnieniami w systemie (np. ma uprawnienia administratora, a UAC blokuje je i ustanawia je na poziomie standardowego użytkownika).
    Oprócz wspomnianego przeze mnie poziomu "requireAdministrator", są jeszcze inne: domyślny "asInvoker" (bez zmiany uprawnień) oraz "highestAvailable" (w którym przyznawane są najwyższe możliwe uprawnienia). Na stronie: http://msdn.microsoft.com/en-us/library/bb756929.aspx dostępne są tabelki informujące co stanie się z uprawnieniami dla pewnego użytkownika, przy pewnym żądaniu i dla określonej reakcji użytkownika.
    @Red
    Przyznam, że nie znam sposobu, by aplikacja .NET nabywała nowych uprawnień w trakcie działania (na pewno jest możliwe uruchomienie innej aplikacji z poziomu naszej, dla której nowe uprawnienia zostaną przyznane, w ten sposób możemy sprawić wrażenie, że uprawnienia się zmieniają), polecam też przeczytać na MSDN artykuł: Designing UAC Applications for Windows Vista (http://msdn.microsoft.com/en-us/library/bb756973.aspx).
    @TJ
    Dzięki za link i głos w tym temacie!

    OdpowiedzUsuń

Posty powiązane / Related posts