C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: VB.NET レジストリ参照


(過去ログ 65 を表示中)

[トピック内 16 記事 (1 - 16 表示)]  << 0 >>

■37557 / inTopicNo.1)  VB.NET レジストリ参照
  
□投稿者/ ooo (43回)-(2009/06/25(Thu) 11:20:08)

分類:[.NET 全般] 

お世話になります。

VS2005
VB.NETにて、クライアントマシンのレジストリ【ORACLE_HOME】 の値を参照したいのですが、
どのように行なえばよいでしょうか?

Imports Microsoft.Win32 ' RegistryKey クラスを使用するような気はしてるのですが。

引用返信 編集キー/
■37558 / inTopicNo.2)  Re[1]: VB.NET レジストリ参照
□投稿者/ .SHO (895回)-(2009/06/25(Thu) 11:25:30)
> VB.NETにて、クライアントマシンのレジストリ【ORACLE_HOME】 の値を参照したいのですが、
> どのように行なえばよいでしょうか?

レジストリ【ORACLE_HOME】って何ですか?

環境変数【ORACLE_HOME】の間違い?
引用返信 編集キー/
■37562 / inTopicNo.3)  Re[2]: VB.NET レジストリ参照
□投稿者/ ooo (44回)-(2009/06/25(Thu) 11:33:01)
No37558 (.SHO さん) に返信
>>VB.NETにて、クライアントマシンのレジストリ【ORACLE_HOME】 の値を参照したいのですが、
>>どのように行なえばよいでしょうか?
>
> レジストリ【ORACLE_HOME】って何ですか?
>
> 環境変数【ORACLE_HOME】の間違い?

レジストリエディタ上で見える、ORACLE_HOMEです。
環境変数のPATH内【ORACLE_HOME】と同一です。
引用返信 編集キー/
■37563 / inTopicNo.4)  Re[3]: VB.NET レジストリ参照
□投稿者/ すがり (45回)-(2009/06/25(Thu) 11:38:13)
http://dobon.net/vb/dotnet/system/registrykey.html

このへんでしょうかね。
引用返信 編集キー/
■37566 / inTopicNo.5)  Re[4]: VB.NET レジストリ参照
□投稿者/ ooo (46回)-(2009/06/25(Thu) 12:39:30)
結局以下でいきました。

 Private Function mFunGetOracle_Home() As String
        Dim KeyName As String = "SOFTWARE\ORACLE"
        Dim Name As String = "ORACLE_HOME"

        Try
            Dim wkReg As Microsoft.Win32.RegistryKey

            'HKEY_LOCAL_MACHINE配下のキーを操作する
            wkReg = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(KeyName)
            ' <<< ***** For Debug ****
            Console.WriteLine("{0}={1}", Name, wkReg.GetValue(Name))
            ' >>> ***** For Debug ****

            mFunGetOracle_Home = wkReg.GetValue(Name)

            wkReg.Close()
        Catch ex As NullReferenceException
            Console.WriteLine("エラー:{0}", ex.Message)
        Catch ex As Exception
            Console.WriteLine("エラー:{0}", ex.Message)
        End Try
    End Function

引用返信 編集キー/
■37574 / inTopicNo.6)  Re[5]: VB.NET レジストリ参照
□投稿者/ とっちゃん (403回)-(2009/06/25(Thu) 13:13:53)
とっちゃん さんの Web サイト
No37566 (ooo さん) に返信

ORACLEは持ってないので、わからんのですが、
コマンドプロンプトで set と入力するとだらだらと出てくる部分に
ORACLE_HOME=どこぞのパス?
となっているのでしょうか?

もしそうなら、なにもレジストリエディタを一生懸命いじらずとも
System.Environment.ExpandEnvironmentVariables メソッドを使えばいいような気がします。

使い方については、まずはヘルプなりで自身で調査してみてください。

引用返信 編集キー/
■37585 / inTopicNo.7)  Re[6]: VB.NET レジストリ参照
□投稿者/ 魔界の仮面弁士 (1135回)-(2009/06/25(Thu) 13:55:45)
2009/06/25(Thu) 13:57:06 編集(投稿者)

No37566 (ooo さん) に返信
> 結局以下でいきました。
RegistryKey クラスは IDisposable ですので、
 Using wkReg As Microsoft.Win32.RegistryKey = 〜
  Console.WriteLine( wkReg.GetValue(Name) )
 End Using
