• 締切済み

.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("----------------"); } } } }

  • a-k-a
  • お礼率43% (77/176)

みんなの回答

  • AlexSuns
  • ベストアンサー率67% (78/115)
回答No.2

Win32_PingStatus クラスはWin2000で使用できないですよ ちなみにWin2000では、WMISQLにてWhere句は使用できません

回答No.1

.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を実行(ぉ

関連するQ&A

  • c# コマンドラインから引数の指定の仕方

    c#を勉強している初心者です。 入門書やネットで検索してもコマンドラインから引数の指定の仕方が わかりません。 次のように書いた後 class CommandLine {    static void Main(string[] args)     {        Console.WriteLine("parameter count = {0}", args.Length);        for (int i = 0; i < args.Length; i++)        {           Console.WriteLine("Arg[{0}] = [{1}]", i, args[i]);        }     } } デバックなしで開始 → 続行するには何かキーを押してください で終わってしまいます。 いつ、どのようにしてコマンドラインから指定(書き込む?)のですか? よろしくお願いします。

  • C#でコンパイルができない。

    C#のベータ版をセットアップして以下のサンプルプログラムを コンパイルしたところ、エラーがでました。何がいけないのでしょうか?OSはWin98です。 css001.cs(7,3): error CS0117: 'System.Console' does not contain a definition for 'Writeline' using System; プログラムリスト public class CSS001 { public static void Main(string[] args) { Console.Writeline("Hello World"); } }

  • Visual C++ 2008 Express Editionの”hello worldのプログラム”

    CUIのプロジェクト作成で自動的に // cui_test.cpp : メイン プロジェクト ファイルです。 #include "stdafx.h" using namespace System; int main(array<System::String ^> ^args) { Console::WriteLine(L"Hello World"); return 0; } このようなプログラミングができて一つ疑問ができたのですが、 ”Console::WriteLine(L"Hello World");” System::Console:: のメソッドの中にある ”WriteLine(L"Hello World");” なぜ”(L"Hello World")”という引数の書き方をしているのですか? ”L”と”"Hello World"”というのは別々の引数として登録しているのでしょうか? オブジェクトブラウザでSystem::Console:: WriteLineを検索したのですが、18種類あってどれを使っているのかわかりません。 教えてくださいよろしくお願いいたします。

  • C#の変数の範囲

    C#の変数の範囲 質問させてください。 以下は、ネットに掲載されていたC#の問題です。 ~ここから~ 下記のC#のコードを実行した場合、"Hello World!"と二行表示されます。 using System; class Program { static void Main(string[] args) { string s = "Hello"; Action a = () => Console.WriteLine(s); s += " World!"; a(); Console.WriteLine(s); } これを一行目だけ"Hello"と表示される場合、 Action a = () => Console.WriteLine(s);をどう書き換えればよいでしょうか。 1. Action a = () => Console.WriteLine("Hello!"); 2. Action<string> a = (s) => Console.WriteLine(s); 3. Action a = () => Console.WriteLine(t - " World!"); 4. string t = s; Action a = () => Console.WriteLine(t); 5. Action a = () => { string t = s; Console.WriteLine(t); }; ~ここまで~ 正解は4だそうですが、「何故」そうなるかがわかりません。 汗 私としては、1.4.も題意を満たす気がするのですが・・・。 お知恵をお貸しください。 出展 http://www.atmarkit.co.jp/fdotnet/extremecs/extremecs_07/extremecs_07_10.html

  • vb2005でXmlReaderの使い方

    xmlファイルの読込がうまくいきません。どこが間違っているでしょうか。 参考にしたページ http://msdn.microsoft.com/ja-jp/library/ayf5ffy5(v=vs.80).aspx -----xmlファイルここから----- <root> <parentnode1> <childnode1>100</childnode1> </parentnode1> <parentnode2>20</parentnode2> </root> -----xmlファイルこまで----- -----コードここから----- Sub Main() Dim b As Boolean Dim objXmlR As XmlReader = XmlReader.Create("c:\temp\sample.xml") objXmlR.MoveToContent() b = objXmlR.ReadToDescendant("parentnode1") Console.WriteLine(objXmlR.Name) '「parentnode1」を出力 Console.WriteLine(objXmlR.Value) '「」を出力 b = objXmlR.ReadToDescendant("childnode1") Console.WriteLine(objXmlR.Name) '「childnode1」を出力 Console.WriteLine(objXmlR.Value) '「」を出力。ここで「100」が出て欲しい End Sub -----コードここまで----- 基本的なことだと思いますがよろしくお願いします。

  • 分岐処理について

    "AAA"、"BBB"という検索条件でdatagridviewに表示させたいのですが、 『argumentNullexceptionはハンドルされませんでした』というMSGが、haisinA.fill(tbl)の部分で止まってしまいます。これを解決するにはどうすればいいのでしょうか? 色々検索とかしてみたのですが混迷してしまって・・・。 ご助言を頂けたら幸いです。宜しくお願い致します。 ******************************************************************************** Dim tbl As New DataTable() Dim haishinA As New OracleDataAdapter 'リスト条件 Dim SBL As String = Me.cbox2.SelectedIndex.ToString If SBL = "0" Then SBL = "AAA" ElseIf SBL = "1" Then SBL = "BBB" End If '検索 Dim SBF1, SBF2 As String SBF1 = "select * from テーブル名 where sendto = 'AAA'" SBF2 = "select * from テーブル名 where sendto = 'BBB'" Console.WriteLine(SBF1) Console.WriteLine(SBF2) haishinA.Fill(tbl) DataGridView1.DataSource = tbl ******************************************************************************** 

  • C#についての質問です

    Microsoft Visual C# 2010 Express をつかって using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Console { class Program { static void Main(string[] args) { Console.WriteLine("皆様、はじめまして"); } } } と入力して.csで保存したのですが、コマンドプロンプトで 'csc' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 とでてコンパイルできません。対応を教えてください。

  • C#

    C#の質問です。 『クラスIntArrayを作成し、作成したクラスが正常に動作するか検証するためのクラスを作成してください。』 というプログラムを組んでおり、クラスIntArrayとその動作を検証するクラスを作成したのですが、クラスIntArrayについて「問題文で指定された通りに作成されていません。」という指摘を受けました。 何度も見直したのですが、どの部分が指定された通りになっていないのか、自分では見つけることが出来ませんでした; 私が作成したクラスIntArrayとその仕様については、下記のとおりです。 お分かりになる方がいらっしゃいましたら、ご助言をお願いいたします。 【クラスIntArray 仕様】 <インスタンス変数> int型の配列data <コンストラクタ> 以下の3種類を用意します。 ・int型の配列を受け取り、そのコピーを内部的に保持します。 ・第1引数で指定された要素数を持つ配列を確保し、全ての要素に初期値として第2引数で指定された値をセットします。 ・第1引数で指定された要素数を持つ配列を確保し、全ての要素に初期値としてゼロをセットします。 <メソッド> ・Sort 内部的に保持している配列を、引数の値がtrueであれば昇順、falseであれば降順にソートする ・Length IntArrayが保持している配列の要素数を取得する ・GetElement 引数に指定された要素番号の値を取得する ・SetElement 第1引数に指定された要素番号に第2引数で指定された値を格納する ・GetArray IntArrayが保持している配列のコピーを取得する 【作成したクラスIntArray】 using System; private int[] data; public IntArray(int[] array) { this.data = new int[array.Length]; array.CopyTo(this.data, 0); for (int index = 0; index < this.data.Length; index++) { // 先頭の要素以外を出力する場合 if (index > 0) { Console.Write(", "); } Console.Write(this.data[index]); } Console.WriteLine(); } public IntArray(int args1, int args2) { int[] myarray = new int[args1]; for (int index = 0; index < args1; index++) { myarray[index] = args2; } for (int index = 0; index < myarray.Length; index++) { // 先頭の要素以外を出力する場合 if (index > 0) { Console.Write(", "); } Console.Write(myarray[index]); } Console.WriteLine(); } public IntArray(int args) { int[] myarray = new int[args]; for (int index = 0; index < args; index++) { myarray[index] = 0; } for (int index = 0; index < myarray.Length; index++) { // 先頭の要素以外を出力する場合 if (index > 0) { Console.Write(", "); } Console.Write(myarray[index]); } Console.WriteLine(); } public void Sort(bool flg) { Array.Sort(this.data); //昇順にソート if (!flg)  //降順にソート { Array.Reverse(this.data); } for (int index = 0; index < this.data.Length; index++) { // 先頭の要素以外を出力する場合 if (index > 0) { Console.Write(", "); } Console.Write(this.data[index]); } Console.WriteLine(); } public int Length() { return this.data.Length; } public int GetElement(int args) { int getvalue = this.data[args]; return getvalue; } public void SetElement(int args1, int args2) { this.data[args1] = args2; } public void GetArray() { for (int index = 0; index < this.data.Length; index++) { // 先頭の要素以外を出力する場合 if (index > 0) { Console.Write(", "); } Console.Write(this.data[index]); } Console.WriteLine(); } }

  • C#でカレンダーを作っているのですがここから先がわかりません。どなたかおしえてもらえませんか?

    using System; using System.Collections.Generic; using System.Text; namespace 万年カレンダー { class MyEventCiass { static void Main(string[] args) { int nen, tuki,tukinohi,youbi;    //西暦の入力 System.Console.Out.WriteLine("西暦を入力してください。"); nen = int.Parse(Console.ReadLine()); //月の入力 System.Console.Out.WriteLine("月を入力してください。"); tuki = int.Parse(Console.ReadLine()); //西暦と月の出力 Console.WriteLine(nen + "年" + tuki + "月"); switch (tuki) { case 2: if (nen % 4 == 0 && (nen % 100 != 0 || nen % 400 == 0)) tukinohi = 29; else tukinohi = 28; break; case 4: case 6: case 9: case 11: tukinohi = 30; break; default: tukinohi = 31; break; } if (tuki == 1 || tuki == 2) { nen = nen -1 ; tuki = tuki + 12; } //曜日の出力 Console.WriteLine("日 月 火 水 木 金 土"); youbi = (nen + nen / 4 - nen / 100 + nen / 400 + (13 * tuki + 8) / 5 + 1) % 7; if (youbi == 0) youbi = 7; for (int i = 1; i <= youbi ;i += 1 ) { Console.Write(i.ToString()); } for (int i = 4; i <= tukinohi; i += 1) { Console.Write(i.ToString()); } Console.ReadLine(); } } }

  • C#を教えてください。

    下記のコードで33個のエラーが出てきました。 Visual Studio 2017 C#でです。 ボクは忠実にコードを写しました。 重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態 エラー CS0103 名前 'answer' は、現在のコンテキストに存在しません。 jump14 C:\Users\kouzo\source\repos\jump14\jump14\Program.cs 20 アクティブ 重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態 エラー CS1002 ; が必要です。 jump14 C:\Users\kouzo\source\repos\jump14\jump14\Program.cs 12 アクティブ など納得の行かないエラーメッセージばかりです。 何故でしょうか? ご回答のほど宜しくお願い申し上げます。 namespace jump14 { class Program { static void Main(string[] args) string right = "正解", wrong = "不正解"; bool value; value = true; string answer = value ? right : wrong; Console.WriteLine(answer); value = false; answer = value ? right : wrong; Console.WriteLine(answer); } }

専門家に質問してみよう