ついにやれるまで、私は数時間これにこだわっています。正しい方向を示したリンクが既にあります。
しかし、私は問題の簡単な概要が誰かを助けることができると思った:)。
実際の問題:(ウィキペディアから: 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);
}
そして、完全を期すために-MSDNはShellExecuteと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