ご飯

すっきりしたコードを書きたい

Powershell を使って、ネットワークを設定する (2)

前回の続きです。パラメータファイル def.ps1 を引用して、サーバのネットワークを設定するスクリプトを作成します。

その前に、設定に必要なコマンドレットを整理しておきます。

 

ホスト名とワークグループ名の変更

 

ホスト名の変更は、Win32_ComputerSystemクラスの WMIオブジェクトを取得し、rename メソッドを実行します。

$s = gwmi win32_computersystem
$s.rename($param.host_name)

 

ワークグループは、Add-Computer コマンドレットを使用します。

Add-Computer -WorkgroupName $param.domain

 

設定後に再起動が必要なので、変更されたかどうかを記憶しておきます。変更ありなら restart-computer コマンドレットを実行します。

$ch = $false
$s = gwmi win32_computersystem

if($s.name -ne $param.host_name) {
  $s.rename($param.host_name)
  $ch = $true
}

if($s.domain -ne $param.domain) {
  Add-Computer -WorkgroupName $param.domain
  $ch = $true
}

if($ch -eq $true) {
  restart-computer
}

NICのポート名を変更する

 

Rename-NetAdapter コマンドレットを使用します。

foreach($r in $param.nw.rename_ifs) {
  rename-netadapter @r
}

@r という記述は、ハッシュテーブルの要素をコマンドレットのパラメータとして展開してくれるのです。foreach で $r に代入される値は、たとえば次のようなものです。

@{Name = "Ethernet0"   ; NewName = "Eth1"}

rename-netadapter @r は、次のような文に展開してくれるのです。

rename-netadapter -Name "Ethernet0" -NewName "Eth1"

素敵だと思います。ご飯は率直に Powershell を好きになりました。

 

チーミングを設定する

 

チーミングは、New-NetLbfoTeam コマンドレット、スタンバイポートの設定は、Set-NetLbfoTeamMember コマンドレットを使用します。

$lbfo1 = $param.nw.lbfo1
$lbfo2 = $param.nw.lbfo2
New-NetLbfoTeam @lbfo1
Set-NetLbfoTeamMember @lbfo2

 

ここでも @lbfo1 という記述が見られます。こういうところは楽をしたいですね。チーミングのパラメータは、このようなぐじゃぐじゃしたものです。

lbfo1 = @{
  Name = $team_name
  TeamMembers  = ("Eth1","Eth5")
  TeamingMode  = "SwitchIndependent"
  LoadBalancingAlgorithm = "Dynamic"
  Confirm = $false
}

lbfo2 = @{
  Name = "Eth5"
  AdministrativeMode = "Standby"
}

ぐじゃぐじゃしたコマンドラインのパラメータを書くなど言語道断、ぜったいにお断りです。ご飯はわがままなのです。

なお、@param.nw.lbfo1 とすることができなかったので、いったんスカラー変数に代入してから @演算子が有効となります。

 

バインディングを設定する

バインディングとは、 ネットワークのプロパティの赤枠のチェックボックスをつけるところです。

f:id:uhoo:20181109032211p:plain

 

これを Powershell でコントロールするには、Set-NetAdapterBinding コマンドレットを使用します。

foreach($r in $param.nw.ifs) {
  foreach($x in $r.bindings) {
    set-netadapterbinding -Name $r.name @x
  }
}

 

IPv4プロパティを設定する

IPv4アドレスの追加

New-NetIPAddress コマンドレットを使います。

New-NetIPAddress -IfAlias $r.name @ip

 

DNSサーバの追加

Set-DnsClientServerAddress コマンドレットを使います。

$dns = $r.dns
Set-DnsClientServerAddress $r.name @dns

 

「この接続のアドレスをDNSに登録する」 のチェックを外す

次の画面がそれにあたります。

 f:id:uhoo:20181109060226p:plain

 

$cmd = "netsh int ip set dnsservers name=`"" + $r.name + "`" source=dhcp register=none"
invoke-expression $cmd

これだけコマンドレットがありませんでした。仕方ないので冗長な netsh を使います。💢💢💢

 

「LMHOSTSの参照を有効にする」 のチェックを外す 

次の画面がそれにあたります。

f:id:uhoo:20181109060104p:plain

 

$nicClass = Get-WmiObject -list Win32_NetworkAdapterConfiguration
$nicClass.enablewins($false,$false)

 

まとめると次のようになります。

foreach($r in $param.nw.ifs) {
  if($r.ip -ne $null) {

    $ip = $r.ip
    New-NetIPAddress -IfAlias $r.name @ip

    if($r.register -eq $false) {
      $cmd = "netsh int ip set dnsservers name=`"" + $r.name + "`" source=dhcp register=none"
      invoke-expression $cmd
    }

    if($r.dns -ne $null) {
      $dns = $r.dns
      Set-DnsClientServerAddress $r.name @dns
    }
  }
}

if($param.nw.enablewins -eq $false) {
  $nicClass = Get-WmiObject -list Win32_NetworkAdapterConfiguration
  $nicClass.enablewins($false,$false)
}

次回は、メニュー画面を作成し、メニュー項目の Enterキーが押されたら、設定を実行するように書き換えてみます。