PowerShellの使い方(OS設定編)

#0. はじめに
前回予告したとおり、サーバOSの初期設定時に使いそうなコマンドレットについてまとめます。一部Windowsのコマンドを使用します。

#1. タイムゾーンの設定
いきなりコマンドレットではありません。タイムゾーンを設定するためのユーティリティが用意されているため、こちらを利用して設定をします。

http://msdn.microsoft.com/ja-jp/library/hh825053.aspx

```ps1:tzutil
# 現在のタイムゾーン設定を取得
PS> tzutil /g
Tokyo Standard Time

# タイムゾーンとして設定できる値の一覧を取得
PS> tzutil /l
(UTC-12:00) 国際日付変更線 西側
Dateline Standard Time

(UTC-11:00) 協定世界時-11
UTC-11

(UTC-10:00) ハワイ
Hawaiian Standard Time

...(以下略)

# タイムゾーンを設定する(東京)
PS> tzutil /s "Tokyo Standard Time"
```

#2. Windows ファイアーウォール

|コマンドレット | 説明 | TechNet | 
|:-------------|:-----|:--------|
|Get-NetFirewallProfile  |ファイアーウォールの設定を取得 |[Link](http://technet.microsoft.com/ja-jp/library/jj573830.aspx) | 
|Set-NetFirewallProfile  |ファイアーウォールの設定を変更 |[Link](http://technet.microsoft.com/ja-jp/library/jj554896.aspx) | 

```ps1:Get-NetFirewallProfile,Set-NetFirewallProfile
PS> Get-NetFirewallProfile

Name                            : Domain
Enabled                         : True
...(以下略)

# Windows ファイアーウォールを無効化する
PS> Get-NetFirewallProfile | Set-NetFirewallProfile -Enabled False

```

#3. プロキシ設定
こちらもWindowsのコマンド(netsh)を使います。あとから説明するWindows Updateをプロキシかある環境で実行するために必要になります。netshコマンドはプロキシ設定以外にもネットワーク周りの設定を色々できます。

netsh
http://msdn.microsoft.com/ja-jp/library/cc778925%28v=ws.10%29.aspx

netsh winhttp
http://technet.microsoft.com/ja-jp/library/cc731131%28v=ws.10%29.aspx

```ps1:netsh
# プロキシ設定の表示
PS> netsh winhttp show proxy

現在の WinHTTP プロキシ設定:

    直接アクセス (プロキシ サーバーなし)。

# プロキシの設定
PS> netsh winhttp set proxy proxy-server="192.168.1.1:8080"

現在の WinHTTP プロキシ設定:

    プロキシ サーバー:  192.168.1.1:8080
    バイパス一覧     : (なし)

# プロキシ設定のリセット
PS> netsh winhttp reset proxy

現在の WinHTTP プロキシ設定:

    直接アクセス (プロキシ サーバーなし)。

```

#4. Windows Update
コマンドレットやコマンドは用意されていないので、下記のモジュールを追加します。

Windows Update PowerShell Module
https://gallery.technet.microsoft.com/scriptcenter/2d191bcd-3308-4edd-9de2-88dff796b0bc

zipファイルをダウンロードし、展開してできたフォルダ(PSWindowsUpdate)を%WINDIR%\System32\WindowsPowerShell\v1.0\Modulesに移動させます。
その後、powershell上でモジュールをインポートすることで使用できるようになります。

```ps:WindowUpdatePowershellModule
PS> Import-Module PSWindowsUpdate
PS> Get-Command -Module PSWindowsUpdate

CommandType     Name                                               ModuleName
-----------     ----                                               ----------
Function        Add-WUOfflineSync                                  PSWindowsUpdate
Function        Add-WUServiceManager                               PSWindowsUpdate
Function        Get-WUHistory                                      PSWindowsUpdate
Function        Get-WUInstall                                      PSWindowsUpdate
Function        Get-WUInstallerStatus                              PSWindowsUpdate
Function        Get-WUList                                         PSWindowsUpdate
Function        Get-WURebootStatus                                 PSWindowsUpdate
Function        Get-WUServiceManager                               PSWindowsUpdate
Function        Get-WUUninstall                                    PSWindowsUpdate
Function        Hide-WUUpdate                                      PSWindowsUpdate
Function        Invoke-WUInstall                                   PSWindowsUpdate
Function        Remove-WUOfflineSync                               PSWindowsUpdate
Function        Remove-WUServiceManager                            PSWindowsUpdate
Function        Update-WUModule                                    PSWindowsUpdate
```

それぞれのコマンドレットの詳細については、Get-Helpコマンドレットを用いて確認して下さい。
以下では実際にWindows Updateを実行するために使用するコマンドレットについて説明します。

## Get-WUInstall

色々なオプションが用意されていますが、特に重要そうだと思ったものをリストアップしておきます。

|オプション | 説明 |
|:-------------|:-----|
|-Category | 指定されたタイプのアップデートのみインストール対象とする<br>('Updates', 'Security Updates', 'Critical Updates'など) | 
|-NotCategory | 指定されたタイプ以外のアップデートのみインストール対象とする<br>('Updates', 'Security Updates', 'Critical Updates'など)　|  
|-Title | タイトルに指定した文字列が**含まれている**アップデートのみインストール対象とする |
|-NotTitle | タイトルに指定した文字列が**含まれていない**アップデートのみインストール対象とする | 
|-KBArticleID | 指定したKBArticleIDのアップデートのみインストール対象とする |
|-NotKBArticleID | 指定したKBArticleID以外のアップデートのみインストール対象とする | 
|-AcceptAll | アップデートをすべて受け入れる |
|-AutoReboot | アップデート後に自動的に再起動する |

Get-WUInstallコマンドレットではアップデートそれぞれに対してインストールするかどうか選択ポップアップが上がってきます。自動化時には対話式は利用したくないため、それをすべて受け入れるために-AcceptAllオプションを利用できます。

実際にWindows Updateを実行するためには以下のようにコマンドレットを実行します。

```ps1:WindowsUpdate
PS> Import-Module PSWindowsUpdate
PS> Get-WUInstall -AcceptAll -AutoReboot

```

#5. IE ESCの無効化
こちらもコマンドレットもコマンドも用意されていないため、レジストリを直接変更しIEプロセスの停止を行って設定を反映させています。

```ps1:IEESCの無効化
PS> $AdminKey = "HKLM:\SOFTWARE\Microsoft\Active Setup\Installed Components\{A509B1A7-37EF-4b3f-8CFC-4F3A74704073}"
PS> $UserKey = "HKLM:\SOFTWARE\Microsoft\Active Setup\Installed Components\{A509B1A8-37EF-4b3f-8CFC-4F3A74704073}"
PS> Set-ItemProperty -Path $AdminKey -Name "IsInstalled" -Value 0
PS> Set-ItemProperty -Path $UserKey -Name "IsInstalled" -Value 0
PS> Stop-Process -Name Explorer
```

#6. IPの固定化
ADなど一部のサービスではDHCPではなくIPを固定化して利用することが推奨されています。そうでなくてもサーバとして運用する場合はIPを固定化して運用するのが普通です。
この章ではそのためのコマンドレットを記載します。このコマンドレットはPowershell v3.0で追加されたものなので、Windows Server 2012以降が対象となります。

|コマンドレット | 説明 | TechNet | 
|:-------------|:-----|:--------|
|New-NetIPAddress  |IPアドレスの設定を新規に作成する |[Link](http://technet.microsoft.com/ja-jp/library/hh826150.aspx) | 

|オプション | 説明 |
|:-------------|:-----|
|-AddressFamily | IPアドレスのタイプを指定する。"IPv4" or "IPv6" | 
|-DefaultGateway | デフォルトゲートウェイを指定する。| 
|-InterfaceAlias | インターフェースのエイリアス名を指定する。<br>Get-NetIPAddressコマンドレットなどで確認できる。-InterfaceIndexと択一 | 
|-InterfaceIndex | インターフェイスのインデックスを指定する。<br>Get-NetIPAddressコマンドレットなどで確認できる。-InterfaceAliasと択一| 
|-IPAddress | IPアドレスを指定する。|
|-PrefixLength | サブネットマスクの長さ(bit数)を指定する。|

```ps1:New-NetIPAddress
New-NetIPAddress -InterfaceAlias "イーサネット" -IPAddress "192.168.1.50" -PrefixLength 24 -AddressFamily "IPv4" -DefaultGateway "192.168.1.1"
```

新規のIPアドレスで固定する場合は上記で問題ありませんが、すでにDHCPで配布されているIPで固定したいといった場合、上記のコマンドではエラーとなります。普通はこのようなことはないと思いますが、AWSやAzureといったクラウド環境でIPを固定化しようとした場合にこの問題が発生することがあります。その場合はIPが設定されている既存の削除して上記のコマンドを実行する必要があります。

既存の設定を削除するコマンドレットは以下になります。

|コマンドレット | 説明 | TechNet | 
|:-------------|:-----|:--------|
|Remove-NetIPAddress  |IPアドレスの設定を削除する |[Link](http://technet.microsoft.com/ja-jp/library/hh826145.aspx) | 

|オプション | 説明 |
|:-------------|:-----|
|-AddressFamily | IPアドレスのタイプを指定する。"IPv4" or "IPv6" | 
|-IPAddress | IPアドレスを指定する|
|-Confirm | コマンドレット実行前にプロンプトで確認するかどうか|

Remove-NetIPAddressコマンドレットはデフォルトでは実行前に本当に削除してよいかプロンプトが上がってきます。それを無効化するために-Confirmオプションを利用します。

```ps1:Remove-NetIPAddress
# 既存の設定を削除
Remove-NetIPAddress -IPAddress "192.168.1.50" -AddressFamily "IPv4" -Confirm:$false
# 同じIPで新規作成し、IPを固定化
New-NetIPAddress -InterfaceAlias "イーサネット" -IPAddress "192.168.1.50" -PrefixLength 24 -AddressFamily "IPv4" -DefaultGateway "192.168.1.1"
``` 
<font color="#ff0000">※ 一旦設定を削除して新規に作成するため、実行に失敗するとネットワーク経由で接続できなくなります。別経路の用意など対策をしてから利用してください。</font>



#7. DNS設定
このコマンドレットもPowershell v3.0で追加されたものなので、Windows Server 2012以降が対象となります。

|コマンドレット | 説明 | TechNet | 
|:-------------|:-----|:--------|
|Set-DnsClientServerAddress  |DNSサーバの設定をする |[Link](http://technet.microsoft.com/en-us/library/jj590768.aspx) | 

|オプション | 説明 |
|:-------------|:-----|
|-InterfaceAlias | インターフェースのエイリアス名を指定する。<br>Get-NetIPAddressコマンドレットなどで確認できる。-InterfaceIndexと択一 | 
|-InterfaceIndex | インターフェイスのインデックスを指定する。<br>Get-NetIPAddressコマンドレットなどで確認できる。-InterfaceAliasと択一| 
|-ServerAddresses　| DNSサーバのIPアドレスを指定する。カンマ区切りで2つまで指定可能　|  

```ps1:Set-DnsClientServerAddress
PS> Set-DnsClientServerAddress -InterfaceAlias "イーサネット" -ServerAddresses "192.168.1.1"
```

#8. おまけ
IPやDNSの設定のところで唐突にでてきているインターフェイスエリアス名やインターフェイスインデックスの調べ方について少し記載しておきます。

インターフェイスのリストを取得するだけならば、Get-NetIPInterfaceコマンドレットで可能です。このコマンドレットもPowershell v3.0で追加されたものなので、Windows Server 2012以降が対象となります。

|コマンドレット | 説明 | TechNet | 
|:-------------|:-----|:--------|
|Get-NetIPInterface  |ネットワークインターフェイスの一覧を表示する |[Link](http://technet.microsoft.com/ja-jp/library/hh826135.aspx) | 

このコマンドの実行結果には関連情報が殆ど表示されないため、対象とするインターフェイスが判別しにくいという問題がありますが、これらの情報で判別が付く場合にはエイリアス名とインデックスが同時に取得でき、また余計な情報が表示されないためインターフェイス数が多くても見やすいです。

```ps1:Get-NetIPInterface
ifIndex InterfaceAlias                  AddressFamily NlMtu(Bytes) InterfaceMetric Dhcp     ConnectionState PolicyStore
------- --------------                  ------------- ------------ --------------- ----     --------------- -----------
4       Wi-Fi                           IPv4                  1500              25 Enabled  Connected       ActiveStore
1       Loopback Pseudo-Interface 1     IPv4            4294967295              50 Disabled Connected       ActiveStore
3       イーサネット                    IPv4                  1500              20 Enabled  Disconnected    ActiveStore
```

インデックスが１列目、エイリアス名が２列目に表示されます。

## インターフェイスエイリアス名
その名の通りインターフェイスに付けられたエイリアス名です。
下記で表示されている名前がインターフェイスエリアス名です。

「コントロールパネル」→「ネットワークとインターネット」→「ネットワークの状態とタスクの表示」→「アダプター設定の変更」

このエリアス名は「ipconfig」コマンドなどで表示されるときにも用いられています。

```ps1:ipconfig
PS> ipconfig

Wireless LAN adapter Wi-Fi:

   接続固有の DNS サフィックス . . . . .:
   IPv4 アドレス . . . . . . . . . . . .: 192.168.x.x
   サブネット マスク . . . . . . . . . .: 255.255.255.0
   デフォルト ゲートウェイ . . . . . . .: 192.168.x.x
                                          

イーサネット アダプター イーサネット:

   メディアの状態. . . . . . . . . . . .: メディアは接続されていません
   接続固有の DNS サフィックス . . . . .:
```

無線の場合は「Wireless LAN adapter」のあとにインターフェイスエリアス名が続き、有線の場合は「イーサネット アダプター」のあとにインターフェイスエリアス名が続くようです。上記の場合は、無線のインターフェイスエリアス名が「Wi-Fi」、有線のインターフェイスエリアス名が「イーサネット」となります。

##インターフェイスインデックス
インターフェイスを一意に認識するためのインデックス番号です。Get-NetIPAddressコマンドレットを用いることで取得できます。このコマンドレットもPowershell v3.0で追加されたものなので、Windows Server 2012以降が対象となります。

|コマンドレット | 説明 | TechNet | 
|:-------------|:-----|:--------|
|Get-NetIPAddress  |ネットワークインターフェイスに割り当てられているIP情報を表示する |[Link](http://technet.microsoft.com/ja-jp/library/hh826136.aspx) |
 
```ps1:Get-NetIPAddress
PS> Get-NetIPAddress

IPAddress         : 192.168.x.x
InterfaceIndex    : 4
InterfaceAlias    : Wi-Fi
AddressFamily     : IPv4
Type              : Unicast
PrefixLength      : 24
PrefixOrigin      : Dhcp
SuffixOrigin      : Dhcp
AddressState      : Preferred
ValidLifetime     : 00:39:36
PreferredLifetime : 00:39:36
SkipAsSource      : False
PolicyStore       : ActiveStore

...(以下略)
```

上記の場合はインデックスは「4」です。Get-NetIPAddressコマンドレットを用いることでエイリアス名も取得できます。

#99. おわりに
個人的にやりたかったことはとりあえず出来るようになったので、一旦PowerShellの話題は今回で終了にします。次回は今のところ全くの未定ですが、Ansible触りたいなぁと思っている今日このごろ。