PowerShellを使用してシステムのIPアドレスを静的に設定する方法という問いには、現地復旧手段を用意し、割当台帳で空きを確認してからIPとDNSを同じ一NICへWhatIf後に設定するという方法で答えます。New-NetIPAddressで既定ゲートウェイを含む静的アドレスを設定すると、対象インターフェイスのDHCPが無効になる場合がある。リモート作業では接続を失う危険が高い。この記事ではInterfaceIndex、旧Dhcp状態、IPAddress、PrefixLength、DefaultGateway、DNS ServerAddressesを一セットにするを判断軸にし、実行前の確認、記事固有のコード、合否判定、戻し方を一続きで示します。
プロファイルPublic/Privateの変更ではなく、L3アドレス、ゲートウェイ、DNSを設定する。完了は「期待IP、プレフィックス、ゲートウェイ、DNSが再取得でき、重複警告なくゲートウェイ・名前解決・業務先へ到達する」と定義します。対象が取れない場合は「対象NICやゲートウェイが見つからない場合は実行せず、VLAN、Alias、リンク状態、割当台帳を確認する」として切り分け、推測で成功扱いにしません。
現地コンソールと空きアドレスを確保
現地復旧手段を用意し、割当台帳で空きを確認してからIPとDNSを同じ一NICへWhatIf後に設定する。静的IPv4アドレスとDNSの設定ではこの進め方により、操作したという事実ではなく、期待する状態へ到達したかでタイトルの問いへ答えられます。プロファイルPublic/Privateの変更ではなく、L3アドレス、ゲートウェイ、DNSを設定する。
現地コンソールと空きアドレスを確保の合格条件は、期待IP、プレフィックス、ゲートウェイ、DNSが再取得でき、重複警告なくゲートウェイ・名前解決・業務先へ到達することです。作業時刻、実行ユーザー、端末名を添え、判断に使った値が後から追える形にします。
現在のDHCP・IP・DNSを保存
現在のDHCP・IP・DNSを保存では、静的IPv4アドレスとDNSの設定の対象を「InterfaceIndex、旧Dhcp状態、IPAddress、PrefixLength、DefaultGateway、DNS ServerAddressesを一セットにする」という単位で扱います。New-NetIPAddressで既定ゲートウェイを含む静的アドレスを設定すると、対象インターフェイスのDHCPが無効になる場合がある。リモート作業では接続を失う危険が高い。対象が複数なら表示名の部分一致で先頭を採らず、一意になる条件を追加します。
静的IPv4アドレスとDNSの設定を始める前に、PowerShellの版、コマンドの提供元、必要権限、管理ポリシーの有無を確認します。権限不足と対象なしは意味が異なるため、例外を0件へ置き換えません。
InterfaceAliasを一意に確認
InterfaceAliasを一意に確認は変更前の基準点です。InterfaceIndex、旧Dhcp状態、IPAddress、PrefixLength、DefaultGateway、DNS ServerAddressesを一セットにするを出力に含め、取得時刻と一緒に保存します。値だけを切り取ると別対象との比較になるため、識別列を省きません。
$interfaceAlias = 'Ethernet'
$adapters = @(Get-NetAdapter -Name $interfaceAlias -ErrorAction Stop)
if ($adapters.Count -ne 1 -or [string]$adapters[0].Status -ne 'Up') { throw 'Up状態の対象NICを一意にできません。' }
$adapter = $adapters[0]
$interfaceIndex = [uint32]$adapter.IfIndex
function Get-IttripIpv4State([uint32]$Index) {
$errors = [Collections.Generic.List[string]]::new()
$ipInterface=$null; $addresses=@(); $dns=$null; $routes=@()
try { $ipInterface=Get-NetIPInterface -InterfaceIndex $Index -AddressFamily IPv4 -ErrorAction Stop } catch { $errors.Add("dhcp:$($_.Exception.Message)") }
try { $addresses=@(Get-NetIPAddress -InterfaceIndex $Index -AddressFamily IPv4 -ErrorAction Stop) } catch { $errors.Add("address:$($_.Exception.Message)") }
try { $dns=Get-DnsClientServerAddress -InterfaceIndex $Index -AddressFamily IPv4 -ErrorAction Stop } catch { $errors.Add("dns:$($_.Exception.Message)") }
try { $routes=@(Get-NetRoute -InterfaceIndex $Index -DestinationPrefix '0.0.0.0/0' -ErrorAction Stop) } catch { $errors.Add("route:$($_.Exception.Message)") }
[pscustomobject]@{
InterfaceIndex=$Index; Dhcp=if($ipInterface){[string]$ipInterface.Dhcp}else{'<read-error>'}
AddressKeys=@($addresses | ForEach-Object { "$($_.IPAddress)|$($_.PrefixLength)|$($_.PrefixOrigin)|$($_.SuffixOrigin)" } | Sort-Object)
DnsKeys=if($dns){@($dns.ServerAddresses | ForEach-Object {[string]$_} | Sort-Object)}else{@()}
GatewayKeys=@($routes.NextHop | ForEach-Object {[string]$_} | Sort-Object)
ReadErrors=@($errors)
}
}
$beforeState = Get-IttripIpv4State -Index $interfaceIndex
if ($beforeState.Dhcp -ne 'Enabled') { throw 'この例は開始前がDHCP EnabledのNICだけを対象にします。既存static構成は変更しません。' }
if ($beforeState.ReadErrors.Count -gt 0) { throw "baseline読取エラー: $($beforeState.ReadErrors -join '|')" }
[pscustomobject]@{ InterfaceIndex=$interfaceIndex; InterfaceGuid=$adapter.InterfaceGuid; MacAddress=$adapter.MacAddress; Alias=$adapter.Name; State=$beforeState }
New-NetIPAddressで既定ゲートウェイを含む静的アドレスを設定すると、対象インターフェイスのDHCPが無効になる場合がある。リモート作業では接続を失う危険が高い。出力が多い場合も最初から無理に一件へ絞らず、候補数と除外理由を残してから対象を決めます。
New-NetIPAddressをWhatIfで点検
New-NetIPAddressをWhatIfで点検では、現地復旧手段を用意し、割当台帳で空きを確認してからIPとDNSを同じ一NICへWhatIf後に設定する。静的IPv4アドレスとDNSの設定の例中にある名前、パス、ID、時刻はサンプルなので、そのまま本番へ貼らず、直前の読み取り結果から承認値を入れます。
$newIp = '192.0.2.20'; $prefixLength = 24; $newGateway = '192.0.2.1'; $newDns = @('192.0.2.53')
$businessFqdn = 'app.contoso.example'; $businessPort = 443
if ($businessFqdn -like '*.example') { throw '業務FQDNを実値へ置き換えてください。' }
if ($newIp -like '192.0.2.*' -or $newGateway -like '192.0.2.*' -or @($newDns | Where-Object { $_ -like '192.0.2.*' }).Count -gt 0) {
throw '192.0.2.0/24は文書用です。IPAMで承認された実値へ置き換えてください。'
}
if (Test-Connection -ComputerName $newIp -Count 1 -Quiet -ErrorAction SilentlyContinue) { throw '候補IPから応答があります。重複調査が終わるまで中止します。' }
$approvalToken = "OPEN-IPV4-GUI $interfaceIndex $newIp/$prefixLength GW=$newGateway DNS=$($newDns -join ',')"
if ((Read-Host "WindowsのIPv4設定画面を開く前に $approvalToken を入力") -ne $approvalToken) { throw '中止しました。' }
$adapterRebind = @(Get-NetAdapter -InterfaceIndex $interfaceIndex -ErrorAction Stop)
$stateRebind = Get-IttripIpv4State -Index $interfaceIndex
if ($adapterRebind.Count -ne 1 -or $adapterRebind[0].InterfaceGuid -ne $adapter.InterfaceGuid -or
$adapterRebind[0].MacAddress -ne $adapter.MacAddress -or $adapterRebind[0].Name -ne $adapter.Name -or
(ConvertTo-Json $stateRebind -Depth 6 -Compress) -ne (ConvertTo-Json $beforeState -Depth 6 -Compress)) {
throw '直前のNIC identityまたはDHCP/address/DNS/route baselineが変わりました。'
}
[pscustomobject]@{ ExecuteAutomatically=$false; IPAddress=$newIp; PrefixLength=$prefixLength; Gateway=$newGateway; Dns=$newDns }
Write-Host 'Windowsのネットワーク アダプターのIPv4プロパティで、承認値を1回だけ手動入力します。遠隔接続中は実施せず、ローカルコンソールと復元手順を確保してください。'
例の192.0.2.0/24は文書用で本番に使わない。リモート接続中、アドレス競合、管理外DNSなら中止する。静的IPv4アドレスとDNSの設定でプレビュー対応コマンドを使える場合はWhatIfを先に実行し、非対応の操作は対象一覧と引数を画面へ出して人が承認してから一度だけ実行します。
DNSサーバーを同じNICへ設定
DNSサーバーを同じNICへ設定では同じ対象を別経路でもう一度読みます。判定したいのは「コマンドが終了したか」ではなく、期待IP、プレフィックス、ゲートウェイ、DNSが再取得でき、重複警告なくゲートウェイ・名前解決・業務先へ到達するかどうかです。
$verificationMode='Apply' # Apply または Recovery
if($verificationMode -notin @('Apply','Recovery')){throw 'verification modeが不正です。'}
if($verificationMode -eq 'Recovery'){Write-Host '開始前はDHCP Enabledに限定済みです。WindowsのIPv4プロパティでIPとDNSを自動取得へ戻し、1回確定します。'}
Read-Host '手動変更または手動復元後、Enterで期待状態を最大10回再読します'
$errors=[Collections.Generic.List[string]]::new();$observations=[Collections.Generic.List[object]]::new();$matched=$false
for($attempt=1;$attempt -le 10;$attempt++){
$adapterNow=@(Get-NetAdapter -InterfaceIndex $interfaceIndex -ErrorAction Stop)
if($adapterNow.Count -ne 1 -or $adapterNow[0].InterfaceGuid -ne $adapter.InterfaceGuid -or $adapterNow[0].MacAddress -ne $adapter.MacAddress -or $adapterNow[0].Name -ne $adapter.Name){throw 'NIC identity mismatchはterminalです。別NICの状態を成功にしません。'}
$stateNow=Get-IttripIpv4State -Index $interfaceIndex
foreach($e in $stateNow.ReadErrors){$errors.Add("attempt=$attempt $e")}
if($stateNow.ReadErrors.Count){$observations.Add([pscustomobject]@{Attempt=$attempt;Mode=$verificationMode;Matched=$false;State=$stateNow});Start-Sleep -Seconds 3;continue}
if($verificationMode -eq 'Recovery'){
$matched=(ConvertTo-Json $stateNow -Depth 6 -Compress) -eq (ConvertTo-Json $beforeState -Depth 6 -Compress)
$observations.Add([pscustomobject]@{Attempt=$attempt;Mode=$verificationMode;Matched=$matched;State=$stateNow})
}else{
$parsedAddresses=@($stateNow.AddressKeys|ForEach-Object{$p=$_ -split '\|';[pscustomobject]@{IP=$p[0];Prefix=[int]$p[1];PrefixOrigin=$p[2]}})
$targetRows=@($parsedAddresses|Where-Object{$_.IP -eq $newIp -and $_.Prefix -eq $prefixLength})
$unexpectedRoutable=@($parsedAddresses|Where-Object{$_.IP -ne $newIp -and $_.IP -notlike '169.254.*'})
$stateExact=$stateNow.Dhcp -eq 'Disabled' -and $targetRows.Count -eq 1 -and $unexpectedRoutable.Count -eq 0 -and
($stateNow.DnsKeys-join '|') -eq (@($newDns|Sort-Object)-join '|') -and ($stateNow.GatewayKeys-join '|') -eq $newGateway
$gatewayOk=$false;$dnsOk=$false;$businessOk=$false;$probeAlias=$null;$sourceAddress=$null
if($stateExact){
try{$gatewayOk=Test-Connection -ComputerName $newGateway -Count 1 -Quiet -ErrorAction Stop}catch{$errors.Add("attempt=$attempt gateway:$($_.Exception.Message)")}
try{$dnsOk=@(Resolve-DnsName -Name $businessFqdn -Server $newDns[0] -ErrorAction Stop|Where-Object IPAddress).Count -gt 0}catch{$errors.Add("attempt=$attempt dns-probe:$($_.Exception.Message)")}
try{$businessProbe=Test-NetConnection -ComputerName $businessFqdn -Port $businessPort -InformationLevel Detailed -WarningAction SilentlyContinue;$probeAlias=$businessProbe.InterfaceAlias;$sourceAddress=[string]$businessProbe.SourceAddress;$businessOk=$businessProbe.TcpTestSucceeded -and $probeAlias -eq $adapter.Name -and $sourceAddress -eq $newIp}catch{$errors.Add("attempt=$attempt business:$($_.Exception.Message)")}
}
$matched=$stateExact -and $gatewayOk -and $dnsOk -and $businessOk
$observations.Add([pscustomobject]@{Attempt=$attempt;Mode=$verificationMode;Matched=$matched;StateExact=$stateExact;GatewayReachable=$gatewayOk;DnsResolved=$dnsOk;BusinessTcp=$businessOk;ProbeAlias=$probeAlias;SourceAddress=$sourceAddress;State=$stateNow})
}
if($matched){break};Start-Sleep -Seconds 3
}
$observations|Select-Object -Last 1
if(-not $matched){
if($verificationMode -eq 'Apply'){Write-Warning '固定IP/prefix/gateway/DNS/疎通の合格条件が未達です。開始前DHCP baselineへWindows GUIで手動復元し、このブロックをRecovery modeで再実行します。'}
throw "bounded verificationで期待状態に一致しません: $($errors -join '|')"
}
[pscustomobject]@{Mode=$verificationMode;Completion=if($verificationMode-eq'Apply'){'ExactStaticAndConnectivityVerified'}else{'ExactDhcpBaselineRestored'};Attempt=$observations[-1].Attempt;Exact=$true}
対象NICやゲートウェイが見つからない場合は実行せず、VLAN、Alias、リンク状態、割当台帳を確認する。静的IPv4アドレスとDNSの設定の期待値と実測値が一致しないときは追加変更を重ねず、対象識別、権限、ポリシー、時間差の順で原因を分けます。
ゲートウェイ・DNS・業務先を検証
例の192.0.2.0/24は文書用で本番に使わない。リモート接続中、アドレス競合、管理外DNSなら中止する。ゲートウェイ・DNS・業務先を検証に該当したら、警告を消して継続するのではなく、どの条件で止まったかを記録します。
対象NICやゲートウェイが見つからない場合は実行せず、VLAN、Alias、リンク状態、割当台帳を確認する。静的IPv4アドレスとDNSの設定ではエラー本文、FullyQualifiedErrorId、対象ID、直前に成功した段階を残すと、別担当者が安全な地点から調査できます。
競合や疎通断で直ちに中止
IPAMまたは割当台帳、変更窓、現地連絡先、復旧コマンドを作業前にそろえる。静的IPv4アドレスとDNSの設定を繰り返す場合は、正常、対象なし、要承認、失敗を異なる終了状態として記録し、前回値との比較だけで異常を決めません。
| 競合や疎通断で直ちに中止の識別軸 | InterfaceIndex、旧Dhcp状態、IPAddress、PrefixLength、DefaultGateway、DNS ServerAddressesを一セットにする |
| 採用する実測 | 期待IP、プレフィックス、ゲートウェイ、DNSが再取得でき、重複警告なくゲートウェイ・名前解決・業務先へ到達する |
| 0件時の扱い | 対象NICやゲートウェイが見つからない場合は実行せず、VLAN、Alias、リンク状態、割当台帳を確認する |
| 保留にする兆候 | 例の192.0.2.0/24は文書用で本番に使わない。リモート接続中、アドレス競合、管理外DNSなら中止する |
静的IPv4アドレスとDNSの設定の実行記録には、開始前の対象候補、採用した識別値、実行したコード、終了後の実測、除外した候補と理由を同じ作業番号で残します。特に「InterfaceIndex、旧Dhcp状態、IPAddress、PrefixLength、DefaultGateway、DNS ServerAddressesを一セットにする」を省くと、後日の再確認で別対象の値を比較するおそれがあります。画面コピーだけでなく、日時と端末名を含む構造化した出力も保存します。
PowerShellを使用してシステムのIPアドレスを静的に設定する方法を定期手順へ組み込む場合も、初回は対話的に候補を確認します。正常時は「期待IP、プレフィックス、ゲートウェイ、DNSが再取得でき、重複警告なくゲートウェイ・名前解決・業務先へ到達する」、判定不能時は「対象NICやゲートウェイが見つからない場合は実行せず、VLAN、Alias、リンク状態、割当台帳を確認する」、中止時は「例の192.0.2.0/24は文書用で本番に使わない。リモート接続中、アドレス競合、管理外DNSなら中止する」をそれぞれ別の結果として扱います。これにより、0件や例外を都合よく成功へ丸めず、次の担当者が同じ対象と条件で追試できます。
修正後コードの合格条件:例はDHCPから一つの承認済み固定IPへ移す端末に限定し、ローカルコンソールとIPAM承認を前提にします。サンプル用192.0.2.0/24はコードで拒否し、IP・DNS適用後に既定経路、指定DNS応答、業務TCPの全てが通らなければ新規IPを除去してDHCP/DNS自動へ戻します。
再修正後は一次失敗と復旧失敗を分けます。新IP除去、DHCP有効化、DNSリセット、renewをすべてchecked実行し、変更前のDHCP、IPv4、DNS、既定gatewayへ戻るまで有限回だけ再照合します。
安全版 r4b-20260719:固定IPの自動適用・自動復元を廃止しました。NIC identityとDHCP/address/DNS/routeを保存し、WindowsのIPv4画面で手動変更・手動復元します。復元時のエラーを収集してもbounded rereadを継続します。
独立監査追補 r4b-r5-20260719:開始前をDHCP Enabledへ限定します。Applyはstatic IP/prefix/gateway/DNSとgateway・DNS・業務TCPを、Recoveryは開始前baseline完全一致を待ちます。NIC identity不一致は即時terminalです。
公式情報・参考資料
静的IPv4アドレスとDNSの設定で使うコマンド名、引数、対応環境は次のMicrosoft一次資料で確認しました。記事の確認日は2026年7月17日です。OSやモジュール更新後は、実行端末のGet-Helpと併せて再確認してください。

コメント