Windows PowershellでUDPを送信するのに作ってみた

スポンサーリンク

自分の備忘禄として
WindowsでUDPを送信するのにパワーシェルを使って送信するのに折角なので下記の様なフォームに入力して実行する物を作ってみました。
ついでにTCPも送る様にしました。
コードなどはもっとこうした方が良いなどは多々あると思いますので、あくまで参考までに

Powershellはどの業務PCでも大体使用できるので

UDPはこんな感じ
※UDPは相手への到達性が無くても実行されます

TCPを送るとこんな感じ

ps1 で実行すると後ろにPowershellのウインドウが開くので、バッチにして開くのがお勧め

powershell.exe -WindowStyle Hidden -ExecutionPolicy RemoteSigned “ps1へのパス”

Formを作らなくても下記のコマンドを実行するだけでもUDPの送信はできるので、急ぎの時はこちらで

$udp_obj = New-Object System.Net.Sockets.UdpClient
$udp_byte = [Text.Encoding]::UTF8.GetBytes('UDP-TESST')
#送信先がFQDNの場合は""で囲う
$udp_obj.Send($udp_byte, $udp_byte.Length, 宛先IP or "FQDN", ポート番号 )

コード

Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

#フォーム処理関数
function check_form(){
    $logbox.Clear()
    $port = $textBox_port.text
    $addr = $textBox_addr.Text
    $now= Get-Date -Format "yyyy/MM/dd HH:mm:ss"

    #Nullチェック
    if ([String]::IsNullOrEmpty($addr) -or [String]::IsNullOrEmpty($port) ){
        $logbox.AppendText("値が空です")
        return
    }
    #ポート番号の数値型チェック
    if  (-not([int64]::TryParse($port,[ref]$null))) {
        $logbox.AppendText("数値以外の値なので、修正して下さい")
        return
    }
    #ポート番号を数値型に変換してポート番号確認
    $port_No = [int64]$port     #int型に入れないと何故か文字列扱いになったから
    if ($port_No -ge 65535) {
        $logbox.AppendText("ポート番号:$port`r`nポート番号は0〜65535です")
        return
    }
    try{    
        if ($tcp_radio.Checked){
            $logbox.forecolor = "black"
            $logbox.AppendText("実行中・・・")
            $ping_res = Test-Connection $addr -Quiet  #Test-netConnectionが何でだかQuietで無いと失敗するのでここでPingを実施
            $tcp_res = Test-netConnection $addr -port $port_No -InformationLevel Quiet  #何でだかQuietで無いと失敗する
            $logbox.Clear()
            $logbox.AppendText("宛先=$addr Port=:$port `r`n")
            $logbox.AppendText("[$now] ping=$($ping_res) TCP=$($tcp_res)")
        } elseif ($udp_radio.Checked){
            #UDP送信用
            $udp_obj = New-Object System.Net.Sockets.UdpClient
            #UDP送信用データ内容
            $udp_byte = [Text.Encoding]::UTF8.GetBytes('UDP-TESST')
            $i = 1
            $logbox.forecolor = "black"
            while ($i -le 4) {
                # (送信データ, 送信データサイズ, 宛先アドレス, 宛先ポート番号)
                $udp_obj.Send($udp_byte, $udp_byte.Length, $textBox_addr.text, $textBox_port.text)
                $logbox.AppendText("$($i)回目送信 Addr=$addr Port=:$port `r`n")
                $i += 1
            }
        }
    }
    catch{
        $logbox.AppendText("FQDNが間違っている")
        return
    }
}

# フォームの作成
$form = New-Object System.Windows.Forms.Form
$form.Text = 'Data Entry Form'
$form.Size = New-Object System.Drawing.Size(500,450)
$form.StartPosition = 'CenterScreen'

# フォントの設定
$font = New-Object System.Drawing.Font("MS ゴシック",15)

#グループ枠
$GroupBox = New-Object System.Windows.Forms.GroupBox
$GroupBox.Location = New-Object System.Drawing.Point(10,10)
$GroupBox.size = New-Object System.Drawing.Size(200,60)
$GroupBox.text = "TCP/UDP"
$form.Controls.Add($GroupBox)

#ラジオボタン
$tcp_radio = New-Object System.Windows.Forms.RadioButton
$tcp_radio.Location = New-Object System.Drawing.Point(20,20)
$tcp_radio.size = New-Object System.Drawing.Size(80,30)
$tcp_radio.Checked = $True
$tcp_radio.Text = "TCP"
$udp_radio = New-Object System.Windows.Forms.RadioButton
$udp_radio.Location = New-Object System.Drawing.Point(110,20)
$udp_radio.size = New-Object System.Drawing.Size(80,30)
$udp_radio.Text = "UDP"

#グループ枠にラジオボタンを追加
$GroupBox.Controls.AddRange(@($tcp_radio,$udp_radio))

# ラベル1の設定
$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Point(10,90)
$label.Size = New-Object System.Drawing.Size(180,30)
$label.Text = '宛先IPアドレス:'
$label.font = $font
$form.Controls.Add($label)

# 入力ボックス1の設定
$textBox_addr = New-Object System.Windows.Forms.TextBox
$textBox_addr.Location = New-Object System.Drawing.Point(190,90)
$textBox_addr.Size = New-Object System.Drawing.Size(200,30)
$textBox_addr.font = $font
$form.Controls.Add($textBox_addr)

# ラベル2の設定
$label2 = New-Object System.Windows.Forms.Label
$label2.Location = New-Object System.Drawing.Point(10,140)
$label2.Size = New-Object System.Drawing.Size(180,30)
$label2.Text = '送信ポート:'
$label2.font = $font
$form.Controls.Add($label2)

# 入力ボックス2の設定
$textBox_port = New-Object System.Windows.Forms.TextBox
$textBox_port.Location = New-Object System.Drawing.Point(190,140)
$textBox_port.Size = New-Object System.Drawing.Size(200,30)
$textBox_port.font = $font
$form.Controls.Add($textBox_port)

# OKボタン
$okButton = New-Object System.Windows.Forms.Button
$okButton.Location = New-Object System.Drawing.Point(200,200)
$okButton.Size = New-Object System.Drawing.Size(80,30)
$okButton.Text = 'OK'
#$okButton.DialogResult = 'OK'
$okButton.Add_Click( { check_form })   #OKボタンを押すと関数を実行
$form.AcceptButton = $okButton
$form.Controls.Add($okButton)

# キャンセルボタン
$cancelButton = New-Object System.Windows.Forms.Button
$cancelButton.Location = New-Object System.Drawing.Point(300,200)
$cancelButton.Size = New-Object System.Drawing.Size(80,30)
$cancelButton.Text = '終了'
$cancelButton.DialogResult = "Cancel"
$form.CancelButton = $cancelButton
$form.Controls.Add($cancelButton)

#ログテキストボックス
$script:logbox = New-Object System.Windows.Forms.TextBox
$logbox.Multiline = $true #複数行表示
$logbox.Location = New-Object System.Drawing.Point(20,250)
$logbox.Size = New-Object System.Drawing.Size(450,100)
$logbox.ScrollBars = "Vertical" #縦のスクロールバーを表示
$logbox.font = "MS ゴシック,13"
$logbox.forecolor = "red"
$form.Controls.Add($logbox) #フォームに追加

# 最前面に表示する
$form.Topmost = $True

# フォームが表示されたとき入力ボックス部分を選択した状態にする
$form.Add_Shown({$textBox_addr.Select()})

$form.ShowDialog()

コメント

タイトルとURLをコピーしました