2012-07-20 9 views
20

Utknąłem w tej sprawie przez kilka godzin, aż w końcu udało mi się to zrobić. Istnieją już linki, które wskazał mi właściwy kierunek:Jak uruchomić aplikację, która wymaga uprawnień administratora, od osoby, która ich nie ma

Ale myślałem, że prosty opis problemu mógł komuś pomóc :).

+0

['LogonUser'] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa378184 (v = vs.85) .aspx) powinien działać dobrze, tak bym pomyślał. Wymienia tworzenie procesów bezpośrednio w opisie. – chris

+0

.... jakie jest twoje pytanie? –

+2

To nie jest rozwiązanie dla osób, które popadają w podobne kłopoty. – Samuel

Odpowiedz

27

prawdziwy problem: (z Wikipedii: http://en.wikipedia.org/wiki/User_Account_Control)

plik wykonywalny, który jest oznaczony jako „requireAdministrator” W swoim manifeście nie można uruchomić z nie-podwyższonej procesu przy użyciu CreateProcess(). Zamiast tego zostanie zwrócony błąd ERROR_ELEVATION_REQUIRED. Zamiast tego należy użyć ShellExecute() lub ShellExecuteEx().

(BTW, ERROR_ELEVATION_REQUIRED błąd == 740)

Rozwiązanie: (to samo miejsce)

w natywnej aplikacji Win32 te same "runas" czasownik może być dodawany do ShellExecute() lub wywołanie ShellExecuteEx().

ShellExecute(hwnd, "runas", "C:\\Windows\\Notepad.exe", 0, 0, SW_SHOWNORMAL);

Może to być również pomocne: (źródło: http://mark.koli.ch/2009/12/uac-prompt-from-java-createprocess-error740-the-requested-operation-requires-elevation.html)

2 - Podstawowe UAC Przepływ

Ok, więc przed kopać do niego, myślałem, że może być pomocnym w wyjaśnieniu podstawowego przepływu aplikacji obsługującej UAC i tego, jak wszystko razem pasuje. Zwykle twoja aplikacja działa jako nieuprzywilejowany użytkownik. Ale czasami musi to być Administrator (robić cokolwiek). Tak więc, oto podstawowa idea, w pseudo kod:

int main (int argc, char **argv) { 

    HRESULT operation = tryToDoSomethingPrivileged(); 

    if (operation == ACCESS_DENIED && !alreadyElevated) { 

    // Spawn a copy of ourselves, via ShellExecuteEx(). 
    // The "runas" verb is important because that's what 
    // internally triggers Windows to open up a UAC prompt. 
    HANDLE child = ShellExecuteEx(argc, argv, "runas"); 

    if (child) { 
     // User accepted UAC prompt (gave permission). 
     // The unprivileged parent should wait for 
     // the privileged child to finish. 
     WaitForSingleObject(child, INFINITE); 
     CloseHandle(pid); 
    } 
    else { 
     // User rejected UAC prompt. 
     return FAILURE; 
    } 

    return SUCCESS; 

    } 

    return SUCCESS; 

} 

Wreszcie, to jak mam to zrobić:

if(0 == CreateProcess(argv[2], params, NULL, NULL, false, 0, NULL, NULL, &si, &pi)) { 
     //runas word is a hack to require UAC elevation 
     ShellExecute(NULL, "runas", argv[2], params, NULL, SW_SHOWNORMAL); 
} 

i właśnie przez wzgląd na kompletność za - linki MSDN do ShellExecute i CreateProcess :

http://msdn.microsoft.com/en-us/library/bb762153%28v=vs.85%29.aspx

http://msdn.microsoft.com/en-us/library/ms682425%28VS.85%29.aspx

+0

Użyłem tego samego podejścia w jednej z moich aplikacji (wystawienie podwyższonej kopii samego siebie za pomocą "runas" w celu wykonania pojedynczego uprzywilejowanego zadania, gdzie wiersz polecenia dla potomnego procesu mówi mu, jakie zadanie wykonać) i chociaż Microsoft nie preferuje używania elewacji UAC, działa w przypadkach, gdy manifest UAC w głównym pliku .exe jest przesadny. Microsoft woli, aby uprzywilejowane zadanie znajdowało się w jego własnym pliku .exe z manifestem UAC na nim lub w jego własnym obiekcie COM, który jest tworzony za pomocą monikera COM Elevation. –

+3

ShellExecuteEx przyjmuje jeden argument, wskaźnik do SHELLEXECUTEINFO. http://msdn.microsoft.com/en-us/library/windows/desktop/bb762154(v=vs.85).aspx –

+1

Zauważyłem, że operacja "runas" nie jest wymieniona wśród innych, w dokumentacji (z ShellExecute): nawet niektórzy użytkownicy na tej stronie argumentowali, czy można z niego bezpiecznie korzystać. Fakt, że działa, nie jest tak niezawodny (ponieważ trzeba go ręcznie sprawdzić, aw niektórych przypadkach może nie działać) jako pewna dokumentacja stwierdzająca to. Czy jest ktoś, kto ma jakieś odniesienie do wiarygodności runas? – reallynice

Powiązane problemy