開発環境:Vista、VisualStudio2008、C++・MFC
動作環境:Vista、7
通常、制限された管理者ユーザーでexeファイルを実行させると
UACの管理者権限を持つアカウントのユーザー名とパスワードを入力させる画面が
表示させると思いますが、サイレントインストールを行いたいため
その入力部分を省きたいと思っています。
具体的に言うと、外部ファイルのテキストなどから管理者名・パスワードを読み込み
その情報をもとにプログラムを管理者実行できるようにしたいのです。
ネットで調べてみたところ
Win32APIのCreateProcessWithLogonW()を使用すれば良いようなのですが、
Vista・7の場合だとUACが邪魔をしてこのAPIが正常動作しないとありました
実際に動作させエラー内容を調べてみると管理者特権がないと言われてしまいます
そこで、このAPIのパス指定部分に
cmd /c ファイルパス
と指定すると、コマンドプロンプトを介して起動できるようになりました
UACの続行/キャンセルの画面は出てきますが、ユーザー名・パスワードを
入力する必要もなく、外部ファイルから読み込めています
しかしこの方法の場合、コマンドプロンプトの画面が後ろに見えてしまい不恰好です
そこで、聞きたい事が以下になります
1.コマンドプロンプトを介してプログラムを実行した際、DOS窓画面が表示されないよ
うにすることが出来るか?
2.CreateProcessWithLogonW以外で、制限ユーザーからプログラムを管理者実行できる
か?
良い方法がありましたら、ご教授お願いいたします。
ちなみに、コードは以下のようになります
STARTUPINFO startupInfo;
PROCESS_INFORMATION processInformation;
ZeroMemory(&startupInfo, sizeof(STARTUPINFO));
StartupInfo.cb = sizeof(STARTUPINFO);
CreateProcessWithLogonW(
[管理者ユーザー名],
[管理者ドメイン名],
[管理者パスワード],
0,
cmd /c C:\\aaa.exe,
NULL,
0,
NULL,
NULL,
&startupInfo,
&processInformation)
);
<質問1の回答>
下記のように「SW_HIDE」を渡すことで非表示にすることはできないでしょうか。
(CreateProcess 関数の場合は、これで非表示にできます)
startupInfo.wShowWindow = SW_HIDE;
<質問2の回答>
見当違いでしたらすみません。
ShellExecute 関数の第 2 引数に runas を指定することで管理者権限で実行すること
はできます。ただし、「ユーザアカウント制御」ウィンドウは表示されます(ユーザ名、
パスワードの入力は不要。マニフェストにもよるのかな?)。
専用のサービス(デーモン)を作成し、そのサービスによって動作(起動)せる、とい
う手段でもお望みのことはできないものでしょうか。
(私はサービスは作ったことはありませんので、質問は別の方へお願いします)
> 専用のサービス(デーモン)を作成し、そのサービスによって動作(起動)せる、
> という手段でもお望みのことはできないものでしょうか。
いわゆる、
「ウイルス対策ソフト」と同じようなことをする。
管理者権限で先にウインドウズにソフトを登録しておくので
制限された管理者ユーザーがログインしてもすでに目的のソフトは
動作している。
ということですね。
設定・その他が難しいと思います。デバイスドライバーのようにきちんと
システム登録しないといけないし、サ-ビスプログラム自体かなり難しいです。
ウインドウを出さずに必要なことをみんな実行しなければならないと思います。
「ウイルス対策ソフト」がウインドウを出すのはサービスプログラムが一連の動作を
行なった後だと思います。
ご回答ありがとうございます。
>Yjさん
>下記のように「SW_HIDE」を渡すことで非表示にすることはできないでしょうか。
この方法ではムリでした。
そもそも、SW_HIDE=0のようで、ZeroMemoryしていたので0が入っており、
この記述を入れる前からSW_HIDEとして動作していたようですが、
ウィンドウ非表示にはなりませんでした。
>ShellExecute 関数の第 2 引数に runas を指定することで
この方法ですと、管理者ユーザーからの場合は問題ないのですが
制限ユーザーで実行するとやはり管理者名とパスワードを求められてしまいます。
サイレントで実行させるには上手くいかないようです。
>ITOさん
管理者で一度も起動していない状態で、
制限ユーザーから実行してサービスに登録できるのでしょうか?
サービスで行う、という手段は自分も行きついたのですが
いかんせん処理が難しそうで簡単には実装できそうもありません
勉強しろという事なんでしょうが、どこかサンプル等が載っているサイトとかないでし
ょうか?
> 管理者で一度も起動していない状態で、
> 制限ユーザーから実行してサービスに登録できるのでしょうか?
出来ないと思います。
確か、「ウイルス対策ソフト」も管理者権限でインストールするようになっていたと
思います。
サービスプログラムに関しては僕も探しているのですが、サイトが見つからない
です。
試してませんがこの辺つかって::ShowWindowするとか。
http://support.microsoft.com/kb/124103
# 昔に多様な事やったときは一瞬ちらつく程度だったと思います。
> # 昔に多様な事やったときは一瞬ちらつく程度だったと思います。
# 昔似たような事(以下略