Question

V77777 on Sat, 21 Nov 2015 08:12:38


お世話になります。

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

Dim strW As String

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

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

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

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

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

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

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


Sponsored



Replies

SurferOnWww on Sat, 21 Nov 2015 08:51:32


質問する際は、一番最初に、何を作っているのか(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 とかですと、そもそもそういうことができるのかどうかも分かりません。



佐祐理 on Sat, 21 Nov 2015 09:09:41


GetSetting 関数には

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

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

V77777 on Sat, 21 Nov 2015 17:03:43


申し訳ございませんでした。

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

OS:Windows7 Pro SP1

.NET:Ver2.0

IIS:Ver7.5

VS:Ver2010(VB.net)

これらが、環境です。

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

SurferOnWww on Sun, 22 Nov 2015 02:18:22


何を作っているかは書けない事情があるのでしょうか?

とりあえず、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 組み込みの機能を使って、もっと簡単かつスマートにやりたいことを実現できるような気がします。

V77777 on Sun, 22 Nov 2015 12:31:31


すみません。作ってものを記述忘れました。

Web Formsになります。

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

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

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

記事を参考に致します。

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

も考えてみます。

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

SurferOnWww on Sun, 22 Nov 2015 13:20:52


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

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

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

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

なちゃ on Tue, 24 Nov 2015 04:23:45


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

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

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

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

--追記

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

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

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

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