のように、Using ブロックで処理する必要があります。


No37574 (とっちゃん さん) に返信
> コマンドプロンプトで set と入力するとだらだらと出てくる部分に
> ORACLE_HOME=どこぞのパス?
> となっているのでしょうか?
設定にもよりますが、Windows 版ではレジストリで指定する仕様になっているため、
環境変数には登録されていないことの方が多いかと思います。

むしろ環境変数 ORACLE_HOME は登録しない事が推奨されている場合さえあるようで、
9i (9.2)のドキュメントには、下記の記述があるのだとか(当方未確認)。
http://winofsql.jp/VA003334/oracle040205003135.htm

なお、10g/11g ではレジストリのキー名が変更されていたかと。
http://otndnld.oracle.co.jp/document/products/oracle11g/111/windows/E05885-04/registry.htm


> もしそうなら、なにもレジストリエディタを一生懸命いじらずとも
> System.Environment.ExpandEnvironmentVariables メソッドを使えばいいような気がします。
もし、環境変数に登録されているのだとしたら、VB の場合は、
  System.Environment.GetEnvironmentVariable("ORACLE_HOME")
の代わりに、
 Environ("ORACLE_HOME")
と短く書く事ができます。
ただ、当方の環境では環境変数には含まれていなかったため、レジストリからの取得が必要でした。
(Microsoft.Win32.RegistryKey クラスとか、WMI の StdRegProv クラスとか)
引用返信 編集キー/
■37601 / inTopicNo.8)  Re[7]: VB.NET レジストリ参照
□投稿者/ とっちゃん (405回)-(2009/06/25(Thu) 17:01:11)
とっちゃん さんの Web サイト
No37585 (魔界の仮面弁士 さん) に返信
> 設定にもよりますが、Windows 版ではレジストリで指定する仕様になっているため、
> 環境変数には登録されていないことの方が多いかと思います。
>
> むしろ環境変数 ORACLE_HOME は登録しない事が推奨されている場合さえあるようで、
> 9i (9.2)のドキュメントには、下記の記述があるのだとか(当方未確認)。
> http://winofsql.jp/VA003334/oracle040205003135.htm
>
> なお、10g/11g ではレジストリのキー名が変更されていたかと。
> http://otndnld.oracle.co.jp/document/products/oracle11g/111/windows/E05885-04/registry.htm
>
なるほど。それだと、レジストリ操作が必要ですね。なかなか単純にはいかないんですねー


引用返信 編集キー/
■37609 / inTopicNo.9)  Re[1]: VB.NET レジストリ参照
□投稿者/ Jitta on the way (337回)-(2009/06/25(Thu) 19:00:48)
No37557 (ooo さん) に返信
> お世話になります。
>
> VS2005
> VB.NETにて、クライアントマシンのレジストリ

ここが、非常に気になります。
「クライアントマシンの」とは、どの様な状況で実行することを考えていらっしゃるのでしょう?
引用返信 編集キー/
■37674 / inTopicNo.10)  Re[2]: VB.NET レジストリ参照
□投稿者/ ooo (47回)-(2009/06/26(Fri) 16:33:26)
魔界の仮面弁士さん

確かに、Using 構文ではclose処理が必要ないですね。
またdisposeも自動か。

いつも勉強になります。

Jitta on the way さん

想定では、ファイルサーバーにアプリケーション.exeと.configファイルを置いて、
クライアントからそのexeをキックするイメージです。

ただし、現在テストしているのですが、不可思議な状況が起こっています。
あるクライアントマシンでは正常にレジストリを参照できるのですが、あるマシンでは参照できず、いづれも下記のエラーで
落っこちます。

<<< ****** error ***************
Just-In-Time (JIT) デバッグを呼び出すための詳細については、
ダイアログ ボックスではなく、このメッセージの最後を参照してください。

