ShellExecuteEx
ではなく、を使用してくださいShellExecute
。この関数は、作成されたプロセスのハンドルを提供します。これを使用してWaitForSingleObject
、そのハンドルを呼び出して、そのプロセスが終了するまでブロックできます。CloseHandle
最後に、プロセス ハンドルを呼び出して閉じるだけです。
サンプル コード (わかりやすく簡潔にするために、ほとんどのエラー チェックは省略されています):
SHELLEXECUTEINFO shExInfo = {0};
shExInfo.cbSize = sizeof(shExInfo);
shExInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
shExInfo.hwnd = 0;
shExInfo.lpVerb = _T("runas"); // Operation to perform
shExInfo.lpFile = _T("C:\\MyApp.exe"); // Application to start
shExInfo.lpParameters = ""; // Additional parameters
shExInfo.lpDirectory = 0;
shExInfo.nShow = SW_SHOW;
shExInfo.hInstApp = 0;
if (ShellExecuteEx(&shExInfo))
{
WaitForSingleObject(shExInfo.hProcess, INFINITE);
CloseHandle(shExInfo.hProcess);
}
に「runas」動詞を指定するとlpVerb
、起動しようとしているアプリケーションが UAC によって昇格されます。これは、アプリケーションのマニフェストでアクセス許可レベルを「requireAdministrator」に設定することと同じです。管理者と制限付きユーザーの両方に UAC 昇格が必要です。
ただし、絶対に必要な場合を除き、必要な実行レベルを指定する、起動するアプリケーションにマニフェストを追加する「標準」の方法を優先する必要があることに注意してください。この方法を使用する場合は、単純に「open」を として渡しますlpVerb
。サンプル マニフェストを以下に示します。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="X86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="requireAdministrator"
uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
最後に、UAC の昇格を必要とするプロセスの実行をトリガーするアプリケーション内の要素が、それに応じてマークされていることを確認してください。ユーザー インターフェイスでこれをモデル化するのはあなたの仕事です。Windows はそれを処理しません。これは、エントリ ポイントに盾のアイコンを表示することによって行われます。例えば:
