Cleaner .NET – Problem z UAC rozwiązany! | DSP 2017 #5

W tym tygodniu zająłem się naprawianiem błędu, o którym wspomniałem w ostatnim wpisie. Na czym polegał i jak go rozwiązałem? Tego dowiesz się czytając dalej 😉

Zmiany wprowadzone od ostatniego tygodnia

Od ostatniego tygodnia udało mi się przede wszystkim naprawić błąd występujący w aplikacji, który powstał… w wyniku dodania do niego modułu czyszczącego rejestr. Cóż, czasem bywa tak, że dodanie nowej funkcjonalności potrafi zepsuć coś innego. Zresztą… na pewno też to znacie. U mnie nie było inaczej.

Podczas pisania modułu czyszczącego rejestr szybko przekonałem się, że aby usuwać z niego niektóre klucze, potrzebuję uprawnień administratora. Nie zastanawiając się więc zbytnio… po prostu ustawiłem w manifeście aplikacji konieczność uruchamiania jej z takimi uprawnieniami. Okazało się jednak(co zauważyłem dopiero później), że w przypadku, kiedy użytkownik uruchamiający aplikację nie posiada uprawnień administratora, musi siłą rzeczy uruchomić tę aplikację, jako inny użytkownik (czyt. taki, który te uprawnienia ma). W wyniku takiego stanu rzeczy aplikacja uzyskiwała dostęp do folderów z danymi nie obecnie zalogowanego użytkownika, tylko tego, którego dane podano w okienku UAC (z uprawieniami administratora). Co z resztą jest dosyć logiczne… W końcu m.in metoda Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) zwraca ścieżkę do folderu %appdata% użytkownika, który aplikację uruchomił. Skoro aplikacja uzyskała ścieżki do folderów administratora, to pliki były usuwane właśnie z nich… a przecież użytkownik powinien wyczyścić swoje dane, a nie administratora 😉

Rozwiązanie: Nieuruchamianie aplikacji z uprawnieniami administratora.

Niby bardzo proste, tylko w tym momencie aplikacja nie będzie mogła usuwać większości kluczy rejestru. I tutaj koło się zamyka… Jednak dzięki podpowiedzi pewnego użytkownika z forum 4programmers, wpadłem na pomysł, aby operację usuwania kluczy rejestru realizował inny proces, który będzie domyślnie uruchamiany z uprawnieniami administratora. Jak pomyślałem, tak też zrobiłem i przeniosłem logikę odpowiedzialną za usuwanie kluczy z Cleaner’a do nowego projektu, który po kompilacji jest prostą aplikacją przyjmującą w argumentach klucze lub wartości rejestru przeznaczone do usunięcia. Następnie je… usuwa. Jeżeli wszystko pójdzie dobrze, proces zwraca liczbę 0, jeżeli nie to liczbę 1. Aplikację można z powodzeniem obsługiwać przy pomocy wiersza poleceń, w taki sposób:

W taki sposób też używa jej Cleaner .NET. Na początku przeszukuje rejestr w poszukiwaniu zbędnych kluczy, następnie tworzy komendę wywołującą aplikację RegCleaner.exe, po czym ją wywołuje z odpowiednimi argumentami i czeka, aż proces zakończy działanie. Bardzo proste 😉

Z tego też powodu monit z prośbą o nadanie praw administratora pojawi się dopiero po kliknięciu przycisku „Usuń wybrane wpisy”:

Jeżeli jednak ktoś się rozmyśli i nie udzieli programowi takich praw… Cleaner oczywiście o tym poinformuje 🙂

Jeżeli z jakiegoś powodu, któryś z kluczy nie zostanie usunięty, również zostanie wyświetlony odpowiedni monit. Powyższe podejście całkowicie rozwiązało występujący wcześniej problem, przynajmniej tak mi się wydaje 😉

Z innych nowości, stworzyłem dla programu prosty instalator przy pomocy oprogramowania NSIS. Zresztą… jest już dostępny w zakładce „Moje projekty”. Można śmiało pobierać i… testować. Oczywiście jestem otwarty na zgłoszenia błędów/propozycje nowych funkcji.

Tyle ode mnie. Po kolejną garść nowości w projekcie zapraszam w przyszłym tygodniu, a jeszcze w tym na wpis na temat Xamarin’a, bo i taki się pojawi 😉

140 total views, 1 views today