none
GetSettingでレジストリ取得できない RRS feed

  • 質問

  • お世話になります。

    ASP.NET VBで開発していますが、

    Dim strW As String

    strW = GetSetting("Nao2", "Nao2", "Code", "0"

    レジストリには、"5"が書き込まれていまして、

    strWには、デバック時、"5"が返ってきて正常です。

    ところが、ビルドし、出来上がりを、IISのフォルダに配置しますと

    GetSettingのstrWの値が"0"になっています。

    何が良くないのか、教えてください。

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

    2015年11月21日 8:12

回答

  • もし、Windowsアプリで設定を行って、Webアプリ側で読み込みたいというような目的であれば、対象のレジストリはアカウント毎に固有の領域ということですので、アカウントを同じにしないと実現できません。

    ついでにアプリケーションプールの設定でユーザープロファイルのロードを有効に設定する必要があります。

    がまあ当然そういうやり方はお勧めはできませんので、別の方法を考えるほうがいいでしょうね。

    単なる設定値ならWeb.configでたいてい事足りるでしょうし。

    --追記

    「ついでにアプリケーションプールの設定でユーザープロファイルのロードを有効に設定する必要があります。」

    と書きましたが、この設定はデフォルトでTrueになっている雰囲気ですね。

    結局アプリケーションプールのアカウントを、デスクトップアプリを実行したのと同じアカウントに設定するだけで動作はしそうです。

    ※動作はしそうですが、もちろんお勧めはしません。

    • 編集済み なちゃ 2015年11月24日 11:29
    • 回答の候補に設定 星 睦美 2015年11月26日 2:38
    • 回答としてマーク 星 睦美 2015年11月30日 8:03
    2015年11月24日 4:23
  • GetSetting 関数には

    GetSetting 関数の引数のいずれかを指定していない場合、GetSetting 関数は、Default の値を返します。
    GetSetting は、ユーザーが対話形式でログオンするまでアクティブにならない HKEY_LOCAL_USER レジストリ キーのもとで動作するため、ユーザーがログオンしていることが必要条件です。
    双方向でないプロセス (Mtx.exe など) からアクセスするレジストリの設定は、HKEY_LOCAL_MACHINE\Software\ または HKEY_USER\DEFAULT\Software レジストリ キーのいずれかに格納されます。

    と書かれています。書き込んだレジストリの場所と読み込んでいるレジストリの場所は一致しているでしょうか? IISであれば、対話形式でのログオンはされていないはずです。

    • 回答の候補に設定 星 睦美 2015年11月26日 2:38
    • 回答としてマーク 星 睦美 2015年11月30日 8:03
    2015年11月21日 9:09
  • > 最初にWindowsフォ-ムのディスクトップアプリを作成しまして、
    > その、アプリでレジストリに番号を書き込んでいました。
    > その番号を今回のWeb Formsで、値を取得したかったのです。

    それは単に Windows Forms アプリでやったことを ASP.NET Web Forms アプリでも試してみたかっただけということですか?

    そうではなくて、ASP.NET Web Forms アプリで何かレジストリを使って情報を保持する必要があってやっているのですか?

    前者ならお好きなようにと言うほかないですが、後者であれば全体的なシナリオ・やりたいことを書いてもらえばレジストリを使うなんて面倒なことでなくてもっとスマートな代案が出てくるかも知れませんので、そうすることをお勧めします。

    • 回答の候補に設定 星 睦美 2015年11月26日 2:38
    • 回答としてマーク 星 睦美 2015年11月30日 8:03
    2015年11月22日 13:20

すべての返信

  • 質問する際は、一番最初に、何を作っているのか(Web Forms? MVC? Web API? その他?)、ご自分の環境(OS, .NET, IIS, Visual Studio のバージョンなど・・・今回は特に IIS のバージョン)に関する情報を最低書いていただけませんか?
     
    適切に情報が提供されていれば、回答者が質問者さんの状況を的確に把握でき、タイムリーで的を得た回答が得られるということで、質問者さんにもメリットがあります。ガイドラインも出ていますので目を通していただければと思います。
     
    フォーラムのご利用方法(質問の投稿)について
     https://social.technet.microsoft.com/Forums/ja-JP/home?forum=announceja&announcementId=587d27f8-adc8-432a-905c-81375f8a05ec

    ・・・と注文をつけるばかりでは何ですので、上記の情報なしでも想像できる範囲で回答しておきます。

    > デバック時、"5"が返ってきて正常です。
    > ところが、ビルドし、出来上がりを、IISのフォルダに配置しますと

    「デバッグ時」というのは Visual Studio で ASP.NET 開発サーバーまたは IIS Express を使ってのことだと思いますが、そうだとすると原因はワーカープロセスのアクセス権の問題だと思います。

    詳しくは以下の記事を見てください。

    ASP.NET 開発サーバーと IIS
    http://surferonwww.info/BlogEngine/post/2011/11/18/ASPNET-development-server-and-IIS.aspx

    IIS のワーカープロセスにアクセス権を与えればうまくいくのではないかと思います。その方法は以下の記事の「レジストリ アクセス」のセクションを見てください。

    How To: ASP.NET で Network Service アカウントを使用してリソースにアクセスする方法
    https://msdn.microsoft.com/ja-jp/library/ms998320.aspx

    上記の記事は IIS 6 のものですので注意してください。

    質問者さんが使う IIS は何だか分かりませんが(だから環境を書いてくれと言っているのです)、IIS7.5 以降ですと話が違ってきます。Azure とかですと、そもそもそういうことができるのかどうかも分かりません。



    • 編集済み SurferOnWww 2015年11月21日 8:53 誤字訂正
    2015年11月21日 8:51
  • GetSetting 関数には

    GetSetting 関数の引数のいずれかを指定していない場合、GetSetting 関数は、Default の値を返します。
    GetSetting は、ユーザーが対話形式でログオンするまでアクティブにならない HKEY_LOCAL_USER レジストリ キーのもとで動作するため、ユーザーがログオンしていることが必要条件です。
    双方向でないプロセス (Mtx.exe など) からアクセスするレジストリの設定は、HKEY_LOCAL_MACHINE\Software\ または HKEY_USER\DEFAULT\Software レジストリ キーのいずれかに格納されます。

    と書かれています。書き込んだレジストリの場所と読み込んでいるレジストリの場所は一致しているでしょうか? IISであれば、対話形式でのログオンはされていないはずです。

    • 回答の候補に設定 星 睦美 2015年11月26日 2:38
    • 回答としてマーク 星 睦美 2015年11月30日 8:03
    2015年11月21日 9:09
  • 申し訳ございませんでした。

    環境を以下に記述します。

    OS:Windows7 Pro SP1

    .NET:Ver2.0

    IIS:Ver7.5

    VS:Ver2010(VB.net)

    これらが、環境です。

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

    2015年11月21日 17:03
  • 何を作っているかは書けない事情があるのでしょうか?

    とりあえず、IIS7.5 ということなので、ワーカープロセス関係の IIS6 との違い(先に紹介した記事は IIS6 ベースなので)を書いた記事を紹介しておきます。前者は今回の話にはあまり関係ないので読み飛ばしてもいいと思います。後者をよく読んでください。

    IIS 7.0 での組み込みユーザーとグループ アカウントとは
    https://technet.microsoft.com/ja-jp/library/dd939094.aspx

    アプリケーション プール ID
    https://technet.microsoft.com/ja-jp/library/ee886292.aspx

    ただし、佐祐理さんが書かれたように IIS で動かした場合は GetSetting メソッドはそもそも使えないかもしれません。(IIS で「ユーザーが対話形式でログオン」の条件は満たせないと思われますので。検証した訳ではないのではっきりしたことは言えませんが)

    その場合は GetSetting メソッドではなくて、紹介した記事のコードにあるように RegistryKey クラスを使ってみてください。

    それより、レジストリを使う以外に選択肢がないのでしょうか? 目的が書いてないので分かりませんが、ASP.NET 組み込みの機能を使って、もっと簡単かつスマートにやりたいことを実現できるような気がします。

    2015年11月22日 2:18
  • すみません。作ってものを記述忘れました。

    Web Formsになります。

    最初にWindowsフォ-ムのディスクトップアプリを作成しまして、

    その、アプリでレジストリに番号を書き込んでいました。

    その番号を今回のWeb Formsで、値を取得したかったのです。

    記事を参考に致します。

    さらに、おしゃるとおり、レジストリ以外の選択肢

    も考えてみます。

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

    2015年11月22日 12:31
  • > 最初にWindowsフォ-ムのディスクトップアプリを作成しまして、
    > その、アプリでレジストリに番号を書き込んでいました。
    > その番号を今回のWeb Formsで、値を取得したかったのです。

    それは単に Windows Forms アプリでやったことを ASP.NET Web Forms アプリでも試してみたかっただけということですか?

    そうではなくて、ASP.NET Web Forms アプリで何かレジストリを使って情報を保持する必要があってやっているのですか?

    前者ならお好きなようにと言うほかないですが、後者であれば全体的なシナリオ・やりたいことを書いてもらえばレジストリを使うなんて面倒なことでなくてもっとスマートな代案が出てくるかも知れませんので、そうすることをお勧めします。

    • 回答の候補に設定 星 睦美 2015年11月26日 2:38
    • 回答としてマーク 星 睦美 2015年11月30日 8:03
    2015年11月22日 13:20
  • もし、Windowsアプリで設定を行って、Webアプリ側で読み込みたいというような目的であれば、対象のレジストリはアカウント毎に固有の領域ということですので、アカウントを同じにしないと実現できません。

    ついでにアプリケーションプールの設定でユーザープロファイルのロードを有効に設定する必要があります。

    がまあ当然そういうやり方はお勧めはできませんので、別の方法を考えるほうがいいでしょうね。

    単なる設定値ならWeb.configでたいてい事足りるでしょうし。

    --追記

    「ついでにアプリケーションプールの設定でユーザープロファイルのロードを有効に設定する必要があります。」

    と書きましたが、この設定はデフォルトでTrueになっている雰囲気ですね。

    結局アプリケーションプールのアカウントを、デスクトップアプリを実行したのと同じアカウントに設定するだけで動作はしそうです。

    ※動作はしそうですが、もちろんお勧めはしません。

    • 編集済み なちゃ 2015年11月24日 11:29
    • 回答の候補に設定 星 睦美 2015年11月26日 2:38
    • 回答としてマーク 星 睦美 2015年11月30日 8:03
    2015年11月24日 4:23