Monit wysokości pojawia się, gdy aplikacja tego zażąda, z jakiegoś powodu. Możesz kontrolować go za pomocą manifestu aplikacji. Przeczytaj artykuł Create and Embed an Application Manifest (UAC), aby uzyskać szczegółowe informacje na temat dodawania manifestu.
Proponuję następujące:
- oddzielić Updater i Update Checker, tak, że są one w różnych plików EXE.
- Narzędzie UpdateChecker.exe nie wymaga uprawnień administratora, a zatem element manifestu ma wartość
requestedExecutionLevel
na poziomie asInvoker
.
- Updater.exe wymaga uprawnień administratora, ponieważ zapisuje zaktualizowany plik aplikacji w Program Files. Dlatego element jej manifestu ma poziom
requireAdministrator
.
W swoim programie możesz uruchomić UpdateChecker.exe w dowolny sposób. Aby uruchomić Updater.exe, będziesz musiał użyć ShellExecute
; jeśli aplikacja ma manifest (i zdecydowanie polecam ten manifest osadzania), pokaże monit UAC o podniesienie, jeśli aplikacja chce mieć uprawnienia administratora. Nie trzeba używać czasownika runas
.
Można również sprawdzić, czy aktualizacja jest dostępna w głównej aplikacji. Uruchom narzędzie Updater.exe tylko wtedy, gdy na serwerze jest nowa wersja.
Inną opcją jest sprawienie, aby Updater.exe zarówno sprawdzał dostępność aktualizacji, jak i ją stosował, jeśli takowy istnieje, tak jak teraz. W tym przypadku program Updater.exe powinien mieć w manifeście poziom asInvoker
. Po uruchomieniu, bez parametrów, sprawdza, czy na serwerze jest nowa wersja.Jeśli znajdzie nowszą wersję, to ponownie uruchamia się z uprawnieniami administratora i przekazuje parametr wiersza polecenia, na przykład /doUpdate
, który nakazuje mu wykonanie aktualnej aktualizacji.
W celu ponownego uruchomienia sama podwyższone, to musi użyć ShellExecute
funkcję i runas
czasownik, ponieważ ShellExecute
nie będzie w stanie wykryć automatycznie swoją Updater.exe teraz wymaga uprawnień administratora.
Należy pamiętać, że czasownik runas
różni się w zależności od systemu Windows XP i Windows Vista/7, więc należy zająć się tą sytuacją, jeśli chce się obsługiwać poprzednie wersje systemu Windows. Pierwsze opisane przeze mnie podejście będzie działać w systemie Windows XP bez dodatkowej obsługi.
To jest mniej więcej to, co powiedziałem. –
Podoba mi się ta odpowiedź lepiej. Mniej gadania, więcej kodu. –