質問者
Activex OCX からShellExecuteEx()でプロセス起動時の管理者権限への昇格

質問
-
次のような機能のActivex OCXを作成していますが、管理者権限に昇格するところで、WindowsXPではユーザー選択ダイアログが表示されるのですが、Windows7では何も表示されずシステムフォルダへコピーするところでアクセス拒否がかえってきます。OCXから管理者権限に昇格するプロセスを起動することは出来ないのでしょうか?Windows7はUACを無効にし、IEの保護モードは無効にしています。
1.WEBページから実行ボタンをクリックすると、OCXのメソッドを実行。
2.OCXは、HTTPサーバーから非同期通信でセットアッププログラム+ファイルをダウンロードし、ShellExecuteEx()でセットアッププログラムを管理者権限に昇格して起動。
3.セットアッププログラムは、設定ファイル(INIファイル)をシステムフォルダへコピーし、レジストリを更新。
よろしくお願いします。
kumakuma
すべての返信
-
-
>セットアッププログラムは、同時に作成したもので、VC++6.0で開発しています。(OCXも同様にVC++6.0です)
Windows Installer 技術は使っていない、普通のユーザープログラムということですね?
>管理者権限に昇格するところで
とありますが、XP には UAC はありません。
「管理者権限に昇格するところで、WindowsXPではユーザー選択ダイアログが表示される」とは、具体的には誰(or どのプログラム?)どんな操作(or 動作?)をすることを指しているでしょうか?
確認ですが、一連の操作を行う際に使用しているアカウントは、そのコンピュータの管理者権限を持ったユーザなんですよね?
-
説明不足で申し訳ありません。
>Windows Installer 技術は使っていない、普通のユーザープログラムということですね?
普通のユーザープログラムです。
XPで実行すると、OCXからShellExecuteEx()で "runas" を指定してセットアッププログラムを起動すると、「別のユーザーとして実行」ダイアログが表示されます。
Windows7では何も表示されずにセットアッププログラムが起動され、システムフォルダにファイルをコピーするところで、「アクセス拒否」でエラーになります。
一連の動作を行うアカウントは、User権限を持つユーザーです。
管理者権限を持つユーザーで実行すると、システムフォルダへのコピーもレジストリの更新も問題なく成功します。
セットアッププログラムにマニフェストを組み込んでみましたが、結果は変わらずでした。
ちなみにIEを管理者として実行すると、問題なく動作しますので、権限の問題だとは思うのですが・・・
kumakuma -
>XPで実行すると、OCXからShellExecuteEx()で "runas" を指定してセットアッププログラムを起動すると、「別のユーザーとして実行」ダイアログが表示されます。
>Windows7では何も表示されずにセットアッププログラムが起動され、システムフォルダにファイルをコピーするところで、「アクセス拒否」でエラーになります。
なるほど、やっと実行しようとしているシナリオがわかりました。
# オンラインゲームのブートストラップのような動作ですね。
Windows 7 で、OCX からではなく、コマンドプロンプトなどから runas でセットアッププログラムを実行した場合は期待通りの動作をするのでしょうか?
UAC 無効、IE 保護モードも無効、ということだと、OCX からセットアッププログラム実行した場合と同じ動きになりそうなものですが。。。
-
-
# 少し検証してみましたので、同じような内容ですが再度投稿します。
UAC を OFF にしてしまっているのがそもそもの原因なのではないかと思います。
UAC を OFF にして一般ユーザーの権限でログオンすると、[管理者として実行] の効力がなくなります。
プロセスは起動するのですが Process Explorer で見ると、整合性レベルは「中」になっています。(管理者権限のあるプロセスは「高」でなければいけません。)
ShellExecuteEx で runas を指定して起動しても、やはり整合性レベルは「中」になります。
マニフェストに requireAdministrator を入れておいても、Explorer 上でダブルクリックして起動しても整合性レベルは「中」ですし、ShellExecuteEx の runas 指定でもやはり整合性レベルは「中」です。
どうやら UAC を OFF にすると、「昇格」という概念そのものがなくなってしまうように見えます。(ユーザーの持つ最大限の権限で動こうとするのは、XP までと同じ。)
回避策としては、
・管理者権限が必要なものをインストールする場合には、管理者ユーザーでログオンしてインストールする。
・UAC を ON にする。
といったものしかないように思います。 -
runas じゃなく、対象の実行ファイルを CreateProcessAsUser() してもも同じですかね?
もし同じだとすると、それって Breaking change = UAC 前と以後での非互換性ってことになってしまいますね。
CreateProcessWithLogonW() で試してみました。
管理者ユーザーを指定してあげると、プロセスの実行ユーザーは管理者ユーザーになり、整合性レベルも「高」になりました。
CreateProcessAsUser() もおそらくそのようになると思います。コマンド プロンプトで "runas" コマンドで実行すると管理者で起動できているようですし。 -
気になったのですが、「UAC無効が条件」というのは、「1.今作っている(移行、検証している)アプリケーションが、XP と同じ動作をするためには UAC 無効でなければならない」のでしょうか。それとも、「2.お客様の環境が、UAC 無効で運用することを前提としている」のでしょうか。あるいは、「3.今作っているアプリケーションを導入する基盤として、UAC 無効で運用することを提案した」のでしょうか。
いずれにしても、セキュリティという面からなぜそれが必要なのかを説明し、UAC 有効で動作することを前提とした方がよいと思います。実際、昇格が必要な場面なんて、ほとんどありませんよ。
Jitta@わんくま同盟