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 とコマンドレットを実行してスクリプトの実行ポリシーを変更します。

image

スクリプトが完成すると、タスクスケジューラを使用して、定期的にスクリプトを実行するようにします。
タスクスケジューラは、Windows 7/Vista では、以前のものよりかなり細かく設定ができるようになりました。以下の図のように繰り返し間隔「15分間」、継続時間「無期限」に設定すると15分おきにタスクが起動されるようになります。画面で設定できる繰り返し間隔の最小は5分間なので、今回のスクリプトの起動にも簡単に対応できます。

image

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]) 
  }
}