web-dev-qa-db-ja.com

管理者権限を持たないアプリケーションの管理者権限が必要なアプリケーションを実行する方法

ついにやれるまで、私は数時間これにこだわっています。正しい方向を示したリンクが既にあります。

しかし、私は問題の簡単な概要が誰かを助けることができると思った:)。

24
Samuel

実際の問題:(ウィキペディアから: 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

30
Samuel