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
['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
.... jakie jest twoje pytanie? –
To nie jest rozwiązanie dla osób, które popadają w podobne kłopoty. – Samuel