実行時にオペレーティングシステムから管理者権限を要求するために、Windowsで実行されているC++アプリケーションを取得することは可能ですか?
コンパイル時に実行できることは知っていますが、実行時に実行できるかどうかはどこにもわかりません。
ご協力いただきありがとうございます!
編集:現在のインスタンスに昇格した権限を持たせたい場合はどうすればいいですか?たとえば、保持したいデータをメモリに保存する場合があります。
完全ではありませんが、反対のことを行うことができます。特権が既にある場合は、drop特権を使用できます。そのため、 Kate Gregory でリストされている方法のいずれかを使用して、プログラムを管理者として実行し始めることができます。次に、不要な特権を削除します。 Windows上のC++での特権の削除 を参照してください。
アプリケーションを常に昇格させたい場合は、(技術的にコンパイルせずに)ビルドするか、exeと同じフォルダーに外部マニフェストを配置することで、アプリケーションにマニフェストを与えることができます。昇格して実行することを決定する場合は、exeまたはショートカットを右クリックして、[管理者として実行]を選択します。コードから起動する場合、@ vcsjonesコメントとして、そのプロセスを起動するときにrunas
動詞を使用します。例えば:
ShellExecute( NULL,
"runas",
"c:\\windows\\notepad.exe",
" c:\\temp\\report.txt",
NULL, // default dir
SW_SHOWNORMAL
);
作成中にのみプロセスを昇格できます。プロセスが既に実行されている場合、セキュリティトークンを変更する方法はありません。それは昇格されているか実行されていないかのどちらかです。
アプリケーションで管理タスクを実行する必要があり、通常は昇格されないで実行される場合、マニフェストで昇格を要求する別の.exeを作成する必要があります。昇格したプロセスを開始するには、ShellExecute
またはShellExecuteEx
関数を使用する必要があります。メインプロセスから、昇格して実行される新しいプロセスにコマンドを渡す方法が必要になります。
UACの詳細については、 Windows Vista用UACアプリケーションの設計 シリーズを参照してください。
プロセス(およびスレッド)にはトークンが割り当てられています。そのトークンには既にすべてのグループが設定されています。 UACでは、管理者グループは無効になっています。 UACは無効化されたグループを削除し、完全な管理者トークンを取得します。
同じことを実現するには、TCB特権が必要です。つまり、実行時にプロセスを昇格させるには、SYSTEMアカウントで実行されているプロセスの支援が必要になります。Microsoftは、現在のUAC実装を制御するAPIもAPIも提供していません。そうしないと、目的が失われます。
完了のために、プロンプトなしでいくつかの昇格された操作を実行できるプロセスのホワイトリストがあります。要するに、実行可能ファイルには次のものが必要です。
私が見つけた最良の説明は this hack です。それ以来修正されていますが、全体にいくらかの光を当てています。
ここで説明するように、EXEにマニフェストファイルを追加します。