************** 例外テキスト **************
System.Security.SecurityException: 型 'System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' のアクセス許可の要求に失敗しました。
   場所 System.Security.CodeAccessSecurityEngine.Check(Object demand, StackCrawlMark& stackMark, Boolean isPermSet)
   場所 System.Security.CodeAccessPermission.Demand()
   場所 System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy)
   場所 System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options)
   場所 System.IO.StreamWriter.CreateFile(String path, Boolean append)
   場所 System.IO.StreamWriter..ctor(String path, Boolean append, Encoding encoding, Int32 bufferSize)
   場所 System.IO.StreamWriter..ctor(String path, Boolean append, Encoding encoding)
   場所 ModifiyingRegistryValue.Form1.mSubRegeditTypeGet()
   場所 ModifiyingRegistryValue.Form1.Form1_Load(Object sender, EventArgs e)
   場所 System.EventHandler.Invoke(Object sender, EventArgs e)
   場所 System.Windows.Forms.Form.OnLoad(EventArgs e)
   場所 System.Windows.Forms.Form.OnCreateControl()
   場所 System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
   場所 System.Windows.Forms.Control.CreateControl()
   場所 System.Windows.Forms.Control.WmShowWindow(Message& m)
   場所 System.Windows.Forms.Control.WndProc(Message& m)
   場所 System.Windows.Forms.ScrollableControl.WndProc(Message& m)
   場所 System.Windows.Forms.ContainerControl.WndProc(Message& m)
   場所 System.Windows.Forms.Form.WmShowWindow(Message& m)
   場所 System.Windows.Forms.Form.WndProc(Message& m)
   場所 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   場所 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   場所 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
失敗した操作:
Demand
失敗した最初のアクセス許可の種類:
System.Security.Permissions.FileIOPermission
失敗したアセンブリのゾーン:
Intranet


************** 読み込まれたアセンブリ **************
mscorlib
    アセンブリ バージョン: 2.0.0.0
    Win32 バージョン: 2.0.50727.832 (QFE.050727-8300)
    コードベース: file:///C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/mscorlib.dll
----------------------------------------
ModifiyingRegistryValue
    アセンブリ バージョン: 1.0.0.0
    Win32 バージョン: 1.0.0.0
    コードベース: file://osada-third/サンプルプログラム/REG_TEST/ModifiyingRegistryValue/ModifiyingRegistryValue/bin/Release/ModifiyingRegistryValue.exe
----------------------------------------
Microsoft.VisualBasic
    アセンブリ バージョン: 8.0.0.0
    Win32 バージョン: 8.0.50727.42 (RTM.050727-4200)
    コードベース: file:///C:/WINDOWS/assembly/GAC_MSIL/Microsoft.VisualBasic/8.0.0.0__b03f5f7f11d50a3a/Microsoft.VisualBasic.dll
----------------------------------------
System
    アセンブリ バージョン: 2.0.0.0
    Win32 バージョン: 2.0.50727.832 (QFE.050727-8300)
    コードベース: file:///C:/WINDOWS/assembly/GAC_MSIL/System/2.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
System.Windows.Forms
    アセンブリ バージョン: 2.0.0.0
    Win32 バージョン: 2.0.50727.832 (QFE.050727-8300)
    コードベース: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Windows.Forms/2.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
System.Drawing
    アセンブリ バージョン: 2.0.0.0
    Win32 バージョン: 2.0.50727.832 (QFE.050727-8300)
    コードベース: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Drawing/2.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
mscorlib.resources
    アセンブリ バージョン: 2.0.0.0
    Win32 バージョン: 2.0.50727.832 (QFE.050727-8300)
    コードベース: file:///C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/mscorlib.dll
----------------------------------------
System.Configuration
    アセンブリ バージョン: 2.0.0.0
    Win32 バージョン: 2.0.50727.832 (QFE.050727-8300)
    コードベース: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Configuration/2.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll
----------------------------------------
System.Xml
    アセンブリ バージョン: 2.0.0.0
    Win32 バージョン: 2.0.50727.832 (QFE.050727-8300)
    コードベース: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Xml/2.0.0.0__b77a5c561934e089/System.Xml.dll
----------------------------------------
System.Runtime.Remoting
    アセンブリ バージョン: 2.0.0.0
    Win32 バージョン: 2.0.50727.832 (QFE.050727-8300)
    コードベース: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Runtime.Remoting/2.0.0.0__b77a5c561934e089/System.Runtime.Remoting.dll
----------------------------------------
System.Windows.Forms.resources
    アセンブリ バージョン: 2.0.0.0
    Win32 バージョン: 2.0.50727.42 (RTM.050727-4200)
    コードベース: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Windows.Forms.resources/2.0.0.0_ja_b77a5c561934e089/System.Windows.Forms.resources.dll
----------------------------------------

************** JIT デバッグ **************
Just-In-Time (JIT) デバッグを有効にするには、このアプリケーション、
またはコンピュータ (machine.config) の構成ファイルの jitDebugging 
値を system.windows.forms セクションで設定しなければなりません。
アプリケーションはまた、デバッグを有効にしてコンパイルされなければ
なりません。

