none
インストーラの作成について RRS feed

  • 質問

  • インストーラ初心者です。

    現在、インストーラの作成で苦戦しています。

    まず簡単に「Environment.UserName」をメッセージボックスで表示するVBプロジェクト(exe)を作成し、MSIからカスタム動作としてそのexeを呼び出すMSIを作成しました。

    VisualStudio2003で作成したMSIを実行するとメッセージボックスには、「ログインユーザー名」が表示されるのですが

    同じものをVisualStudio2008にコンバートし、MSIを作成、実行するとメッセージボックスには「SYSTEM」と表示されてしまいます。

    予想では、VBのexeが「SYSTEM」で起動されているからだと思うのですがこれをVS2003と同じように「ログインユーザー」で実行させ、メッセージボックスに「ログインユーザー名」を表示させることは可能でしょうか?

    VS2008側で色々設定を変更したり試してみましたがうまくいきません。

    尚、社内のドメインにログインした端末で実行した際、上記事象となり、「このコンピュータ」にログインするといづれも「ログインユーザー名」が表示されます。

    ご存知の方がいましたらご教授お願いします。

    よろしくお願いします。

    OSはWindowsXP(x86)です。

    2012年8月8日 10:07

回答

  • そのインストーラーを実行した環境はVista以降だったりしますか?
    Vista以降だとインストール時にUACによる昇格でSYSTEMになるからだと思います。
    とりあえず、環境変数からユーザー名を引っ張ってこれば実行元のユーザー名は取れるかもしれません。

    Environment.GetEnvironmentVariable("USERNAME")
    VS2003が今手元に無いので比較できませんが、VS2010でビルドしてWindows7で管理者権限ユーザーおよびGuestアカウントからの昇格のどちらもユーザー名が取れました。
    XPではEnvironment.UserNameでユーザー名が取れました。

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク 佐伯玲 2012年8月30日 8:21
    2012年8月8日 14:25
  • カスタム動作の実行条件が何らかの理由でシステム権限で動作するように設定されていませんか?

    個人的には、HKCU の操作をするなら、VSのセットアップを使わず、WiXかInstallShield(LEでもいいですがVS2010以上が必要)で、昇格なしのインストーラを作成し、なおかつ PerUsers で動作するものを作ることをお勧めします。

    そうすれば、レジストリ情報として、HKCUに書き込むように構成することができます。

    と、それとは別に、現行の解決策。

    インストーラのプロパティに、UserSID というものがあります。この内容は、インストーラ起動ユーザーのSID(本当にほしい情報)が格納されています。

    ちなみに、ログオンユーザーは、LogonUser というものがあります。

    カスタム動作にプロパティ情報を渡す方法については、MSDNライブラリ(ヘルプ)を参照してください。チュートリアルなどもありますので、わからない場合は一度やってみることをお勧めします。


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/

    • 回答としてマーク 佐伯玲 2012年8月30日 8:21
    2012年8月9日 2:06
  • とっちゃんさん

    返答が大変遅くなり申し訳ありません。ご返信ありがとうございます。

    色々やっていまして結果的にVS2008ではVB.exeがSYSTEMで動作してしまう為、結局、VS2005でやることにしました。

    VB.exe内で呼び出ししていたAdobeReaderのインストーラもとっちゃんさんのおっしゃるとおりでした。

    (すいません。。。色々、変更していたもので自分の中でも整理ができていませんでした。。。)

    確かにインストーラからインストーラを呼び出すことは出来ませんね。

    結局、MSIの方からVB.exeを直接呼び出しせずVBS経由で呼び出しすることでVB.exeからAdobeReaderのインストーラを実行することができました。

    (MSIと同期しなくなるのでMSIの方だけ先にインストール完了になってしまいますが。。。)

    結局、ドメイン接続時にMSIを起動した際、VS2008から呼び出ししたVB.exeをログインユーザーで起動させることはできなかったのが悔やまれますが今回は諦めます。。。。

    色々とご指導を頂きありがとうございました。

    また何かありましたらよろしくお願いします。

    • 回答としてマーク 佐伯玲 2012年8月30日 8:23
    2012年8月22日 11:19

