質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

2431閲覧

Installerクラスからレジストリを読めないPCがあります。

sparc

総合スコア19

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2020/03/26 01:14

編集2020/03/26 01:59

はじめまして、よろしくお願いいたします。
はじめての投稿なので失礼がありましたらご教示ください。

悩んでいるのは、
c#(.NET Framework)でビルドしたPCでは問題なくレジストリを読み込むことができるのに、
他のPCで実行すると、レジストリが読めないことです。

■手順

c#

1 RegistryKey key = Registry.CurrentUser; 2 key = key.OpenSubKey(@"Software\XXXXX\XXXXX\XXXXX"); 3 MessageBox.Show(key.ToString());
  1. Installerクラス内にレジストリを読み込む処理を記載(dllファイル)

  2. setupプロジェクトをビルドし、作成されたsetup.exeを実行する。

  3. ビルドしたPC(端末A)でインストール実施→正常終了

  4. 作成されたsetup.exeを他のPC(端末B)で実行すると、

  インストール中、「オブジェクト参照がオブジェクトインスタンスに設定
されていません。」でエラーになります。

■参考
コンソールアプリ(exe)で、上記1のコードを書くと正常終了しますので、
端末Bにも当該レジストリキーは存在します。

OSのバージョン(Win10 64bit)、ユーザ権限(admin)も同じです。

何かお気づきの点があればアドバイスいただけたら助かります。
よろしくお願いいたします。

■追記

c#

1 RegistryKey key = Registry.CurrentUser; 2 key = key.OpenSubKey(@"Software\XXXXX\XXXXX\XXXXX"); 3 MessageBox.Show(key.ToString()); ★

MessageBoxの記載(★)を削除すると、「オブジェクト参照がオブジェクトインスタンスに設定されていません。」の
エラーは発生しません。
ただ、端末A(ビルドしたPC)と端末B(その他のPC)で動作が違うのが未だに分かりません。。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2020/03/26 01:24

.NET Core ではありませんか?
Wind

2020/03/26 01:24

他のPCにも読むレジストリの項目が有り値は入っているのでしょうか?
Zuishin

2020/03/26 01:25 編集

いや、読み間違えました。タイトルは内容を表すものにしてください。できないのはレジストリを読むことではなく、セットアップです。
sparc

2020/03/26 01:28

Zuishin様 大変失礼しました。記載を見直しました。ご指摘ありがとうございます。
sparc

2020/03/26 01:31

Wind様 ありがとうございます。 はい、他のPCにも同様のレジストリが間違いなくあり、値も入っていることは確認済です。 同じコードでコンソールプログラムから実行すると読み込めるので。
Zuishin

2020/03/26 01:33

いや、レジストリを読む以前にセットアップで失敗していませんか? インストールできてないんですよね? レジストリの問題ではなく、セットアッププロジェクトの作成に失敗しているのではありませんか?
Zuishin

2020/03/26 01:34

それとも、レジストリを読もうとしているのは setup.exe ですか? だとしたらそれをどのようにして作ったのかという情報が必要になります。
dodox86

2020/03/26 01:38

端末A,端末Bともに64ビット版Windowsなのですよね。その読みだすDLLは32ビット版ですか? HKEY_CURRENT_USER\Software\Wow6432Node にキーがあるのでは?
sparc

2020/03/26 01:39

いえ。 セットアップが失敗しているのは、記載したコードでレジストリが取得できないからです。 レジストリを読み込むコードを削除するとセットアップは完了します。
hihijiji

2020/03/26 01:40

MessageBox.Show(key.ToString()); を MessageBox.Show(key?.ToString() ?? System.Environment.UserName); にしてみてください。
sparc

2020/03/26 01:48

dodox86様 ありがとうございます。DLLは32ビットです。 HKEY_CURRENT_USER\Software\Wow6432Node も疑ったのですが、値はありませんし、 レジストリの場所は間違いなくあっているのです。
sparc

2020/03/26 01:52

hihijiji様 ありがとうございます。 端末Aでは正しく読めて、端末BではSYSTEMと表示されてしまいました。 何かあるんですね、お分かりでしょうか?
sparc

2020/03/26 01:57

hihijiji様のアドバイスで気づいたのですが、MessageBoxの記載を削除すると、「オブジェクト参照がオブジェクトインスタンスに設定されていません。」のエラーは発生しませんでした。 ただ、端末間で動作が違うのが未だに分かりません。。
dodox86

2020/03/26 02:10 編集

System.Environment.UserName);でのユーザー名が"SYSTEM"なのは、インストール過程でWindows InstallerサービスがそのDLLを動かしている(アクション)からです。"SYSTEM"ユーザーのHKEY_CURRENT_USERは当然、別のところなので読めません。実行されているアクションが違うのかな?解せませんが。
sparc

2020/03/26 02:23

dodox86様 ありがとうございます。端末A、端末BともMessageBox.Show(Environment.UserName);ではSYSTEMと表示されました。それでも端末Aはレジストリ読めるんですよね。
Zuishin

2020/03/26 02:26

HKEY_USERS 以下に各ユーザーの HKEY_CURRENT_USER の元が入っています。どのユーザーが見るかによってこの中のどれが HKEY_CURRENT_USER になるかが変わります。ここはまだ調べてないですよね?
sparc

2020/03/26 02:32

Zuishin様 ありがとうございます。はい、ここは未チェックです!(勉強になりました)。 これから違いを調べてみて、気づいたところを投稿します。
dodox86

2020/03/26 02:42

>sparcさん > 端末A、端末BともMessageBox.Show(Environment.UserName);ではSYSTEMと表示されました。それでも端末Aはレジストリ読めるんですよね。 そう言う意味でしたか。であればまた別の問題ですね。Windowsインストーラーは、*.msiを起動したときのユーザーアカウントで動作するUIのプロセスと、Windows Installerサービスのアカウント("SYSTEM")のWindowsサービスプロセスの協調動作でインストールを行います。レジストリを読むような独自のカスタムアクションの実行タイミングによって参照できるUserNameが変わるということで、それがHKEY_CURRENT_USERの参照先も変わる、ということにつながりますので、その線での指摘でした。
dodox86

2020/03/26 02:46 編集

> *.msiを起動したときのユーザーアカウント *.msiを内包するランチャーであるsetup.exeを使っているのであれば、ユーザーアカウント事情もまた複雑になりますけども。(以上、単なる参考情報です)
sparc

2020/03/26 02:56

Zuishin様、みなさま Zuishin様のヒントのおかげで、かなり前進しました。 失敗する端末Bのレジストリ、HKEY_USERS\S-1-5-18(システム)を見ると、当該キーがありませんでした。ここにキーを手動で作ってあげると、端末Bでも成功しました。 成功する端末Aには、もともとHKEY_USERS\S-1-5-18配下に、当該キーがありました。 つまり、端末Aと端末Bの違いは、HKEY_USERS\S-1-5-18配下にキーがあるかないか。でした。 ただなぜ、端末Bにはその値がないのかが分かりません。 ちなみに、端末C(HyperV)も見てみましたが、こちらもHKEY_USERS\S-1-5-18配下にキーはなく、レジストリ取得できません。
sparc

2020/03/26 02:59

dodox86様 私のコメントが分かりにくくて申し訳ありません。 大変勉強になります!ありがとうございます。
dodox86

2020/03/26 03:06 編集

HKEY_CURRENT_USER¥Softwareの下は、まさに個別のソフトウェア製品のキーが並ぶところなので、端末Aにしかインストールされていない何らかのソフトがあるのではないですか。それでも、あまりSYSTEMユーザー用の下にキーがあるのは見たことが無いですけど。(あっていけないものでもないが)
sparc

2020/03/26 04:27

SYSTEMユーザー用の下にキーは当該ソフト以外にもAdobeやDropBoxなどのキーもありました。 ただ、おっしゃるとおり、インストールされている全てがある理由ではありませんね。
sparc

2020/03/26 04:31

お付き合いいただいたみなさま 結論として、レジストリが取得できないのではなく、レジストリキーの配置に問題があることが分かりましたので、こちらはクローズさせていただきたいと思います。 CurrentUserの参照は辞めて、LocalMachineなど他のキーを参照することにしたいと思いますが、新たな問題が。。。散々悩んで分からなかったらこちらでお世話になれればと思います。 皆様、多くのアドバイスありがとうございました。勉強になりました!
sparc

2020/03/26 04:46

すみません。なんだか結果を入力したら自分のがベストアンサーになってしまいました。 みなさま、特にZuishin様のアドバイスが解決のきっかけでした。失礼を申し訳ありません。
Zuishin

2020/03/26 04:50

自分のがベストアンサーでいいと思いますよ。あとユーザーが違うことに気づいた hihijiji さんの功績が大きいんじゃないかと思います。
sparc

2020/03/26 04:56

Zuishin様アドバイスありがとうございます。 確かに、hihijiji様のSYSTEMと出てきましたがこれは一体?というところがきっかけです! hihijiji様、大変失礼しました。SYSTEM?あれ?ユーザ名が出てこない?となったことから、Zuishin様やdodox86様のアドバイスに繋がったものと思います。よろしければ今後とも宜しくお願いいいたします。
guest

回答1

0

自己解決

HKEY_CURRENT_USER配下にキーがあるにも関わらず、参照しにいくとエラーになるというのが今回の問題。

コンソールアプリでは、ログインユーザで参照しにいくので問題ないが、
Installerクラスだとsystemユーザで参照しにいくので、HKEY_CURRENT_USERにキーがあっても、
HKEY_USERS配下にも当該キーがないといけない。

今回の場合、現象が再現する2台とも、HKEY_CURRENT_USER配下にキーがあったが、
NGになるマシンでは、HKEY_USERS配下に当該キーがなかった。

HKEY_USERS配下に当該キーがない原因は不明だが、これは別問題である。

皆様のアドバイスありがとうございました。

投稿2020/03/26 04:40

sparc

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2020/03/26 06:47

あ、いえ、キーが存在しないのがそもそもの問題でしたね。失礼しました。
sparc

2020/03/26 06:59

あ、いえ。。。というのは、 今色々やっていてわかったのですが、キーはありました。違うところに。 端末Aは、HKEY_USERS\S-1-5-18(System)にあって、端末BはS-1-5-21(Administrator)です。 Installerクラスは、SYSTEMユーザなのでS-1-5-18を見に行くので、 (S-1-5-21に)キーがあっても端末Bはエラーになる。ということが分かりました。 HKEY_USERにはアンインストール情報もないので、どこから取れば安定するのか考えています。
sparc

2020/03/26 07:13

すみません。 今のところ、Users配下を全てなめることで対処しようとしています。 いつもアドバイスありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問