私はついにそれを行うことができるまで、私はこれに数時間立ち往生してきました。私に正しい方向を示したリンクはすでにあります:
しかし、私は問題の簡単な概要が誰かを助けることができると思いました:)。
私はついにそれを行うことができるまで、私はこれに数時間立ち往生してきました。私に正しい方向を示したリンクはすでにあります:
しかし、私は問題の簡単な概要が誰かを助けることができると思いました:)。
本当の問題:(ウィキペディアから:http://en.wikipedia.org/wiki/User_Account_Control)
マニフェストで「requireAdministrator」とマークされている実行可能ファイルは、CreateProcess()を使用して昇格されていないプロセスから開始することはできません。代わりに、ERROR_ELEVATION_REQUIREDが返されます。代わりに、ShellExecute()またはShellExecuteEx()を使用する必要があります。
(ところで、ERROR_ELEVATION_REQUIREDエラー== 740)
解決策:(同じサイト)
ネイティブのWin32アプリケーションでは、同じ「runas」動詞をShellExecute()またはShellExecuteEx()呼び出しに追加できます。
ShellExecute(hwnd, "runas", "C:\\Windows\\Notepad.exe", 0, 0, SW_SHOWNORMAL);
これも役立つ場合があります:(ソース:http://mark.koli.ch/2009/12/uac-prompt-from-java-createprocess-error740-the-requested-operation-requires-elevation.html)
2-基本的なUACフロー
さて、それを掘り下げる前に、UAC対応アプリケーションの基本的なフローとすべてがどのように組み合わされているかを説明することが役立つかもしれないと思いました。通常、アプリケーションは非特権ユーザーとして実行されます。ただし、管理者である必要がある場合もあります(何でもするため)。したがって、擬似コードでの基本的な考え方は次のとおりです。
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;
}
最後に、これは私がそれをした方法です:
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);
}
そして完全を期すために-ShellExecuteとCreateProcessへのMSDNリンク:
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