Hyper-V ホストからVMにPowershellでネットワーク設定をしよう

ITインフラ系

通常Hyper-VでVMを作成すると予め設定されたDefault Switchなる仮想スイッチに繋げることができます。
Default Switchは自動的にIPを付与等してくれるので設定いらずでネットワークに接続できます。
しかし、Default Switchが使用できない時や、VMのIPを管理したいときはVMにネットワーク設定をする必要があります。

そこで今回はHyper-Vで作成したVMにPowershellでNIC作成・IP付与等のネットワーク設定を行ってみます。

Powershellでネットワーク設定

Powershellでネットワーク設定をするには僕が知ってるところで二つありますので、二つ紹介します。

invoke-commandでやる

稼働中のVMにNew-NetIPAddressコマンドをInvoke-commandで送信して設定するというものです。
ちなみにChatGPTに聞いたものを一部改良してそのままコピーしてます。

$VMName = "VMの名前"
#以下の設定は一例です
$NewIPAddress = "192.168.1.2"
$NewSubnet = 24
$NewDNS = "192.168.1.1"
$NewGateway = "192.168.1.1"
$NetworkAdapterName = "VM内のNICの名前(Hyper-Vマネージャーで表示されるNICの名前ではない)"  # ネットワークアダプタの名前を適切に設定します。
Invoke-Command -VMName $VMName -ScriptBlock {
param($IP, $Subnet, $DNS, $Gateway, $NetAdapter)
# インターフェイスの IP アドレスを設定します
New-NetIPAddress -InterfaceAlias $NetAdapter -IPAddress $IP -PrefixLength $Subnet -DefaultGateway $Gateway
# DNS サーバーを設定します
Set-DnsClientServerAddress -InterfaceAlias $NetAdapter -ServerAddresses $DNS
} -ArgumentList $NewIPAddress, $NewSubnet, $NewDNS, $NewGateway, $NetworkAdapterName

このpowershellを実行すると認証画面が出てくるのでアカウントとパスワードを入力します(Credを事前に設定すれば飛ばせますがChatGPTが書いたままなので割愛します)

検証


実行後このような感じで設定された感のあるログが流れてきたら成功です。

しかしこれは稼働中のVMにのみ使えるもので、停止中だと使えません。

wmiオブジェクトを使う

以下の記事を参考にして作成しました。
developers.gmo.jp

このページにあるSet-ContainerIPConfigによってHyper-VのVMに対してネットワーク設定ができるようになっております。
少し変えてVM用にします。

以下リンクよりスクリプトを改変しております。
https://github.com/InvokeV/InvokeV-Container

Function Set-VMIPConfig
([String]$VMName,
[String]$NIC,
[String]$IPAddress = @(),
[String]$Subnet = @(),
[String]$Gateway = @(),
[String]$DNS = @())
{
  $ManagementService = Get-WmiObject -Namespace root\virtualization\v2 -Class Msvm_VirtualSystemManagementService
  $ComputerSystem = Get-WmiObject -Namespace root\virtualization\v2 -Class Msvm_ComputerSystem -Filter "ElementName = '$VMName'"
  $SettingData = $ComputerSystem.GetRelated("Msvm_VirtualSystemSettingData")
  $NetworkAdapters = $SettingData.GetRelated('Msvm_SyntheticEthernetPortSettingData') | Where-Object { $_.ElementName -eq "$NIC" }
  $TargetNetworkAdapter = (Get-VMNetworkAdapter $VMName)[0]
  $NetworkSettings = @()
  ForEach ($NetworkAdapter in $NetworkAdapters) {
    If ($NetworkAdapter.Address -eq $TargetNetworkAdapter.MacAddress) {
$NetworkSettings = $NetworkSettings + $NetworkAdapter.GetRelated("Msvm_GuestNetworkAdapterConfiguration")
    }
  }
  $NetworkSettings[0].DHCPEnabled = $False
  $NetworkSettings[0].IPAddresses = $IPAddress
  $NetworkSettings[0].Subnets = $Subnet
  $NetworkSettings[0].DefaultGateways = $Gateway
  $NetworkSettings[0].DNSServers = $DNS
  $NetworkSettings[0].ProtocolIFType = 4096
$ManagementService.SetGuestNetworkAdapterConfiguration($ComputerSystem.Path, $NetworkSettings.GetText(1)) | Out-Null
}
$VMName = "VMの名前"
$NIC = "VMのNICの名前"
$IPAddress = "192.168.1.2"
$Subnet = "255.255.255.0"
$DNS = "192.168.1.1"
$Gateway = "192.168.1.1"
Set-VMIPConfig -VMName $VMName -NIC $NIC -IPAddress $IPaddress -Subnet $Subnet -Gateway $Gateway -DNS $DNS

お好みの設定を入れて実行してみてください。
サブネットは/24の形ではなく255….の形で書きます。

検証


未設定の状態からスクリプトを実行すると

こんな感じになります。成功してますね!
ちなみにVMが停止状態でも実行状態でもどちらでも設定できます。

まとめ

以上二つの形でネットワーク設定をやってみました。
VM作成からネットワーク設定までpowershellで自動設定ができそうです。
APIにしてあげてワンクリックでVMの作成からネットワークの設定まで出来たらかっこいいと思います
またそういう記事を書けたらなと思います。

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