Windows PowerShell スクリプトで、VALUE-DOMAIN のダイナミックDNSを更新するスクリプトを作成してみました。VALUE-DOMAIN のIPアドレス検出CGIは結構重いようなので、VALUE-DOMAINに迷惑をかけないように、外部IP アドレスを表示する PHP のプログラムも紹介しておきます。別に公開サーバーがあれば、外部IPアドレスの表示は簡単にできます。なお、VALUE-DOMAIN のDDNS の設定については、ダイナミック DNSの設定にメモをしています。
Windows PowerShell は v2 になって、下の図のように ISE(Integrated Scripting Environmentnt) がついてくるようになって、編集やデバッグも楽にできるようになっています。
始めてPowershell のスクリプトを使う場合は、TechNet の Hey, Scripting Guy が参考になります。なお、v2 では、既定ではスクリプトの実行ができません。Windows PowerShell を「管理者として実行」で起動して、Set-ExecutionPolicy RemoteSigned とコマンドレットを実行してスクリプトの実行ポリシーを変更します。
スクリプトが完成すると、タスクスケジューラを使用して、定期的にスクリプトを実行するようにします。
タスクスケジューラは、Windows 7/Vista では、以前のものよりかなり細かく設定ができるようになりました。以下の図のように繰り返し間隔「15分間」、継続時間「無期限」に設定すると15分おきにタスクが起動されるようになります。画面で設定できる繰り返し間隔の最小は5分間なので、今回のスクリプトの起動にも簡単に対応できます。
1 IPアドレスを表示するPHPプログラム
<?php
echo getenv("REMOTE_ADDR");
?>
2.VALUE-DOMAIN のダイナミックDNSを更新するスクリプトのサンプル
# ドメイン名
$DOMAIN = "example.com"
# パスワード
$PASS = "password"
# サブドメイン名 すべての場合は*
$HOSTNAME = "*"
# IP アドレスを取得するページのURL
$IP_URL = "http://mydomain.com/myipaddress.php"
# Value-Domain のDDNSサーバーの登録ページのURL
$DDNS_URL = "http://dyn.value-domain.com/cgi-bin/dyn.fcg?"
# ログファイルを保存するディレクトリ
$DATAPATH = "C:\Users\Admin\Documents\"
$IP_FILE = "wan_ip.txt"
$LOG = "log.txt"
# ログの出力
function write_log($message)
{
$now = Get-Date;
Add-Content ($DATAPATH + $LOG) ($now.ToString("yyyy/MM/dd HH:mm:ss") + " " + $message)
}
# 記録しているIPアドレスの取得
if (Test-Path ($DATAPATH + $IP_FILE))
{
$old_ip = Get-Content ($DATAPATH + $IP_FILE)
}
else
{
$old_ip = "0.0.0.0"
}
echo $old_ip
# IPアドレスの取得
$wc = New-Object System.Net.WebClient
try
{
$new_ip = $wc.DownloadString($IP_URL)
$wc.Close;
}
catch
{
write_log("11:IPアドレスが取得できません。")
try
{
$new_ip = $wc.DownloadString($DDNS_URL + "ip")
$wc.Close;
}
catch
{
write_log("12:IPアドレスが取得できません。")
echo "12:IPアドレスが取得できません。"
return;
}
}
echo $new_ip
if ($old_ip -eq $new_ip)
{
write_log("00:IPアドレスの変更がありません")
echo "00:IPアドレスの変更がありません"
}
else
{
# アドレスが変更されている場合にVALUE-DOMAINのDDNSサーバーの更新
$wc = New-Object System.Net.WebClient
try
{
$status = $wc.DownloadString($DDNS_URL + "d=" + $DOMAIN + "&p=" + $PASS + "&h=" + $HOSTNAME)
echo $status
}
catch
{
write_log("12:データベースサーバーに接続できません。")
}
$st = $status.Split("`n")
if ($st[0] -eq "status=0")
{
Set-Content ($DATAPATH + $IP_FILE) $new_ip
write_log("0:OK IP:" + $new_ip)
}
else
{
write_log($st[0] + ":" + $st[1])
}
}