すべての返信

  • そのインストーラーを実行した環境はVista以降だったりしますか?
    Vista以降だとインストール時にUACによる昇格でSYSTEMになるからだと思います。
    とりあえず、環境変数からユーザー名を引っ張ってこれば実行元のユーザー名は取れるかもしれません。

    Environment.GetEnvironmentVariable("USERNAME")
    VS2003が今手元に無いので比較できませんが、VS2010でビルドしてWindows7で管理者権限ユーザーおよびGuestアカウントからの昇格のどちらもユーザー名が取れました。
    XPではEnvironment.UserNameでユーザー名が取れました。

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク 佐伯玲 2012年8月30日 8:21
    2012年8月8日 14:25
  • gekkaさんご回答ありがとうございます。

    情報が少なく申し訳ありません。

    開発は、Win7なのですがインストーラの実行環境は、XPです。

    VS2008からUACの対応がされているような情報はネットで見つけたのですが実行環境がXPなもので関係ないかと。

    それとVS2005でも同じことを行い、VS2003同様、ログインユーザで表示されることは確認取れました。VS2008

    の仕様なのでしょうか・・・

    ログインユーザ名を取得したい理由は、VB.exeの方でHKCUの値を参照もしくは、変更を行いたいのです。

    MSIのレジストリエディタで参照や設定が可能なのは知っていますが条件分岐や値のチェックを行いメッセージを出したり等、行いたい為、VB.exeの方で参照をしたいのです。

    VS2003やVS2005の方だと問題なくHKCUを参照することができるのですがVS2008の方だとNothingで返ってきて参照することができません。

    その為、原因は、VB.exeがログインユーザーではなくSYSTEMで実行されているのが原因ではないのかと推測し、今回の質問をさせていただきました。

    VB.exeの方でHKCUを参照する際、試しにSYSTEMで実行された場合の回避策として試してみたのは、MSIの方は、ログインユーザーで実行されている為、VB.exeをVBスクリプトで実行するようにし、VBスクリプトの方でWMIを使用し、SIDを取得。

    取得したSIDを引数でVB.exeに引き渡し、そのSIDを使用してHKU\SID配下を見ればHKCUと同じ値を参照することはできたのですがネットでHKCU(Microsoft\Protected Storage System Provider)にあるSIDが複数存在する場合があるとの情報があった為、この方法は確実ではないかなと。

    (WMIでのSIDの取得方は、ネットにサンプルがあったのでそれを参考にしたのですがそのサンプルでもクエリ発行後(クエリの条件にログインIDを指定しています)の値の取得がFor文でループしていたのでやはり複数返ってくることがありえるのかなと)

    もしVB.exeがVS2003やVS2005同様にログインユーザで実行出来るのであれば何も問題なく同じ実装方法で実現可能なのですがなんとかSYSTEMをログインユーザに変更することは出来ないでしょうか?


    よろしくおねがいします。

    2012年8月9日 0:38
  • カスタム動作の実行条件が何らかの理由でシステム権限で動作するように設定されていませんか?

    個人的には、HKCU の操作をするなら、VSのセットアップを使わず、WiXかInstallShield(LEでもいいですがVS2010以上が必要)で、昇格なしのインストーラを作成し、なおかつ PerUsers で動作するものを作ることをお勧めします。

    そうすれば、レジストリ情報として、HKCUに書き込むように構成することができます。

    と、それとは別に、現行の解決策。

    インストーラのプロパティに、UserSID というものがあります。この内容は、インストーラ起動ユーザーのSID(本当にほしい情報)が格納されています。

    ちなみに、ログオンユーザーは、LogonUser というものがあります。

    カスタム動作にプロパティ情報を渡す方法については、MSDNライブラリ(ヘルプ)を参照してください。チュートリアルなどもありますので、わからない場合は一度やってみることをお勧めします。


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/

    • 回答としてマーク 佐伯玲 2012年8月30日 8:21
    2012年8月9日 2:06
  • とっちゃんさん

    ありがとうございます。

    カスタム動作には「確定」のところにVB.exeを呼び出すVBスクリプトを定義し、VBSのプロパティのCustomActionDataにVB.exe側で使用するいくつかの引数(0や1)を定義しているだけです。

    Wixは初めて知りました。InstallShieldはライセンスの関係上、使用できなくVSのみで作成したいと思っています。

    でもそれらを使用すれば可能なのですね。勉強になります。

    解決策に関してですが申し訳ありません。調べてみましたがよくわかりません。

    カスタム動作で定義しているVBSファイルのプロパティのCustomActionDataで「LogonUser」を渡すということでしょうか?

    その認識であっている場合、ログオンユーザーやSIDはVBスクリプト内で取得し、VB.exeに渡すことは出来ましたがSYSTEMで実行されている為、VS2003やVS2005の動きと変わってしまいます。

    認識が間違っていましたらすいません。

    最悪、VS2008でその変更が出来ないのであれば、Orcaを使用し、設定変更もしくは追加することで回避可能であればそれでも構いません。

    よろしくお願いします。

    2012年8月9日 2:52
  • とっちゃんさん

    度々すいません。

    もしかしてVBスクリプトのプロパティ(CustActionData)にUserSIDを指定すれば万が一HKCUにSIDが複数あったとしても確実にログインユーザのSIDが引き渡せれるということでしょうか?

    試してみたところUserSIDが取得できました。

    これであればとりあえずSYSTEMで起動されてもHKCUを参照せずHKU\SID配下を参照出来る為、なんとかすることは可能ですね。

    でも一番知りたいのは、なんとかしてSYSTEMではなくログインユーザでVB.exeを実行したいのですが。。。

    情報ありがとうございます。

    最悪、この方法で取得したSIDを使用するやり方で回避しようかと。

    もしログインユーザで実行する方法が分かりましたら情報をお願いします。

    よろしくお願いします。

    2012年8月9日 3:14
  • んと。。。VB.exe というのは、自分で作ったアプリですよね?こいつにInstallerクラスを用意してそれを実行しているのではなく、VBSを実行してそこから自分で作ったアプリを起動しているのですか?

    ところで。。。このインストーラは該当ユーザーでのみ利用できればいいアプリをインストールするのでしょうか?それとも、そのマシンに複数のユーザーアカウントが登録されている場合はどのアカウントでログオンしても起動するアプリでしょうか?

    場合によっては今やろうとしていることはアプリケーションの初回起動時に行うほうがいい場合もあります。http://msdn.microsoft.com/ja-jp/library/cc872776.aspx このあたりにセットアップ関係や、初回起動に関するUXガイドラインの記述がありますので、一度読んでみてそのうえでどうするべきかを検討することをお勧めします。


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/

    2012年8月9日 4:33
  • とっちゃんさん

    こんばんわ。返信が遅くなり申し訳ありません。

    えっと、自作のVB.exeをMSIからVBSを使用し実行させていましたが意味がないことが分かった為、MSIのカスタム動作の確定で直接VB.exeを呼び出しするようにしました。

    このインストーラですが複数のログイン者がおり端末に対してではなくユーザー単位でインストールをしたいんです。

    その為、レジストリもLOCALMACHINEではなくCURRENTUSERの方に値を設定したいんです。

    質問のケースを変更させてください。(起動ユーザーをログインユーザーにしたいのは同じです。)

    内容は、MSIを1度の実行(MSIを何度も起動させない)でFramework2.0SP2をインストールしたい。

    ※Framework3.0以上は事情があり避けたい為、2.0限定です。

    まず、試してみたのが

    VS2008で必須コンポーネントでFramework2.0を指定します。(初期版しか選択肢がないのでSP2のインストーラは、VB.exeの方で実行させる)

    MSI側の起動条件エディタで.NetFrameworkの検索と起動条件に.NetFrameworkチェックを指定し、起動条件の.NetFrameworkチェックのプロパティ「InstallUrl」に「Setup.exe」を指定(これでMSIを起動⇒Framework2.0のインストール確認⇒2.0インストール終了後、自動でMSIが再度実行されます。)

    ここまではうまくいったのですがVB.exeの方でSP2のEXEを実行(Process.startを使用)した際、インストールエラー(1603:致命的エラー)になります。

    直接SP2のEXEを起動すればインストール出来る為、VB.exeから呼び出したSP2のEXEがSYSTEMで実行されているのが原因なのではないかと。

    その為、なんとかVB.exeをSYSTEMではなくログインユーザーで実行する。

    無理であればMSI側の起動条件エディタで.NetFramework(初期版)同様にSP2のチェックをし、SP2のインストール終了後、自動でMSIを再実行することは可能でしょうか?

    (SP2をチェックし、SP2をインストールする流れまでは出来ましたがSP2のインストールが終わった後、MSIを再実行する設定方法がわかりません。)

    上記をなんとかVS2008で実現できればなと。

    よろしくお願いします。

    2012年8月10日 12:28
  • >VB.exeの方でSP2のEXEを実行(Process.startを使用)した際、インストールエラー(1603:致命的エラー)になります。

    WindowsInstaller はその仕組み上の制約により、インストール中にインストーラを動かすことができません。そのため、エラーが発生します。

    必須コンポーネントがない場合(別の名前で入っているだけかもしれない)は、別途 WindowsUpdate を実行してくれ。。。というスタンスになっているのだと思います。


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/

    2012年8月12日 2:05
  • とっちゃんさん

    ご返答ありがとうございます。

    SP2のインストールは、VB2003やVB2005では問題なくインストールされる為、VB2008では、VB.exeがSYSTEMで実行されているのでインストールすることが出来ていないのかなと思うのですが。。。

    ちなみに同じようにVB.exeの方でAdobeReaderのインストーラを実行させるとVS2008で作成したMSIでもインストール自体はうまくいきます。

    (ただSYSTEMのレジストリ(HKU\Software配下)に書き込まれるので結果的にはあまりよろしくないのかと思います。)

    VS2003やVS2005でやるしかないのでしょうか・・・・

    2012年8月13日 0:22
  • VS2003/2005ではうまくいくとなると、インストーラはそっちで。。。ということになるかと。

    あ、もしかして自作EXEはマニフェストで管理者権限を要求するようになっていたりしませんか?もしそうだとすると、そのあたりで引っかかっているのかもしれません。

    今一つ状況が見えていないので何とも言えないところもありますが。。。2003や2005ではできていて2008ではできないとなると違う部分が何か?をしらみつぶしに探していくしかないと思います。


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/

    2012年8月13日 1:34
  • とっちゃんさん

    返答が大変遅くなり申し訳ありません。ご返信ありがとうございます。

    色々やっていまして結果的にVS2008ではVB.exeがSYSTEMで動作してしまう為、結局、VS2005でやることにしました。

    VB.exe内で呼び出ししていたAdobeReaderのインストーラもとっちゃんさんのおっしゃるとおりでした。

    (すいません。。。色々、変更していたもので自分の中でも整理ができていませんでした。。。)

    確かにインストーラからインストーラを呼び出すことは出来ませんね。

    結局、MSIの方からVB.exeを直接呼び出しせずVBS経由で呼び出しすることでVB.exeからAdobeReaderのインストーラを実行することができました。

    (MSIと同期しなくなるのでMSIの方だけ先にインストール完了になってしまいますが。。。)

    結局、ドメイン接続時にMSIを起動した際、VS2008から呼び出ししたVB.exeをログインユーザーで起動させることはできなかったのが悔やまれますが今回は諦めます。。。。

    色々とご指導を頂きありがとうございました。

    また何かありましたらよろしくお願いします。

    • 回答としてマーク 佐伯玲 2012年8月30日 8:23
    2012年8月22日 11:19
  • こんにちは、toopu さん
    フォーラムオペレータの佐伯 玲 です。

    今回は残念ながらVS2008での問題が解決しきれずVS2005を用いることで対応されたとの事なので
    前半部の質問の分と合わせて勝手ながら私のほうで「回答としてマーク」をさせて頂きました。


    今後ともMSDNフォーラムを宜しくお願い致します。
    __________________________
    日本マイクロソフト株式会社 フォーラム オペレーター 佐伯 玲

    2012年8月30日 8:21