2011-10-12 23 views
7

Chcę wywołać aktualizator w celu sprawdzenia aktualizacji (w rzeczywistości nie należy aktualizować, a jedynie sprawdzać, czy istnieją). Chciałbym to zrobić w tle i po cichu. Jeśli jest aktualizacja, chciałbym poprosić użytkownika o podwyższone uprawnienia i uruchomić aktualizację z tym. Sprawdzenie polega na przeczytaniu pliku w katalogu aplikacji i porównaniu wersji znalezionej w tej aplikacji z tą na stronie internetowej.Jak uruchomić aplikację bez elewacji?

Jak uruchomić go bez elewacji tylko do sprawdzenia? QProcess::start() kończy się niepowodzeniem, ponieważ wymaga uprawnień podwyższonych i ShellExecute działa tylko wtedy, gdy dodaję czasownik "runas" z tego samego powodu (którego chcę tylko wtedy, gdy faktycznie byłby zapis w tym katalogu, tj. Chcę wykonać aktualizację). Zgaduję, że muszę dodać jakiś rodzaj manifestu, ale nie znam jego zawartości.

Odpowiedz

10

Tak więc okazało się, że miałem inny błąd, który powodował, że uruchomiona gałąź nie działała we wszystkich przypadkach. Model, który opisałem w poście, działa. Aby uniknąć systemu Windows wymagającego podwyższonych uprawnień, musisz dodać manifest zasobu. (Na przykład, jeśli nazwa exe aplikacji zawiera słowo „updater” zostanie wywołany)

Treść manifestu są następujące:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> 
     <security> 
      <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3"> 
       <requestedExecutionLevel level="asInvoker" uiAccess="false" /> 
      </requestedPrivileges> 
     </security> 
    </trustInfo> 
</assembly> 

Kompilacja go do .exe zależy Twój kompilator i środowisko, więc ja tylko pokazuję moje: Qt Creator i mingw-gcc:

Utwórz plik rc dla zasobów o następującej treści:

1 24 DISCARDABLE manifest.xml 

Dodaj plik rc do .pro tak:

win32:RC_FILE = resources.rc 

Po tym, ShellExecute bez paramter czasownika będzie działać bez uniesienia i używając „runas” będzie go uruchomić z elewacji.

+0

To jest mniej więcej to, co powiedziałem. –

+3

Podoba mi się ta odpowiedź lepiej. Mniej gadania, więcej kodu. –

0

Proponuję skorzystać z jednej z tych scenariuszy:

  • umieścić ten plik w profilu użytkownika zamiast ścieżki aplikacji
  • zawartość
  • kopię tego pliku do profilu użytkownika w przypadku jest to w trybie tylko do odczytu, a następnie uruchomić QProcess::start()
  • zawierać ten plik wewnątrz .qrc pliku następnie rozpakować go do profilu użytkownika w przypadku braku z odczytać lub uruchomić QProcess::start()
4

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:

  1. oddzielić Updater i Update Checker, tak, że są one w różnych plików EXE.
  2. Narzędzie UpdateChecker.exe nie wymaga uprawnień administratora, a zatem element manifestu ma wartość requestedExecutionLevel na poziomie asInvoker.
  3. 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.

+0

Dzięki za szczegółową odpowiedź! Zbadam problem jeszcze w poniedziałek i mogę pójść z rozwiązaniem podziału. Sprawdziłem manifest w wyUpdate (komercyjnym updater), który wykonuje zarówno sprawdzanie, jak i aktualizację i jest ustawiony na poziom uprawnień "asInvoker", który jest najniższy możliwy. Mogłem coś przeoczyć, może działać tak jak początkowo planowałem. Dam ci znać. –

+0

Zrobiłem, jeśli jesteś zainteresowany, sprawdź moją odpowiedź poniżej. –

+0

@ TamásSzelei Dzięki za opublikowanie aktualizacji. –