以下のようなことをやりたいと思っています。
Aユーザー(標準権限)
Bユーザー(管理者権限)
Aユーザーは管理者権限をもっていないので、管理者権限が必要な
場合は、Bユーザーとしてプロセスを起動します。
そのプロセス内で、別のプロセスの起動が必要なのですが、このプロセス
を Aユーザーとして起動したいと思います。
この Aユーザーとしての起動をパスワードの入力をせずに
実行したいのですが、そのようなことは可能でしょうか?
開発環境は VisualStudio 2005 です。
よろしくお願いします。
CreateProcessWithLogonWでプロセスを起動してみてはどうでしょう。
CreateProcessWithLogonW でもパスワードは必要ですね。
> Aユーザーは管理者権限をもっていないので、管理者権限が必要な
> 場合は、Bユーザーとしてプロセスを起動します。
というのは、以下のような想定でよろしいですか?
なお、「ユーザー」という言葉がPCを操作する人間のことを指さないことを明確にするた
め、以降では「アカウント」と呼び換えました。
・PC を操作する人は1人。
・この人は、Aアカウント、Bアカウント両方のパスワードを知っている。
・普段はAアカウントを使用している。
・特定のプログラムを使う場合のみ、Exe ファイルを右クリックして「別のユーザーとし
て実行」等を使って、Bアカウントで実行する。
この想定が正しければ、管理者権限の必要なプログラム(便宜的に「管理プログラム」と
呼ぶ)を実行しているとき、オペレータはAアカウントとしてパソコンにログインしたま
まということになりますね。
既にAアカウントがログイン済みなのであれば、何らかの方法でトークンを取得できても
いいような気がするのですが、そのような方法があるのかどうかわかりません。
(トークンが取得できれば、CreateProcessAsUser が使えます)
管理プログラムから実行するプログラム(便宜的に「一般プログラム」と呼ぶ)をAアカ
ウント権限で実行したい理由は何なのでしょうか?
それが明確になれば、代替方法が見つかるかもしれません。
返信ありがとうございます。
状況としては、シャノンさんが書かれたものそのものです。
標準権限ユーザーでインストールする場合は、管理者権限で実行する必要があり、
インストール後にインストールプログラムを実行したいけれど、そのままだと
管理者権限があるユーザーでの実行になってしまうので、標準権限ユーザー
実行が必要。
標準権限ゆーざーで実行するときに、パスワードを入力させればいいのですが、
ログイン時にパスワードを入力しているので、わざわざ入力させるのはおかしい
と思うので、その手間を省きたいというところです。
> 標準権限ユーザーでインストールする場合は、管理者権限で実行する必要があり、
> インストール後にインストールプログラムを実行したいけれど、そのままだと
> 管理者権限があるユーザーでの実行になってしまうので、標準権限ユーザー
> 実行が必要。
「管理者権限で実行する必要があるアプリ」ってのはインストーラのことなのですか?
であれば、それを使うことなどそう何度もあることではないのですから、インストーラ
からアプリを起動するというのをあきらめるのが一番簡単で堅実な方法だと思います。
GetShellWindowで取得したハンドルからプロセス求めて
OpenProcessTokenでトークン取れますね。
FireFoxのソースにほぼそのまま使えるコード(LaunchAsNormalUser関数の部分)
があるので参考にしたらいいでしょう。
http://mxr.mozilla.org/firefox/source/toolkit/xre/nsWindowsRestart.cpp
FireFox の ソース を Vistaで実行したら
パスワードなどを入力せずに
標準ユーザー権限でプログラムを起動することを確認できました。
ありがとうございました。