2009年5月8日金曜日

PowerShellでDDNSサービスを更新(3)

PowerShellでDDNSサービスを更新(1)PowerShellでDDNSサービスを更新(2) 、の続き。
ddo.jp に対してPowerShell で更新をかけようというもの。
 
 

HTTPでクエリストリング付きのGETを送る


PowerShell から WebClient クラスを使ってクエリ文字列をくっつけたGETはどうすればいいのか。
 

単純にくっつけてみる



[sourcecode language='sh']# 引数格納、URL形式
param([string]$url)


# 途中で例外を吐いたらここに飛び、抜ける
trap [Exception] {
echo $error[0].exception
break
}


# クエリ文字列を作成
$query = "?dn=hoge.example.jp&pw=piyopiyo"


# .NetFramework の WebClient クラスを拝借
$webCli = New-Object System.Net.WebClient

# コンテンツを取得、無理やりくっつけてみる
$body = $webCli.DownloadString($url + $query)
[/sourcecode]

で、実行してHTTPで送られている内容をキャプチャ。※テストなのでhostヘッダが "sawano.members.icraft.jp"
GET /index.html?dn=hoge.example.jp&pw=piyopiyo HTTP/1.1
 
Host: sawano.members.icraft.jp
Connection: Keep-Alive


あら、これでも送れてるのね。
しかし釈然としない、WebClient クラスには QueryString とかいうプロパティがあるみたいので、それを使うのが普通っぽい。
 
 


WebClient.QueryString で


はて、QueryString を設定するにはどうしたらいいのかね。
連想配列で突っ込んでみたら、案の定怒られた。
[sourcecode language='sh']# 連想配列でクエリの内容を設定してみる
$query = @{dn = "hoge.example.jp";pw = "piyopiyo"}
$query

# .NetFramework の WebClient クラスを拝借
$webCli = New-Object System.Net.WebClient
$webCli.QueryString = $query[/sourcecode]
 

Name Value
---- -----
dn hoge.example.jp
pw piyopiyo
"QueryString" の設定中に例外が発生しました:
""System.Collections.Hashtable" を
"System.Collections.Specialized.NameValueCollection" に変換できません。"

 

ほう、左様か。NameValueCollection ってのを使えばいいの?
 

[sourcecode language='sh']# 引数格納、URL形式
param([string]$url)


# 途中で例外を吐いたらここに飛び、抜ける
trap [Exception] {
echo $error[0].exception
break
}

# NameValueCollection をマニュアル通り定義してみる
$query = New-Object System.Collections.Specialized.NameValueCollection

$query.add( "dn", "hoge.example.jp" )
$query.add( "pw", "piyopiyo" )


# .NetFramework の WebClient クラスを拝借
$webCli = New-Object System.Net.WebClient

# WebClient の QueryString プロパティを設定
$webCli.QueryString = $query

# コンテンツを取得
$body = $webCli.DownloadString($url)[/sourcecode]


で、実行とHTTPキャプチャ。
GET /index.html?dn=hoge.example.jp&pw=piyopiyo HTTP/1.1
 
Host: sawano.members.icraft.jp
Connection: Keep-Alive


できたようだ。
 
 
 

これでややこしそうなところは一通り準備がそろった。イベントログ書き出し・メールくらいは如何様にでもなろう。
 

終わりにしようかどうしようか。