- 締切済み
.NET1.1でPING処理(C#からの変換)
VB2002+WIN2000を使用。 リモート端末へのアクセス前に起動確認処理としてPINGを使い、電源OFF時の待ち時間を減らしたいと考えています。 ○PINGの他に導通確認できる手軽なものがあるのでしたら教えてください。 PINGの処理はネットで検索した結果C#(1.1)のものでしたら発見できたため、それを利用しようと思っています。(サイトでもVBへの変換は簡単にできるとあったので^_^;) 自分なりに変換してみましたがエラーが発生してしまい原因/対応方が分かりません。 ぜひご教授下さい。よろしくお願いいたします。 (補足が必要であれば記述します。) 【元からの変更】 ・引数はなしにし、固定にしました。 ・Button1の処理に記述しました。 ・参照設定でSystem.Managementを追加しました。 【エラー】 スレッド '<名前がありません>' (0x59c) はコード 0 (0x0) で終了しました。 'System.Management.ManagementException' のハンドルされていない例外が system.management.dll で発生しました。 追加情報 : 無効なクラスです 【予想】 searcherにGetがない? 対策が分からず… ----- 変更プログラム ------ Imports System Imports System.Management Dim arg As String arg = "192.168.0.1" 'クエリ文字列の設定() Dim searcher As ManagementObjectSearcher = New ManagementObjectSearcher() searcher = New ManagementObjectSearcher("select * from Win32_PingStatus where address = '" & arg & "'") ' クエリ結果のとりだし Dim mo As ManagementObject 'エラー箇所 For Each mo In searcher.Get Dim i As Integer ' 結果のプロパティのチェックと状態の表示 If mo.Properties("StatusCode").Value = "" Or Convert.ToInt32(mo.Properties("StatusCode").Value) <> 0 Then Console.WriteLine(arg + ":稼働していません") Else Console.WriteLine(arg + ":稼働中") Console.WriteLine("IPAddress:" & mo.Properties("ProtocolAddress").Value) Console.WriteLine("ResponseTime:" & mo.Properties("ResponseTime").Value) End If Next Console.WriteLine("----------------") ------ 元プログラム(C#) ---------------------- using System; using System.Management; class PingExec { public static void Main(string[] args) { if(args.Length > 0) { foreach(string arg in args) { // クエリ文字列の設定 ManagementObjectSearcher searcher = new ManagementObjectSearcher( "select * from Win32_PingStatus where address = '" + arg + "'"); // クエリ結果のとりだし foreach( ManagementObject mo in searcher.Get() ) { // 結果のプロパティのチェックと状態の表示 if(mo.Properties["StatusCode"].Value == null || Convert.ToInt32(mo.Properties["StatusCode"].Value) != 0) { Console.WriteLine(arg + ":稼働していません"); } else { Console.WriteLine(arg + ":稼働中"); Console.WriteLine("IPAddress:" + mo.Properties["ProtocolAddress"].Value); Console.WriteLine("ResponseTime:" + mo.Properties["ResponseTime"].Value); } } Console.WriteLine("----------------"); } } } }
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- AlexSuns
- ベストアンサー率67% (78/115)
Win32_PingStatus クラスはWin2000で使用できないですよ ちなみにWin2000では、WMISQLにてWhere句は使用できません
- himajin100000
- ベストアンサー率54% (1660/3060)
.NET 3.5 Beta 2での検証を行いました。.NET 1.1では行っておりませんのでご了承ください。 [C#] mo.Properties["StatusCode"].Value == null [VB.NET] mo.Properties("StatusCode").Value = "" nullと空文字列(String型)は同じではなく, 比較できません。 で VB.NETではnullではなくNothingを使います。 Nothingと比較する際,演算子として参照比較演算子Isを用います。 =だと実体が同じではないので,falseを返してしまうでしょう。 #色々うだうだ述べて間違ってたら恥ずかしいので削除 #でも、うちの場合InvalidCastExceptionが出たので違うかも ===========実際に動作したサンプル============ Imports System Imports System.Management Class Q3484121 'きちんとクラス名は書こう Shared Sub Main 'Mainもきちんと書こう Dim arg As String arg = "127.0.0.1" 'クエリ文字列の設定() Dim searcher As ManagementObjectSearcher = New ManagementObjectSearcher() searcher = New ManagementObjectSearcher("select * from Win32_PingStatus where address = '" & arg & "'") ' クエリ結果のとりだし Dim mo As ManagementObject 'エラー箇所 For Each mo In searcher.Get ' 結果のプロパティのチェックと状態の表示 'himajin100000は自信がないので演算子Orが優先されないように括弧で括ってる If (mo.Properties("StatusCode").Value Is Nothing) Or (Convert.ToInt32(mo.Properties("StatusCode").Value) <> 0) Then Console.WriteLine(arg + ":稼働していません") Else Console.WriteLine(arg + ":稼働中") Console.WriteLine("IPAddress:" & mo.Properties("ProtocolAddress").Value) Console.WriteLine("ResponseTime:" & mo.Properties("ResponseTime").Value) End If Next Console.WriteLine("----------------") End Sub End Class '.NET 2.0以降 'http://msdn2.microsoft.com/en-us/library/system.net.networkinformation.ping.aspx 'その他,Process.Startでpingを実行(ぉ