例:

<configuration>
    <system.windows.forms jitDebugging="true" />
</configuration>

JIT デバッグが有効なときは、このダイアログ ボックスで処理するよりも、
ハンドルされていない例外はすべてコンピュータに登録された
JIT デバッガに設定されなければなりません。
>>> ****** error ***************


うまくいくマシンとうまくいかないマシンの差異が見えず困っています。

引用返信 編集キー/
■37675 / inTopicNo.11)  Re[3]: VB.NET レジストリ参照
□投稿者/ 魔界の仮面弁士 (1136回)-(2009/06/26(Fri) 16:39:07)
2009/06/27(Sat) 15:38:26 編集(投稿者)

No37674 (ooo さん) に返信
> 想定では、ファイルサーバーにアプリケーション.exeと.configファイルを置いて、
> クライアントからそのexeをキックするイメージです。
exe をサーバーに配置しているのですね。
その場合、「コード アクセス セキュリティ」について調べてみてください。

提示されたログには、アセンブリが (LocalIntranet ではなく) Intranet ゾーンで
実行されており、それがファイル操作の部分(レジストリ操作ではない)に対して、
 System.Security.Permissions.FileIOPermission
の権限が不足していると記されています。


> 確かに、Using 構文ではclose処理が必要ないですね。
VB は、2005 になるまで Using が使えなかった事もあり、MSDN にある
サンプルの幾つかは、Using が使われない記述のままになっています、ご注意を。
(C# のサンプルでは、using が使われているのですけれどね…)

> またdisposeも自動か。
Using の使用は必須ではありませんが、先のコードですと、
レジストリ操作がすべて Try ブロックに記載されているため、
例外発生時には終了処理が保証されません。
もしも Try を使うなら、終了処理は Finally ブロックに記述しましょう。
引用返信 編集キー/
■37677 / inTopicNo.12)  Re[3]: VB.NET レジストリ参照
□投稿者/ Jitta on the way (338回)-(2009/06/26(Fri) 18:20:28)
No37674 (ooo さん) に返信
> 魔界の仮面弁士さん
>
> 確かに、Using 構文ではclose処理が必要ないですね。
> またdisposeも自動か。
>
> いつも勉強になります。
>
> Jitta on the way さん
>
> 想定では、ファイルサーバーにアプリケーション.exeと.configファイルを置いて、
> クライアントからそのexeをキックするイメージです。
>
> ただし、現在テストしているのですが、不可思議な状況が起こっています。
> あるクライアントマシンでは正常にレジストリを参照できるのですが、あるマシンでは参照できず、いづれも下記のエラーで
> 落っこちます。

エラー情報の中に、おそらく個人情報と思われる文字列が含まれているように思います。気を付けましょう。

ファイル サーバーの共有フォルダーにあるファイルを、クライアントからダブルクリックで起動する、でいいですか?
最近、.NET は触ってないので調べて頂きたいのですが、レジストリにアクセスする際、「読み取りのみ」と、アクセス権を指定することは出来ないですか?読み取る対象のキーがあるハイブによっては、それで読み込めるようになるかも知れません。詳しいところは、「コード アクセス セキュリティ」を調べる必要がありますけど。
引用返信 編集キー/
■37690 / inTopicNo.13)  Re[3]: VB.NET レジストリ参照
□投稿者/ 渋木宏明(ひどり) (1178回)-(2009/06/27(Sat) 00:37:35)
渋木宏明(ひどり) さんの Web サイト
> 確かに、Using 構文ではclose処理が必要ないですね。
> またdisposeも自動か。

その認識は逆です。

using は IDisposable.Dispose() 呼び出しを確実にするためのシンタックスシュガーです。

using によって IDisposable.Dispose() 呼び出しが行われた結果、Close() 等の呼び出しが省略できる場合もありますが、そうでない場合もあり得ます。

Close() 等の操作を省略して大丈夫なのかどうかは実装依存なので、ヘルプや仕様書などで、きちんと自分の扱うクラスの挙動を把握しておきましょう。


引用返信 編集キー/
■37703 / inTopicNo.14)  Re[4]: VB.NET レジストリ参照
□投稿者/ ooo (48回)-(2009/06/29(Mon) 11:27:46)
Jitta on the way さん

