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

  • 質問

  • 次のような機能のActivex OCXを作成していますが、管理者権限に昇格するところで、WindowsXPではユーザー選択ダイアログが表示されるのですが、Windows7では何も表示されずシステムフォルダへコピーするところでアクセス拒否がかえってきます。OCXから管理者権限に昇格するプロセスを起動することは出来ないのでしょうか?Windows7はUACを無効にし、IEの保護モードは無効にしています。

    1.WEBページから実行ボタンをクリックすると、OCXのメソッドを実行。

    2.OCXは、HTTPサーバーから非同期通信でセットアッププログラム+ファイルをダウンロードし、ShellExecuteEx()でセットアッププログラムを管理者権限に昇格して起動。

    3.セットアッププログラムは、設定ファイル(INIファイル)をシステムフォルダへコピーし、レジストリを更新。

    よろしくお願いします。

     


    kumakuma
    2011年7月27日 14:36

すべての返信

  • >2.OCXは、HTTPサーバーから非同期通信でセットアッププログラム+ファイルをダウンロードし、ShellExecuteEx()でセットアッププログラムを管理者権限に昇格して起動。

    ファイルのダウンロードはどこ(フォルダ)にしてますか?

    >3.セットアッププログラムは、設定ファイル(INIファイル)をシステムフォルダへコピーし、レジストリを更新。

    「セットアッププログラム」は同時に作成したものですか? それとも、Windows Installer 技術に基づくもの(MSI もしくは setup.exe + msi など)ですか?

    2011年7月27日 23:34
  • 返信ありがとうございます。

    ダウンロードは、SHGetSpecialFolderPath()関数でローカルアプリケーションフォルダ(CSIDL_LOCAL_APPDATA)を取得して、アプリケーション用フォルダを作成し、そこへダウンロードしています。

    セットアッププログラムは、同時に作成したもので、VC++6.0で開発しています。(OCXも同様にVC++6.0です)

    よろしくお願い致します。


    kumakuma
    2011年7月28日 7:47
  • >セットアッププログラムは、同時に作成したもので、VC++6.0で開発しています。(OCXも同様にVC++6.0です)

    Windows Installer 技術は使っていない、普通のユーザープログラムということですね?

    >管理者権限に昇格するところで

    とありますが、XP には UAC はありません。

    「管理者権限に昇格するところで、WindowsXPではユーザー選択ダイアログが表示される」とは、具体的には誰(or どのプログラム?)どんな操作(or 動作?)をすることを指しているでしょうか?

    確認ですが、一連の操作を行う際に使用しているアカウントは、そのコンピュータの管理者権限を持ったユーザなんですよね?

    2011年7月28日 10:15
  • 説明不足で申し訳ありません。

    >Windows Installer 技術は使っていない、普通のユーザープログラムということですね?

    普通のユーザープログラムです。

    XPで実行すると、OCXからShellExecuteEx()で "runas" を指定してセットアッププログラムを起動すると、「別のユーザーとして実行」ダイアログが表示されます。

    Windows7では何も表示されずにセットアッププログラムが起動され、システムフォルダにファイルをコピーするところで、「アクセス拒否」でエラーになります。

    一連の動作を行うアカウントは、User権限を持つユーザーです。

    管理者権限を持つユーザーで実行すると、システムフォルダへのコピーもレジストリの更新も問題なく成功します。

    セットアッププログラムにマニフェストを組み込んでみましたが、結果は変わらずでした。

    ちなみにIEを管理者として実行すると、問題なく動作しますので、権限の問題だとは思うのですが・・・

     

     

     


    kumakuma
    2011年7月28日 12:10
  • >XPで実行すると、OCXからShellExecuteEx()で "runas" を指定してセットアッププログラムを起動すると、「別のユーザーとして実行」ダイアログが表示されます。

    >Windows7では何も表示されずにセットアッププログラムが起動され、システムフォルダにファイルをコピーするところで、「アクセス拒否」でエラーになります。

    なるほど、やっと実行しようとしているシナリオがわかりました。

    # オンラインゲームのブートストラップのような動作ですね。

    Windows 7 で、OCX からではなく、コマンドプロンプトなどから runas でセットアッププログラムを実行した場合は期待通りの動作をするのでしょうか?

    UAC 無効、IE 保護モードも無効、ということだと、OCX からセットアッププログラム実行した場合と同じ動きになりそうなものですが。。。

     

    2011年7月28日 13:58
  • コマンドプロンプトから runas /env /user:ユーザーID "Setup.exe" で実行すると、パスワード入力となり、パスワードを入力すると正常に動作します。

    互換性で管理者として実行を指定し、実行すると、正常に動作します。

    UACコントロールを有効にし、実行するとID、パスワードを入力するダイアログが表示されます。

    代替え策として予めショートカットを作成(管理者として実行を指定)し、Setup.exeと一緒にダウンロードし、ショートカットを起動出来ないかと考えています。

    もう少し試行錯誤してみます。

     


    kumakuma
    2011年7月30日 12:37
  • >UACコントロールを有効にし、実行するとID、パスワードを入力するダイアログが表示されます。

    UAC オフなら XP と同じような動作をするものと思ってましたが、振る舞いが異なっているようですね。

    とは言え、基本的なアプローチとしては

    >セットアッププログラムにマニフェストを組み込んでみましたが、結果は変わらずでした。

    で正しいようなきがするのですが。。。

    2011年7月30日 14:22
  • # 少し検証してみましたので、同じような内容ですが再度投稿します。

    UAC を OFF にしてしまっているのがそもそもの原因なのではないかと思います。

    UAC を OFF にして一般ユーザーの権限でログオンすると、[管理者として実行] の効力がなくなります。
    プロセスは起動するのですが Process Explorer で見ると、整合性レベルは「中」になっています。(管理者権限のあるプロセスは「高」でなければいけません。)
    ShellExecuteEx で runas を指定して起動しても、やはり整合性レベルは「中」になります。
    マニフェストに requireAdministrator を入れておいても、Explorer 上でダブルクリックして起動しても整合性レベルは「中」ですし、ShellExecuteEx の runas 指定でもやはり整合性レベルは「中」です。

    どうやら UAC を OFF にすると、「昇格」という概念そのものがなくなってしまうように見えます。(ユーザーの持つ最大限の権限で動こうとするのは、XP までと同じ。)

    回避策としては、

    ・管理者権限が必要なものをインストールする場合には、管理者ユーザーでログオンしてインストールする。
    ・UAC を ON にする。

    といったものしかないように思います。
    2011年7月31日 3:50
  • >UAC を OFF にして一般ユーザーの権限でログオンすると、[管理者として実行] の効力がなくなります。

    (中略)

    >ShellExecuteEx で runas を指定して起動しても、やはり整合性レベルは「中」になります。

    runas じゃなく、対象の実行ファイルを CreateProcessAsUser() してもも同じですかね?

    もし同じだとすると、それって Breaking change = UAC 前と以後での非互換性ってことになってしまいますね。

     

     


    2011年8月1日 2:21
  • runas じゃなく、対象の実行ファイルを CreateProcessAsUser() してもも同じですかね?

    もし同じだとすると、それって Breaking change = UAC 前と以後での非互換性ってことになってしまいますね。


    CreateProcessWithLogonW() で試してみました。

    管理者ユーザーを指定してあげると、プロセスの実行ユーザーは管理者ユーザーになり、整合性レベルも「高」になりました。
    CreateProcessAsUser() もおそらくそのようになると思います。コマンド プロンプトで "runas" コマンドで実行すると管理者で起動できているようですし。
    2011年8月1日 2:56
  • 返信が遅くなり申し訳ありません。

    色々調査頂きありがとうございます。

    さっそく試してみます。

    管理者権限で動作させるのですから管理者ユーザー名とパスワードが必要ですね

    PCの仕様が統一されていれば良いのですが・・・。

    ユーザーにID、パスワードを入力させないためには、管理者権限なしにセットアップしなければならず、悩ましいところです。

    UAC無効が条件だったりしますので、システムファイルやレジストリを更新しなくても良いようにアプリの構成を変更可能か再度検討してみます。

     

     

     


    kumakuma
    2011年8月1日 8:55
  • >管理者ユーザーを指定してあげると、プロセスの実行ユーザーは管理者ユーザーになり、整合性レベルも「高」になりました。

    検証ありがとうございますw

    てことは、OS の動作自体に非互換性はないようですね。

    # runas の振る舞いが微妙ですが。

    >ユーザーにID、パスワードを入力させないためには、管理者権限なしにセットアップしなければならず

    それはもう、だいぶ前から出来ません。

    そもそも、一時的に管理者権限を取得するために runas を使っていたんじゃないんですか?

     

    2011年8月1日 9:33
  •  気になったのですが、「UAC無効が条件」というのは、「1.今作っている(移行、検証している)アプリケーションが、XP と同じ動作をするためには UAC 無効でなければならない」のでしょうか。それとも、「2.お客様の環境が、UAC 無効で運用することを前提としている」のでしょうか。あるいは、「3.今作っているアプリケーションを導入する基盤として、UAC 無効で運用することを提案した」のでしょうか。

     いずれにしても、セキュリティという面からなぜそれが必要なのかを説明し、UAC 有効で動作することを前提とした方がよいと思います。実際、昇格が必要な場面なんて、ほとんどありませんよ。


    Jitta@わんくま同盟
    • 回答としてマーク kumakuma 2011年11月22日 8:45
    • 回答としてマークされていない kumakuma 2011年11月22日 8:46
    2011年8月1日 12:02