none
セットアッププロジェクトのカスタム動作で、「呼び出しユーザ」アカウントを取得できるのでしょうか? RRS feed

  • 質問

  • Visual Studio 2008でセットアッププロジェクトを作り、カスタム動作から、EXE(Visual C#)を実行させています。

    このときEXEがSYSTEMアカウントで動作していますが、ログインしているユーザのアカウントはどうすれば(EXE側から)取得できるのでしょうか?

    また、現在、EXEをインストーラクラスとして作成していないのですが、インストーラクラスとして作成すると、ログインしているユーザのアカウントを取得できるものなのでしょうか?

     

    2011年1月21日 11:15

回答

  • Vista 以降も対象ですか。

    であれば、VSセットアップではこのユーザーのみインストールに対応していないので、ログオンアカウントを利用して何かを行うような処理はインストーラではなく、アプリケーションの初回起動時に行うようにしてください。

    VSセットアップに限ったことではありませんが、Vista でこのユーザーのみインストールに対応するには、ダイアログの設定部分でインストール先を自動変更するコードを自分で追加する必要があります。これは、InstallShieldやWiXを使った場合でも変わりありません。

    インストーラの内部でログオンアカウント(アプリケーションの実行アカウントですよね?)に依存したなにかを行うためには、そのユーザーにのみ影響するようにプログラムもインストーラも制御できていなければなりません。

    先日更新されたユーザーエクスペリエンスガイドラインにこれについて言及されています。

    http://msdn.microsoft.com/ja-jp/library/ee915058.aspx, http://msdn.microsoft.com/ja-jp/library/cc872779.aspx

    Win7に限ったものではなく、XPでも十分意味のある内容となっていますので、一読する価値はあると思います。 


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/
    • 回答としてマーク oohashi 2011年1月25日 4:31
    2011年1月24日 10:41

すべての返信

  • 確認したい対象のOSはなんでしょうか?

    OSのバージョンが6.0以上かそうではないかで確認できる状況が変わります(Server系OSでも同じ)。インストーラの挙動について検証する上では、何を使って作ったか?よりも重要な情報です。

    インストーラをどうやって起動したか?によっては、どうあがいてもアカウントが管理者ということは起こりえます。それと、そのEXEはどのタイミングで実行していますか?カスタム動作から実行とありますが、どうやって実行しているかでも状況が変わってくるかもしれません。

    そのあたりがわからないと回答は得にくいかもしれません。

    一応。。。

    簡単に取れそうな情報というと。。。User Information Properties にあるプロパティ類ですかね。LogonUser か UserSID property あたりかな?

    プロパティで十分ならば、インストーラクラスを利用すれば比較的簡単に参照することができます。このあたりは チュートリアル : カスタム動作を使用した、インストール時のメッセージの表示 にプロパティを渡す例がありますので、参考になると思います。

    具体的にどんな情報があるか?については、詳細ログをとって動かしてみるのが一番確実です。詳細ログは、msiexec /i hoge.msi /l*v hoge.log という感じでインストールを実行すれば取得できます。


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/
    2011年1月21日 16:14
  • とっちゃんさま、返信ありがとうございます。

    >確認したい対象のOSはなんでしょうか?

    >OSのバージョンが6.0以上かそうではないかで確認できる状況が変わります(Server系OSでも同じ)。インストーラの挙動について検証する上では、何を使って作ったか?よりも重要な情報です。

    たしかにそのとおりですね。とりあえずXPとVistaで、とくにVistaからいろいろ変わっているようですので、Vistaがターゲットと思っています。

    >インストーラをどうやって起動したか?によっては、どうあがいてもアカウントが管理者ということは起こりえます。

    MSDNによると「どうあがいてもアカウントが管理者」(SYSTEM)みたいですね(「インストール」「確定」のタイミングだからかもしれませんが)。動作フォルダもWindowsのsystem32フォルダのようです。

    >それと、そのEXEはどのタイミングで実行していますか?カスタム動作から実行とありますが、どうやって実行しているかでも状況が変わってくるかもしれません。

    「インストール」と「確定」の両方でためしています。「ロールバック」や「アンインストール」ではありません。

    WMIなども含めていろいろためしていますが、レジストリの「SOFTWARE\Microsoft\Windows NT\CurrentVersion\WinLogon\DefaultUserName」の値、「Explorer.exe」の所有者などを調べる方法などもあるようですね。もう少し理解できるようになってから、書き込みたいと思います。

     

     

    2011年1月24日 9:50
  • Vista 以降も対象ですか。

    であれば、VSセットアップではこのユーザーのみインストールに対応していないので、ログオンアカウントを利用して何かを行うような処理はインストーラではなく、アプリケーションの初回起動時に行うようにしてください。

    VSセットアップに限ったことではありませんが、Vista でこのユーザーのみインストールに対応するには、ダイアログの設定部分でインストール先を自動変更するコードを自分で追加する必要があります。これは、InstallShieldやWiXを使った場合でも変わりありません。

    インストーラの内部でログオンアカウント(アプリケーションの実行アカウントですよね?)に依存したなにかを行うためには、そのユーザーにのみ影響するようにプログラムもインストーラも制御できていなければなりません。

    先日更新されたユーザーエクスペリエンスガイドラインにこれについて言及されています。

    http://msdn.microsoft.com/ja-jp/library/ee915058.aspx, http://msdn.microsoft.com/ja-jp/library/cc872779.aspx

    Win7に限ったものではなく、XPでも十分意味のある内容となっていますので、一読する価値はあると思います。 


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/
    • 回答としてマーク oohashi 2011年1月25日 4:31
    2011年1月24日 10:41
  • とっちゃんさま、返信ありがとうございます。

    「SOFTWARE\Microsoft\Windows NT\CurrentVersion\WinLogon\DefaultUserName」というキーそのものがVistaにはないようです。

    「Explorer.exe」の所有者をWMIのWin32_Processで取得できましたが、複数のユーザがログインしていると、複数がヒットしてしまうのでだめですね。

    結局、WMIのWin32_ComputerSystemで取得はできたのですが、どうも自分でやっていて、「素性のよからぬ」ことをやっている気がしてなりません.....

    >VSセットアップではこのユーザーのみインストールに対応していないので、ログオンアカウントを利用して何かを行うような処理はインストーラではなく、アプリケーションの初回起動時に行うようにしてください。

    なるほど。このご意見といいい、「ユーザーエクスペリエンスガイドライン」の件といい、ありがとうございます。

    われながら、どうも古いWindowsアプリの開発の感覚にしばられていて、それが「裏技」的な方法へと向かわせているような気がします。新しいWindwowの設計を学び、根本的に設計の見直しをする必要がありますね。

    ありがとうございました。

    2011年1月25日 4:31