>エラー情報の中に、おそらく個人情報と思われる文字列が含まれているように思います。気を付けましょう。
まずいまずい。以後気をつけます。

>ファイル サーバーの共有フォルダーにあるファイルを、クライアントからダブルクリックで起動する、でいいですか?
そのとおりです。

>最近、.NET は触ってないので調べて頂きたいのですが、
>レジストリにアクセスする際、「読み取りのみ」と、アクセス権を指定することは出来ないですか?
>読み取る対象のキーがあるハイブによっては、それで読み込めるようになるかも知れません。
>詳しいところは、「コード アクセス セキュリティ」を調べる必要がありますけど。

調べました。下記のコードはあるレジストリの値の型を調べるために参照しているのですが。

    '***************************************************************************************************
    '------------------------
    'SUB情報
    '------------------------
    'SUB名  :mSubRegeditTypeGet
    '処理概要    :環境変数のデータ型を検証
    '引数1    :なし
    '***************************************************************************************************
    Private Sub mSubRegeditTypeGet()

        Try
            Using regkey As RegistryKey = Registry.LocalMachine.OpenSubKey(SYSTEM_SUBKEY, True, Security.AccessControl.RegistryRights.FullControl)
                If Not regkey Is Nothing Then
                    'レジストリ値のデータ型を調べる
                    Dim regDataType As RegistryValueKind = regkey.GetValueKind(SUBKEY_PATH)
                    'プライベートワークに格納
                    _objRegeditType = regDataType

                    txtType.Text = regDataType.ToString
                Else
                    MsgBox("レジストリが正しく開かれていません", MsgBoxStyle.Exclamation, _MSGTITLE)
                End If
            End Using

        Catch ex As Exception
            MessageBox.Show(ex.ToString())
            Me.txtReg.Text = ex.Message
        End Try

    End Sub

----
Registry.LocalMachine.OpenSubKey(SYSTEM_SUBKEY, True, Security.AccessControl.RegistryRights.FullControl)
----

Registry.LocalMachine.OpenSubKeyにてレジストリを開いています。その際の引数で
1個目が場所、
2個目が書き込むかどうか
3個目がそのアクセス権を表しているような形

上記のコードでも例外で落ちますね。
>、アクセス権を指定する
という意味では正しいと思っているのですが、

******************************************************************************************





コードアクセスセキュリティについても調べてみました。
クライアントマシンの管理ツールのMicrosoft .NET Framework 2.0 Configurationにて

ランタイムセキュリティポリシー>コンピュータ>アクセス許可セット

@上記アクセス許可セットにレジストリアクセス許可追加してあげました

ランタイムセキュリティポリシー>コンピュータ>コードグループ>LocalIntranet_Zone
A上記コードグループ>LocalIntranet_Zoneに@のアクセス許可セットを追加してあげました。

この作業によって、エラーが出ずにレジストリを参照することはできましたが。

結局のところ、ローカルマシンのコードアクセスセキュリティ構成?に依存され、プログラムでどうこうできる問題では
ないような気がしてきたのですが、いかがでしょうか?

アクセス許可セットの追加作業を行うくらいなら、ローカルに.exeを落としてきて実行するほうが、手間がかからないような
気がしてきました。


魔界の仮面弁士 さん
渋木宏明(ひどり) さん

毎回恒例のコードレビューありがとうございます。
勉強になります。
まだまだ知識・技術ともに足りませんが、精進します。


引用返信 編集キー/
■37706 / inTopicNo.15)  Re[5]: VB.NET レジストリ参照
□投稿者/ Jitta on the way (340回)-(2009/06/29(Mon) 11:57:26)
Using regkey As
RegistryKey =
Registry.LocalMachine.OpenSubKey
(SYSTEM_SUBKEY, True,
Security.AccessControl.RegistryRights.
FullControl)


FullControl の必要がありますか?
ReadKey で良くないですか?それでもセキュリティ例外が発生しますか?
引用返信 編集キー/
■37707 / inTopicNo.16)  Re[6]: VB.NET レジストリ参照
□投稿者/ ooo (49回)-(2009/06/29(Mon) 12:04:35)
Jitta on the wayさん

>FullControl の必要がありますか?
>ReadKey で良くないですか?それでもセキュリティ例外が発生しますか?

FullControl の必要はないですが、ReadKey でも例外は発生しますね。

第二引数をFalseにすることによって例外は防げますが、
クライアントからの.exeキックでは結局参照はできませんでした。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -