Windows7, VisualStudio 2010 Pro, C++
お世話になります。
自分のプログラムが管理者権限で実行されている場合に、
プログラム中で「ShellExecuteEx」を使用して他のアプリを起動すると、
そのアプリも管理者権限モードで実行されます。
これを標準モードで実行する方法というのはあるのでしょうか?
「CreateProcess」の場合には、「CreateProcessWithTokenW」というAPIを
使用することによって何とか実現できたのですが、「ShellExecuteEx」の場合に
どうすればいいのか分かりません。
もし、ご存じの方がいましたらアドバイスをお願い致します。
何故ShellExecuteExでないとダメなのが分かりませんけど
こういうのじゃダメですか?
http://eternalwindows.jp/security/securitycontext/securitycontext09.html
CreateProcessWithLogonが使いやすかったです。
アドバイスありがとうございます。
> 何故ShellExecuteExでないとダメなのが分かりませんけど
例えば、「test.txt」のようなファイルを指定して、
関連付けされているテキストエディタを起動して、そのファイルをロードする。
このような場合に「ShellExecuteEx」を使用しているのですが、
同じことを「CreateProcess」でも実現できるのでしょうか?
もし、できるなら「CreateProcess」にまとめたいと思います。
あと、教えて頂いたURLの一番下のサンプルですが、
> 現在のプロセスが管理者として動作しているとき、 CreateRestrictedToken
> で作成した制限付きトークンを指定することで、制限されたプロセスを作成
> できます。
ここで言う制限されたプロセスというのは、私の質問にある標準モードで起動する
プロセスとは、また別の意味なのでしょうか?
私が「CreateProcessWithTokenW」で、標準モードのプロセスを起動させるために
使用したコードは以下のURLで紹介されていた「LaunchAsNormalUser」という関数です。
http://code.google.com/p/vistaexec/source/browse/trunk/VistaExec/LaunchAsNormalUser.cpp?r=2
もし、「CreateRestrictedToken」で代用できるなら、こちらの方がコードがすっきり
するのですが・・・
>例えば、「test.txt」のようなファイルを指定して、
>関連付けされているテキストエディタを起動して、そのファイルをロードする。
代替案ですが関連付けを調べて目的のアプリを起動する方法もあるかと思います。
関連付けの取得はこちらが参考になるかもしれません。
http://dobon.net/vb/dotnet/system/findassociatedexe.html
または、ShellExecuteExを呼び出すだけのアプリケーションを別に作成しておき、
それをLaunchAsNormalUserで起動することでもとりあえず目的のことはできそうです。
「ShellExecuteEx」はWINDOWSのメニューで言えば
「ファイル名を指定して実行」
ですね。
「CreateProcess」関連は、WINDOWSのメニューで言えば
「タクスマネージャ」の「プロセス」としての実行
ですね。
よって、「Ex」で何処まで拡張されているかは分からないのですが、
ShellExecuteExでは
>これを標準モードで実行する方法というのはあるのでしょうか?
これは無理だと思います。
みなさん、アドバイスありがとうございました。
subaruさん、
> または、ShellExecuteExを呼び出すだけのアプリケーションを別に作成しておき、
> それをLaunchAsNormalUserで起動することでもとりあえず目的のことはできそうです。
実は私も同じことを考えて昨日試してみたのですが、うまくいきました。
とりあえずこの方法でいこうと思います。
いろいろとありがとうございました。
試してないですがここで説明されている偽装を行えば、
ShellExecuteExの呼び出しのみでも動作するのかもしれません。
http://eternalwindows.jp/security/securitycontext/securitycontext06.html