Po pierwsze zacznijmy od tego, że oprogramowanie powinno być zainstalowane tam, gdzie życzy sobie tego użytkownik — żadnego hardkodowania ścieżki, tym bardziej w katalogu z lokalnymi plikami użytkownika (jak to robi(ł) gówniany Chrome). Do tego powinien służyć instalator, który wymusza uruchomienie z uprawnieniami administratora — dzięki temu może wypakować pliki programu gdziekolwiek oraz uzupełnić rejestr w wymagane dane.
Program podczas startu powinien sprawdzać czy instalacja jest poprawna, czyli najpierw odczytywać swoją lokalizację z rejestru systemu (te dane dodaje do rejestru instalator), a następnie sprawdzać i ładować wymagane do działania pliki. Wszystkie pliki służące wyłącznie do odczytu, bez których program nie może poprawnie działać, powinny się znajdować w katalogu instalacji. Sam program, jeśli do swojego typowego działania nie wymaga uprawnień administratora, to nie powinien w ogóle ich żądać od użytkownika.
Jeśli program potrzebuje dynamicznie tworzyć pliki, np. z ustawieniami i innego rodzaju konfiguracjami, powinien te pliki tworzyć wewnątrz systemowego katalogu przeznaczonego do tego celu. Tutaj ważne jest to, że każdy program może swobodnie w tych katalogach zapisywać dane, nawet działając z najniższymi uprawnieniami. Przy czym możliwe jest zapisywanie danych tylko dla bieżącego użytkownika lub w taki sposób, aby były dostępne dla wszystkich użytkowników.
W przypadku, gdy program działa z podstawowymi uprawnieniami, ale niektóre jego funkcje wymagają uprawnień administratora, należy o nie poprosić użytkownika, tylko na potrzeby przeprowadzenia konkretnej operacji. Z tego co mi wiadomo, uprawnień działającego procesu nie da się dynamicznie zmienić, dlatego też rozwiązaniem jest uruchomienie innego pliku wykonywalnego (lub drugiej instancji tego samego programu), aby wykonała tę operację i natychmiast zakończyła działanie, zwracając rezultat do głównej instancji. To robi się za pomocą polecenia runas
, które w przypadku włączonego UAC, wyświetla systemowy dialog z prośbą o nadanie uprawnień administratora żądającej ich aplikacji.
Podsumowując, zadaniem instalatora jest wymuszenie uprawnień admina przy starcie, wypakowanie plików programu do wybranej przez użytkownika lokalizacji, uzupełnienie rejestru systemu w dane umożliwiające lokalizację instalacji oraz jej deinstalację (i wszelkich innych danych w chronionych gałęziach rejestru), a także jeśli potrzeba, stworzenie dedykowanego katalogu w systemowym folderze lokalnych danych użytkownika.
Zadaniem deinstalatora jest również wymuszenie uprawnień administratora, sprawdzenie poprawności instalacji, pobranie z rejestru ścieżki instalacji, usunięcie wszystkich plików programu oraz opcjonalnie danych zgromadzonych w katalogu z lokalnymi danymi, usuniecie danych z rejestru oraz samego siebie.
Sam program nie powinien wymagać uprawnień administratora, chyba że są one konieczne. Jeśli potrzebuje gdzieś zapisywać dane, to powinien to robić w przeznaczonych do tego celu katalogach. Jeśli użytkownik zechce zapisać dane w chronionym katalogu (np. w C:\Windows\
), to program tylko do tej operacji powinien pytać o podniesienie uprawnień — w przeciwnym razie powinien być napisany tak, aby reagował na odmowę dostępu (czyli miał dodaną pełną obsługę błędów). Jeśli program musi modyfikować dane rejestru systemu, to również musi dynamicznie prosić o uprawnienia admina, o ile modyfikacja dotyczy chronionych gałęzi (jak np. HKEY_LOCAL_MACHINE
).
Gdybyś potrzebował przykładu, to mogę taki podrzucić — w swoich edytorach implementowałem dynamiczne żebranie o uprawnienia admina, na potrzeby rejestracji ich lokalizacji na dysku oraz obsługiwanych przez nie rozszerzeń plików. Te dane trzeba dodać do chronionych gałęzi rejestru, takich jak HKEY_LOCAL_MACHINE
oraz HKEY_CLASSES_ROOT
, a to wymaga najwyższych uprawnień.