ラベル PowerShell の投稿を表示しています。 すべての投稿を表示
ラベル PowerShell の投稿を表示しています。 すべての投稿を表示
2024年7月26日金曜日

Windows Serverの設定情報を一括取得するスクリプト

先日、Linuxの設定情報を1つのテキストファイルに出力するスクリプトを作成した。

Linuxに引き続き、今回はWindows Serverの設定情報を1つのテキストファイルに出力し、一括取得するスクリプトを作ってみた。このスクリプトを使うことで、Windows Serverの設定に関しても、ネットワーク機器のように設定変更時の差分をdiffツールにて比較をできるようにする。

環境

本スクリプトの動作確認をしたOSは以下の通り。

  • OS : Windows Server 2022 または 2019
  • 実行シェル : PowerShell 5.1

Windows Server設定項目一覧

本スクリプトで取得する設定項目は以下となる。

取得設定項目 取得設定内容
ホスト名・OSバージョン情報 OSのバージョン、カーネル番号、稼働時間など
ハードウェア情報 CPUのコアやソケット数、メモリ容量、PCIデバイス一覧
OS基本設定 Get-ComputerInfoで取得できる情報取得とページングファイルのサイズ設定
ネットワーク設定 各種ネットワーク関連設定。DNSやhostsファイルの設定を含む
ディスク設定 各種ディスク情報
光学ドライブ設定 CD/DVDドライブ情報
ユーザ・グループ設定 ローカルユーザー一覧、ローカルグループ一覧
リモートデスクトップ設定 リモートデスクトップに関する設定
時刻設定 タイムゾーン設定、時刻同期 (w32tm) に関する設定
OS言語設定 使用している言語
サービス設定 サービス一覧
役割・機能 Windowsの役割・機能の一覧
更新プログラム 適用済み更新プログラムの一覧
インストールソフトウェア インストールソフトウェア一覧
PowerShellモジュール インストール済みPowerShellモジュールの一覧
イベントビューアー イベントビューアーの設定情報。セキュリティイベントログの設定情報取得の際は管理者で実行が必要
Windows Defenderファイアウォール Windows Defenderファイアウォールの設定・ルール一覧

上記は一般的なWindows Serverの設定項目となっている。追加した役割・機能に応じて、適宜情報取得コマンドを追加するといったカスタマイズが必要となる。

スクリプト

今回作成したスクリプトはGitHubに置いてあるので、そちらを参照いただきたい。なお。Gitからダウンロードした際は文字コードがUTF-8になるため、Shift JISに変換して保存しなおしてから実行すること。

スクリプトには以下の関数を用意しており、効率よく設定値を取得できるようにしている。以下に関数の動作概要を記載する。

関数名 内容
show_title 取得対象の設定項目のタイトルを表示
get_command コマンドを実行して、その結果を取得
get_command_bat コマンドを実行して、その結果を取得(コマンドプロンプト用)
get_config 設定ファイルからコメント(#から始まる行)及び空行を削除して内容を取得

使い方

任意のディレクトリに配置したのち、PowerShellを「管理者として実行」で開き、配置ディレクトリに移動する。あとは以下の通り実行すれば情報取得が開始する。実行時間は環境にもよるが、10秒程度もあれば終了する。

PS> .\get_windows_config.ps1

なお本スクリプトは、PowerShellを「管理者として実行」せずとも、Administrators権限があればほとんどの情報取得には成功するよう作ってある。
※セキュリティイベントログの設定情報のみ取得に失敗する。

同じディレクトリ内に以下のファイル名でログが出力される。

[ホスト名]_config_[yyyyMMdd-HHmmss].log

情報取得結果のサンプル

以下に取得とした設定情報を例として記載する。
Start-Transcriptのヘッダーは省略している。

コマンドによる情報取得の場合は(command)# [実行コマンド]または(command_bat)# [実行コマンド]、設定ファイルの情報取得の場合は(config)# [ファイルのフルパス]と表示することで、どのように情報取得をしたかわかるようにしている。

################################
ホスト名・OSバージョン情報
################################

(command_bat)# cmd /C 'hostname'
WIN-K7OLL2H57TT

(command_bat)# cmd /C 'whoami.exe /user'

USER INFORMATION
----------------

User Name     SID
============================= =============================================
win-k7oll2h57tt\administrator S-1-5-21-3230081072-2687372604-3793060616-500


(command)# Get-WmiObject Win32_OperatingSystem | Select-Object Caption, OSArchitecture, Version, CodeSet, CountryCode, LastBootUpTime

Caption                                           OSArchitecture Version    CodeSet CountryCode LastBootUpTime
-------                                           -------------- -------    ------- ----------- --------------
Microsoft Windows Server 2022 Standard Evaluation 64 ビット         10.0.20348 932     81          20220516063525.500000+540

~(中略)~

################################
ディスク設定
################################

(command)# Get-Disk

Number Friendly Name       Serial Number                    HealthStatus OperationalStatus Total Size Partition Style
------ -------------       -------------                    ------------ ----------------- ---------- ---------------
0      VMware Virtual disk 6000c29703b80e9e48cca37b8d165c0b Healthy      Online                 80 GB GPT


(command)# Get-WmiObject Win32_DiskDrive | Select-Object Index, DeviceID, Model, @{N='SizeGB'; E={[Math]::Round($_.Size/1GB, 2)}}, Partitions | sort Index

Index DeviceID           Model                                SizeGB Partitions
----- --------           -----                                ------ ----------
    0 \\.\PHYSICALDRIVE0 VMware Virtual disk SCSI Disk Device     80          3


(command)# Get-WmiObject Win32_DiskPartition | Select-Object DiskIndex, Index, Name, BlockSize, Bootable, @{N='SizeGB'; E={[Math]::Round($_.Size/1GB, 2)}}, Type, Description | sort DiskIndex, Index

DiskIndex Index Name                BlockSize Bootable SizeGB Type            Description
--------- ----- ----                --------- -------- ------ ----            -----------
        0     0 ディスク #0, パーティション #0       512     True    0.1 GPT: System     GPT: システム
        0     1 ディスク #0, パーティション #1       512    False   79.3 GPT: Basic Data GPT: ベーシック データ
        0     2 ディスク #0, パーティション #2       512    False   0.58 GPT: Unknown    GPT: 不明

~(以下略)~

以上。

更新履歴

  • 2022/5/28 新規作成
  • 2024/7/26 スクリプトの文字コードをShift JISにする旨を追記

2023年1月21日土曜日

【PowerShell】Windowsのディスクのオンライン・オフラインとドライブレターを設定する

Windowsでは通常、昔から変わらない「ディスクの管理」画面を開いてディスクのオンライン・オフラインや、ドライブレターの変更作業をすることが多い。

あまりシチュエーションとしては多くないかもしれないが、定期的にディスクをオンライン・オフラインにしたりドライブレターの変更をする作業があるかもしれない。そのような場合は、PowerShellを使えば同様の作業がCLIベースで実施でき、あらかじめスクリプトなどを作っておけば自動化も可能となる。

本記事では、PowerShellを使ってWindowsのディスクのオンライン・オフラインとドライブレター変更の手順を記載する。

環境

Windows Server 2019を用いて動作確認を行った。

ディスクはCドライブ以外に2つ用意する。ディスク1をオンライン、ディスク2をオフラインにしておき、PowerShellを用いて以下の通りディスクの入れ替えを行う。

作業前

ディスクNo ドライブレター 容量 [GB] 状態
0 C 40 オンライン
1 U 30 オンライン
2 なし 32 オフライン

作業前

ディスクNo ドライブレター 容量 [GB] 状態
0 C 40 オンライン
1 なし 30 オフライン
2 U 32 オンライン

ディスクのマウント手順

1. ディスクの状態を確認

作業対象のディスクを確認する。ディスク情報を確認するコマンドレットは、以下3つが存在する。

コマンドレット 説明
Get-Disk 物理ディスクの一覧を表示する。オフラインのディスクも表示される。
Get-Volume 初期化及びフォーマット済みのディスクの一覧を表示する。オフラインのディスク上のボリュームは表示されない。
Get-Partition 各ディスクのパーティション一覧を表示する。オフラインのディスク上のパーティションは表示されない。

実行結果を以下に示す。

Get-Disk

PS C:\> Get-Disk

Number Friendly Name Serial Number                    HealthStatus         OperationalStatus      Total Size Partition
                                                                                                             Style
------ ------------- -------------                    ------------         -----------------      ---------- ----------
0      VMware Vir... 6000c298f4905127fbf4b8af93289b7c Healthy              Online                      40 GB GPT
1      VMware Vir... 6000c29155e1a0ea6d59319bfb0965df Healthy              Online                      30 GB GPT
2      VMware Vir... 6000c298d8b95c7aa7fa9c84622b5faa Healthy              Offline                     32 GB GPT

Get-Volume

PS C:\> Get-Volume

DriveLetter FriendlyName FileSystemType DriveType HealthStatus OperationalStatus SizeRemaining      Size
----------- ------------ -------------- --------- ------------ ----------------- -------------      ----
            回復         NTFS           Fixed     Healthy      OK                     57.05 MB    499 MB
D           VMware Tools Unknown        CD-ROM    Healthy      OK                          0 B 140.61 MB
C                        NTFS           Fixed     Healthy      OK                     29.84 GB   39.4 GB
U           ボリューム   NTFS           Fixed     Healthy      OK                     20.32 GB  29.98 GB
                         FAT32          Fixed     Healthy      OK                     69.12 MB     95 MB

Get-Partition

PS C:\> Get-Partition

   DiskPath: \\?\scsi#disk&ven_vmware&prod_virtual_disk#000000#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}

PartitionNumber  DriveLetter Offset                                        Size Type
---------------  ----------- ------                                        ---- ----
1                            1048576                                     499 MB Recovery
2                            524288000                                    99 MB System
3                            628097024                                    16 MB Reserved
4                C           644874240                                  39.4 GB Basic


   DiskPath: \\?\scsi#disk&ven_vmware&prod_virtual_disk#000100#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}

PartitionNumber  DriveLetter Offset                                        Size Type
---------------  ----------- ------                                        ---- ----
1                            17408                                     15.98 MB Reserved
2                U           16777216                                  29.98 GB Basic


   DiskPath: \\?\scsi#disk&ven_vmware&prod_virtual_disk#000200#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}

PartitionNumber  DriveLetter Offset                                        Size Type
---------------  ----------- ------                                        ---- ----
1                            17408                                     15.98 MB Reserved
2                            16777216                                  31.98 GB Basic

2. ディスク設定変更

確認結果より、今回はディスクNo1とディスクNo2をPowerShellにて入れ替える。

ディスクのオンライン・オフラインはSet-Diskコマンドレットで共通して操作可能だが、ドライブレターの削除(Remove-PartitionAccessPath)と追加(Set-Partition)はコマンドレットが異なる点に注意しよう。

# 取り外し対象ディスクNo
$old_disk_number=1
$old_driveletter=(Get-Disk -Number ${new_disk_number} | Get-Partition -Number 2).DriveLetter
# 取付対象ディスクNo
$new_disk_number=2
$new_driveletter="U"

# ドライブレターの削除
Get-Disk -Number ${old_disk_number} | Get-Partition -Number 2 | Remove-PartitionAccessPath -AccessPath "${old_driveletter}:"
# ディスクのオフライン
Get-Disk -Number ${old_disk_number} | Set-Disk -IsOffline $true

# ディスクのオンライン
Get-Disk -Number ${new_disk_number} | Set-Disk -IsOffline $false
# ドライブレターの付与
Get-Disk -Number ${new_disk_number} | Get-Partition -Number 2 | Set-Partition -NewDriveLetter ${new_driveletter}

ディスクの状態を戻す場合は、ディスクNoの変数を入れ替えればよい (★箇所)。

# 取り外し対象ディスクNo
$old_disk_number=2 #←★2に変更
$old_driveletter=(Get-Disk -Number ${new_disk_number} | Get-Partition -Number 2).DriveLetter
# 取付対象ディスクNo
$new_disk_number=1 #←★1に変更
$new_driveletter="U"

# ドライブレターの削除
Get-Disk -Number ${old_disk_number} | Get-Partition -Number 2 | Remove-PartitionAccessPath -AccessPath "${old_driveletter}:"
# ディスクのオフライン
Get-Disk -Number ${old_disk_number} | Set-Disk -IsOffline $true

# ディスクのオンライン
Get-Disk -Number ${new_disk_number} | Set-Disk -IsOffline $false
# ドライブレターの付与
Get-Disk -Number ${new_disk_number} | Get-Partition -Number 2 | Set-Partition -NewDriveLetter ${new_driveletter}

以上で、PowerShellを使ってィスクのオンライン・オフラインとドライブレター変更の手順は完了となる。

参考

2022年5月14日土曜日

サービス監視スクリプト (Windows版)

サーバーのプロセス監視 (Windowsの場合はサービス監視) は、監視ソフトウェア(ZabbixやJP1など)を使えば当たり前のように実現できる。ただし、環境やライセンスの関係でエージェントの導入ができない場合がある。

そのような場合でも、スクリプトを使ってプロセス監視 (サービス監視) を行うことは可能となる。

今回、Windowsのサービス監視を行うスクリプトを作ってみたので、その内容を記載する。

なお、Linuxのプロセス監視のスクリプトについては、以下記事を参照いただきたい。

実現方法

本スクリプトの設計概要を図示する。

このスクリプトは、確認対象のサービスを設定ファイル(check-service.conf)に記載しておき、Get-ServiceコマンドレットにてサービスがRunningステータスであるかどうかを確認する。

サービスダウンを検知した際は、Write-EventLogコマンドレットでApplicationイベントログにエラーメッセージを出力する。エラーメッセージ出力タイミングは、サービスダウンの初回発生時のみとし、それ以外は情報メッセージとして出力する。

以下に、本スクリプトで発生するメッセージを記載する。

サービス状態 メッセージ
正常時 [INFO] Service XXX up
正常状態継続時 [INFO] Service XXX still up
ダウン時 [ERROR] Service XXX down
ダウン状態継続時 [INFO] Service XXX still down

この処理をタスクスケジューラーで1分間隔で実行するよう登録し、定期的なサービス監視を実現する。

スクリプト実行手順

1. スクリプト実行前にイベントソースを登録

Windowsイベントログにイベントを出力する際に、事前にイベントソースの登録が必要となる。事前に管理者権限でPowerShellのプロンプトを開き、以下コマンドを実行しておくこと。

PS C:\> New-EventLog -LogName Application -Source "Service Check Script"

なお、イベントソースの登録削除は、以下のコマンドとなる。

PS C:\> Remove-EventLog -Source "Service Check Script"

2. スクリプト配置

以下にスクリプトのコードを記載する。GitHubにも配置してある。

スクリプトファイル:check-service.ps1

################
# Scripts name : check-service.ps1
# Usage        : ./check-service.ps1
#                同一ディレクトリにcheck-service.confを配置し、タスクスケジューラーで定期実行する。
#                事前にAdmin権限で以下コマンドをを実行すること。
#                New-EventLog -LogName Application -Source "Service Check Script"
# Description  : Windowsサービスチェックスクリプト
# Create       : 2022/05/02 tech-mmmm (https://tech-mmmm.blogspot.com/)
# Modify       : 
################

$currentdir = Split-Path -Parent $MyInvocation.MyCommand.Path
$conffile = $currentdir + "\check-service.conf"    # 設定ファイル
$tmpfile = $currentdir + "\check-service.tmp"      # サービス情報保存用一時ファイル
$event_source = "Service Check Script"             # スクリプトソース名

# すでにDownしているサービス情報を取得
if ( Test-Path -Path $tmpfile ){
    $down_service = Get-Content $tmpfile
}
Write-Output $null | Out-File $tmpfile

# 設定ファイル読み込み
foreach ($line in (Get-Content $conffile)) {   
    # コメント行と空行を処理しない
    if ( $line -notmatch "^ *#|^$" ){
        # 現在のサービス数を取得
        $count = (Get-Service -Name $line | Where-Object { $_.Status -eq "Running" }).count
        
        # サービス数チェック
        if ( $count -lt 1 ){
            # Down時の処理
            # Downしているサービスか確認
            if ( $down_service -eq $line ){
                # すでにDown
                $message = "Service """ + $line + """ still down"
                $event_type = "Information"
            }else{
                # 初回Down
                $message = "Service """ + $line + """ down"
                $event_type = "Error"
            }
            
            # イベントログに出力
            Write-Output $message
            Write-EventLog -LogName Application -EntryType $event_type -Source $event_source -EventId 100 -Message $message

            # Donwしているサービス情報を出力
            Write-Output $line | Out-File -Append $tmpfile
        }else{
            # Up時の処理
            # Downしていたサービスか確認
            if ( $down_service -eq $line ){
                # Downだった
                $message = "Service """ + $line + """ up"
                $event_type = "Information"                
            }else{
                # すでにUp
                $message = "Service """ + $line + """ still up"
                $event_type = "Information"
            }

            # イベントログに出力
            Write-Output $message
            Write-EventLog -LogName Application -EntryType $event_type -Source $event_source -EventId 100 -Message $message
        }
    }
}

exit 0

設定ファイル例:check-service.conf

# Service mame
Netlogon
W32Time
VMTools

3. タスクスケジューラーへの登録

タスクスケジューラーにて本スクリプトを1分間隔で実行するように設定する。こちらの方法については、以下別記事を参照いただきたい。

4. 監視テスト

実際にサービスを停止させて動作確認をしてみよう。W32Timeを停止させてサービス停止を検知することを確認してみる。

PS C:\> Stop-Service -Name W32Time
PS C:\> Get-EventLog -LogName Application -Source "Service Check Script"

   Index Time          EntryType   Source                 InstanceID Message
   ----- ----          ---------   ------                 ---------- -------
   12652 5 03 06:27    Information Service Check Script          100 Service "VMTools" still up
   12651 5 03 06:27    Error       Service Check Script          100 Service "W32Time" down  ★停止を検知
   12650 5 03 06:27    Information Service Check Script          100 Service "Netlogon" still up
~(以下略)~

次に、復旧時の動作を確認する。

PS C:\> Start-Service -Name W32Time
PS C:\> Get-EventLog -LogName Application -Source "Service Check Script"

   Index Time          EntryType   Source                 InstanceID Message
   ----- ----          ---------   ------                 ---------- -------
   12655 5 03 06:29    Information Service Check Script          100 Service "VMTools" still up
   12654 5 03 06:29    Information Service Check Script          100 Service "W32Time" up ★復旧
   12653 5 03 06:29    Information Service Check Script          100 Service "Netlogon" still up
~(以下略)~

以上。

更新履歴

  • 2017/12/18 新規作成
  • 2022/05/14 全体的にスクリプトの構成を見直し
2021年12月25日土曜日

PowerShellでMTUを計測する

先日WireGuardを使って、外部からインターネット回線経由で自宅にVPN接続できるよう構成した。

しかし、インターネット回線で接続する際に、ファイル共有やSSHによる接続は問題なくできるが、リモートデスクトップ接続が黒い画面で接続・切断を繰り返すという事象が発生し悩まされた。

結論としては、MTUの問題であった。自宅のv6プラスのインターネット回線 (ドコモ光) は最大MTUサイズが1460byteであり、WireGuardのヘッダーサイズを考慮して、MTUサイズを小さくしなければ、フラグメント禁止フラグ (DFフラグ; Don’t Fragmentフラグ) が設定されたパケットが通過できず通信が不安定になっていたのだ。

具体的にWireGuardで必要となるヘッダーサイズは以下の通り。

項目 ヘッダーサイズ (byte)
IPヘッダー 20 (IPv4の場合)、40 (IPv6の場合)
UDPヘッダー 8
WireGuardで必要なヘッダーサイズ 32
合計 60 (IPv4の場合)、80 (IPv6の場合)

上記の通りとなるため、回線の最大MTUサイズから60または80byteを引いた値をWireGuardのサーバ側のMTU設定にて指定する必要がある。

今回は、このような状況を想定して、通過可能なMTUサイズをPowerShellを使って測定するコマンドを記載する。

MTUを計測用PowerShellコマンド

1. PowerShellコマンド

MTUサイズを1500から1ずつ下げながら、DFフラグを付けたpingを実行し、成功した際のMTUサイズを表示するコマンドとなる。ping先はwww.yahoo.co.jpとさせてもらった。

for($mtu = 1500; $mtu -ge 1420; $mtu--){
  ping -f -l ${mtu} -n 1 www.yahoo.co.jp > $null
  if($? -eq $true){
    Write-Host "回線のMTUは"($mtu + 28)"です。"
    break
  }
}

実際の実行結果を以降に示す。

2. ドコモ・AUをテザリングで使用した場合の測定結果

ドコモ・AUをテザリングで利用した際のMTUサイズは1500byteのようだ。

PS C:\> for($mtu = 1500; $mtu -ge 1420; $mtu--){
>>   ping -f -l ${mtu} -n 1 www.yahoo.co.jp > $null
>>   if($? -eq $true){
>>     Write-Host "回線のMTUは"($mtu + 28)"です。"
>>     break
>>   }
>> }
回線のMTUは 1500 です。

3. v6プラスのインターネット回線 (ドコモ光) の測定結果

v6プラスのインターネット回線 (ドコモ光) のMTUサイズは1460byteのようだ。

PS C:\> for($mtu = 1500; $mtu -ge 1420; $mtu--){
>>   ping -f -l ${mtu} -n 1 www.yahoo.co.jp > $null
>>   if($? -eq $true){
>>     Write-Host "回線のMTUは"($mtu + 28)"です。"
>>     break
>>   }
>> }
回線のMTUは 1460 です。

参考

2021年12月11日土曜日

PowerShell 7.2をWindowsとLinuxにインストールする手順

PowerShell 7.2が2021/11/8にリリースされた。

PowerShell 7.2はWindowsだけでなく各種Linuxディストリビューションにおいても利用できるようなので、早速インストールしてみることにした。

本記事では、PowerShell 7.2をWindows ServerとLinux (RHEL) にインストールする手順を記載する。

環境

導入環境は以下の通りとなる。RHELについては、7と8両方でインストール確認をしている。

  • Windows Server 2019
  • RHEL 8.3
  • RHEL 7.6

Windowsへのインストール

1. MSIのインストーラをダウンロード

以下公式のGitHubからrpmをダウンロードする。ダウンロード対象のファイルはPowerShell-7.2.0-win-x64.msiとなる。

2. インストーラを起動しインストールを実施

ダウンロードしたMSIファイルをダブルクリックするとインストールウィザードが起動する。インストールウィザードでは、以下のようなPowerShellをモチーフにしたヒーローが表示される。

インストールウィザードではデフォルトの設定を選択すれば問題ないだろう。デフォルトの設定を選択することで、Windows Update時にPowerShell 7.2のアップデートの確認ができるようになる。

なお、インストールウィザードに表示されるPowerShellヒーローの活躍は、Microsoftより公開されている「Nanoman - Server of realm」というアメコミで確認できる。ぜひ読んでおこう!

3. PowerShell 7.2のコンソールを起動

PowerShell 7.2は通常のOSにインストールされているコンソールとは別に用意がされている。プログラムメニューでは「PowerShell 7」という名前となっているで、そちらを選択しコンソールを起動してみよう。

コンソールを起動すると、いつもの青い画面ではなく黒い画面のコンソールが起動する。試しに$PSVersionTableにてバージョンを確認してみると以下の通り7.2となっていることがわかる。

なお、通常のPowerShell (Windows Server 2019の場合は、バージョン5.1) は、引き続き利用することができる。

以上でWindows環境へのPowerShell 7.2の導入は完了となる。

RHELへのインストール

1. rpmをダウンロード

以下公式のGitHubからrpmをダウンロードする。ダウンロード対象のファイルはpowershell-lts-7.2.0-1.rh.x86_64.rpmとなる。

図14

2. rpmをインストール

PowerShellは特に依存関係なくインストールすることができる。

# rpm -ivh powershell-lts-7.2.0-1.rh.x86_64.rpm
警告: powershell-lts-7.2.0-1.rh.x86_64.rpm: ヘッダー V4 RSA/SHA256 Signature、鍵 ID be1229cf: NOKEY
Verifying...                          ################################# [100%]
準備しています...              ################################# [100%]
更新中 / インストール中...
   1:powershell-lts-7.2.0-1.rh        ################################# [100%]

3. PowerShellにシェルを変更

PowerShellへのシェル変更はpwshコマンドにて行う。試しに$PSVersionTableにてバージョンを確認してみると以下の通り7.2となっていることがわかる。

# pwsh
PowerShell 7.2.0
Copyright (c) Microsoft Corporation.

https://aka.ms/powershell
Type 'help' to get help.

PS /root> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      7.2.0
PSEdition                      Core
GitCommitId                    7.2.0
OS                             Linux 3.10.0-957.48.1.el7.x86_64 #1 SMP Fri Mar 6 14:14:26 EST 2020
Platform                       Unix
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0

シェルを変更せず、直接コマンドを実行する場合は-cオプションを用いる。

# pwsh -c "Get-Date"

2021年11月21日日曜日 15:29:19

.ps1ファイルを読み込ませて実行させる場合は、-fオプションを用いる。

# cat test.ps1
Get-Date
# pwsh -f test.ps1

2021年11月21日日曜日 15:31:37

以上でRHEL環境へのPowerShell 7.2の導入は完了となる。

参考

2021年7月11日日曜日

Windows標準コマンド (PowerShell) を使ってsedっぽいことを実現する

コマンドラインを使って文字列操作を行う場合、Linuxではsedコマンドを使って実施するのが鉄板だが、WindowsではPowerShellのコマンドレットを組み合わせることでほぼ同様のことができる。

今回、いくつかsedでよく使う文字列処理のパターンに対して、PowerShellで実行する手順を検証してみたので、その結果を記載する。

文字列処理パターン

今回、以下表の8パターンの文字列処理をPowerShellで実現するコマンドを検証した。

No 文字列処理 コマンド (1行目 : sed、2行目 : PowerShell)
1 置換 sed -e 's/<検索文字列>/<置換文字列>/g' <入力ファイル>
gc <入力ファイル> | % { $_ -creplace "<検索文字列>", "<置換文字列>" }
2 空白行を削除 sed -e '/^$/d' <入力ファイル>
gc <入力ファイル> | ? { $_ -ne "" }
3 コメント(#開始行)を削除 sed -e '/^#/d' <入力ファイル>
gc <入力ファイル> | ? { $_ -notmatch "^#" }
4 改行を削除 tr -d '\n' < <入力ファイル>
gc <入力ファイル> -Raw | % { $_ -replace "`r`n", "" }
5 検索文字列の1行上に追記 sed -e '/<検索文字列>/i <追加文字列>' <入力ファイル>
gc <入力ファイル> -Raw | % { $_ -creplace "<検索文字列>", "<追加文字列>`r`n<検索文字列>" }
6 検索文字列の1行下に追記 sed -e '/<検索文字列>/a <追加文字列>' <入力ファイル>
gc <入力ファイル> -Raw | % { $_ -creplace "<検索文字列>", "<検索文字列>`r`n<追加文字列>" }
7 各行の先頭に文字列を追加 sed -e 's/^/<追加文字列>/g' <入力ファイル>
gc <入力ファイル> | % { "<追加文字列>" + $_ }
8 各行の末尾に文字列を追加 sed -e 's/$/<追加文字列>/g' <入力ファイル>
gc <入力ファイル> | % { $_ + "<追加文字列>" }

テスト用テキストファイル

実行結果を示すために、以下のテキストファイルを使用する。

PS C:\> Get-Content .\test.txt
Test
Test1

Test2

# Test3
Test4

Test5

また、コマンドの記載を簡略化するため、以下の省略法を使用する。

コマンドレット 省略記法
Get-Content gc
ForEach-Object (foreach) %
Where-Object (where) ?
Select-Object select

1. 置換

正規表現を使用しない場合の置換コマンド

置換はいくつか方法があるが、簡単なのは、Get-ContentコマンドレットのReplaceメソッドを使う方法となる。この方法では正規表現は利用できず、大文字・小文字の区別がされる状態で置換される。

PS C:\> (gc .\test.txt).Replace("Test1","Hoge")
Test
Hoge

Test2

# Test3
Test4

Test5

また、置換したテキストをファイルに出力したい場合は、以下の通りOut-Fileコマンドレットを使用する。

PS C:\> (gc .\test.txt).Replace("Test1","Hoge") | Out-File test-out.txt

正規表現を使用する場合の置換コマンド

正規表現使う場合は、以下の通り記載する。大文字・小文字の区別するよう-creplaceを使用しているが、もし大文字・小文字の区別が不要な場合は、-replaceを使用すればよい。

PS C:\> gc .\test.txt | % { $_ -creplace "^Test", "Hoge" }
Hoge
Hoge1

Hoge2

# Test3
Hoge4

Hoge5

2. 空白行を削除

空白行を削除する場合は、Where-Objectコマンドレットで「""」以外の行を出力させることで対応する。

PS C:\> gc .\test.txt | ? { $_ -ne "" }
Test
Test1
Test2
# Test3
Test4
Test5

3. コメント(#から始まる行)を削除

以下の通り実行すれば実現できる。

PS C:\> gc .\test.txt | ? { $_ -notmatch "^#" }
Test
Test1

Test2

Test4

Test5

コメントと空白行を同時に削除する場合は、-andを使って以下のように実行すればよい。

PS C:\> (gc .\test.txt) | ? { $_ -notmatch "^#"  -and $_ -ne "" }
Test
Test1
Test2
Test4
Test5

4. 改行を削除

Get-Content-Rawパラメータを付けると、改行コードなども含めて出力されるので、これを利用すして改行コードを置換して消すことで改行を削除して、すべてのテキストを1行で出力させることができる。

PS C:\> gc .\test.txt -Raw | % { $_ -replace "`r`n", "" }
TestTest1Test2# Test3Test4Test5

5. 検索文字列の1行上に追記

以下を実行する。なお、わかりやすくするため、検索文字列を$strに、追加文字列を$add_strに代入している。

PS C:\> $str="Test2"
PS C:\> $add_str="Test1.5"
PS C:\> gc .\test.txt -Raw | % { $_ -creplace "$str", "$add_str`r`n$str" }
Test
Test1

Test1.5
Test2

# Test3
Test4

Test5

6. 検索文字列の1行下に追記

以下を実行する。なお、わかりやすくするため、検索文字列を$strに、追加文字列を$add_strに代入している。

PS C:\> $str="Test2"
PS C:\> $add_str="Test1.5"
PS C:\> gc .\test.txt -Raw | % { $_ -creplace "$str", "$str`r`n$add_str" }
Test
Test1

Test2
Test1.5

# Test3
Test4

Test5

7. 各行の先頭に文字列を追加

以下を実行する。foreachで各行に対して先頭に文字列を連結する。

PS C:\> gc .\test.txt | % { "Hoge1_" + $_ }
Hoge1_Test
Hoge1_Test1
Hoge1_
Hoge1_Test2
Hoge1_
Hoge1_# Test3
Hoge1_Test4
Hoge1_
Hoge1_Test5

8. 各行の末尾に文字列を追加

以下を実行する。foreachで各行に対して末尾に文字列を連結する。

PS C:\> gc .\test.txt | % { $_ + "_Hoge1" }
Test_Hoge1
Test1_Hoge1
_Hoge1
Test2_Hoge1
_Hoge1
# Test3_Hoge1
Test4_Hoge1
_Hoge1
Test5_Hoge1

更新履歴

  • 2020/6/23 新規作成
  • 2021/7/11 「文字列処理パターン」の表にsedだけでなく、PowerShellのコマンド構文を記載

2020年4月27日月曜日

【PowerShell】3行のコマンドでWindowsのリモートデスクトップ接続を有効にする方法!

近年はサーバ仮想化やクラウド化が進み、物理サーバよりも仮想サーバを構築することが多くなっている。特に仮想サーバの場合、物理的なモニター・キーボードがないことから、通常はWindowsのリモートデスクトップ接続を有効にして、リモートから操作することが通常であると思われる。

しかし、Windows Serverは、Windows Server 2019となってもデフォルトではリモートデスクトップ接続は有効になっておらず、手動で設定を変更する必要があり、非常にめんどくさい・・・。というわけで、PowerShellで実行する方法を確認してみた。

確認した結果、コマンドとしてはわずか3行となることがわかったが、長いコマンドとなるため手打ちは現実的ではない。リモートデスクトップ設定する前に実行する場合は、スクリプト化などしてファイルサーバ等に配置し、端末やサーバにスクリプトをコピー実行するという使い方が現実的だろう。

リモートデスクトップ接続を有効にする

結論から言うと、リモートデスクトップはレジストリを書き換えることで対処する。HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Serverに保存されている以下2つのキーを設定する。
キー デフォルト値 説明
fDenyTSConnections 1 「このコンピュータへのリモート接続を許可しない/許可しない」の設定。0で「許可する」、1で「許可しない」。
UserAuthentication 0 「ネットワークレベル認証でリモートデスクトップを実行しているコンピューターからのみ接続を許可する (推奨)」の設定。0で無効、1で有効。
Get-ItemPropertyコマンドレットで現在の設定値を確認することができる。
PS C:\> Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server" -Name  "fDenyTSConnections"

fDenyTSConnections : 1
PSPath             : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal S
                     erver
PSParentPath       : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control
PSChildName        : Terminal Server
PSDrive            : HKLM
PSProvider         : Microsoft.PowerShell.Core\Registry
PS C:\> Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name "UserAuthentication"

UserAuthentication : 0
PSPath             : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal S
                     erver\WinStations\RDP-Tcp
PSParentPath       : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal S
                     erver\WinStations
PSChildName        : RDP-Tcp
PSDrive            : HKLM
PSProvider         : Microsoft.PowerShell.Core\Registry
Set-ItemPropertyコマンドレットで設定を変更する。
PS C:\> Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server" -Name  "fDenyTSConnections" -Value "0"
PS C:\> Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name "UserAuthentication" -Value 1

上記コマンドを実行すると以下の通りリモートデスクトップの設定が変更される。

【変更前】

【変更後】

Windowsファイアウォールでリモートデスクトップの通信を許可する

GUIでリモートデスクトップ接続を許可する設定を実施した場合は、同時にWindowsファイアウォールの必要な通信規則を有効にしてくれるが、レジストリを直接書き換えた場合は設定されないため、手動でWindowsファイアウォールの通信規則の有効化が必要となる。

通信の規則自体はOSデフォルトで作成がされており、「RemoteDesktop~」から始まる以下3つの規則を有効化すればよい。
  • RemoteDesktop-UserMode-In-TCP
  • RemoteDesktop-UserMode-In-UDP
  • RemoteDesktop-Shadow-In-TCP
リモートデスクトップに関するファイアウォール規則を確認するコマンドは以下の通り。Windows Server 2019などでは「リモートデスクトップ (WebSocket)」と呼ばれる通信ルールが存在するが、有効にする必要はないため、表示から除外している。
PS C:\> Get-NetFirewallRule | Where-Object { $_.Name -like "RemoteDesktop*" -and $_.Name -notlike "*ws*" } | ft Name,DisplayName,Enabled -AutoSize

Name                          DisplayName                                        Enabled
----                          -----------                                        -------
RemoteDesktop-UserMode-In-TCP リモート デスクトップ - ユーザー モード (TCP 受信)    False
RemoteDesktop-UserMode-In-UDP リモート デスクトップ - ユーザー モード (UDP 受信)    False
RemoteDesktop-Shadow-In-TCP   リモート デスクトップ - シャドウ (TCP 受信)           False
上記規則をSet-NetFirewallRuleコマンドレットを使って有効化する。
PS C:\> Get-NetFirewallRule | Where-Object { $_.Name -like "RemoteDesktop*" -and $_.Name -notlike "*ws*" } | Set-NetFirewallRule -Enabled true
上記コマンドを実行後にGUIのファイアウォールの状態を確認すると、問題なくリモートデスクトップの受信の規則が有効化されていることが確認できる。


まとめ

まとめると、以下3つのコマンドをメモ帳に書いておいて、「Enable-RDP.ps1」などの名前でスクリプトとして保存し、ファイルを右クリック→「PowerShellで実行」を実施すれば、最速でリモートデスクトップの有効化が実施できる。
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server" -Name  "fDenyTSConnections" -Value "0"
Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name "UserAuthentication" -Value 1
Get-NetFirewallRule | Where-Object { $_.Name -like "RemoteDesktop*" -and $_.Name -notlike "*ws*" } | Set-NetFirewallRule -Enabled true


2019年3月6日水曜日

【PowerShell】Windowsのネットワークの設定を行う

Windows Serverをインストールした際に、避けて通れないネットワーク設定であるが、GUIでポチポチ設定するのも面倒なので、PowerShellを使ってコマンドで実施する方法を調べてみた。

NICのIPv6をOFFにする

WindowsのNICはデフォルトでIPv6が利用できるように設定されているが、IPv6は利用する機会はほとんどないので無効化しておく。

まずは、現在のNICの設定状態を確認してみよう。Get-NetAdapterBindingコマンドレットで確認できる。ここで表示される値は、GUIでいうとネットワークアダプターのプロパティの画面と同じになる。
PS C:\> Get-NetAdapterBinding |  Where-Object {$_.Name -eq "Ethernet2"}

Name                           DisplayName                                        ComponentID          Enabled
----                           -----------                                        -----------          -------
Ethernet2                      Microsoft LLDP プロトコル ドライバー               ms_lldp              True
Ethernet2                      Microsoft ネットワーク用ファイルとプリンター共有   ms_server            True
Ethernet2                      インターネット プロトコル バージョン 4 (TCP/IPv4)  ms_tcpip             True
Ethernet2                      Microsoft ネットワーク用クライアント               ms_msclient          True
Ethernet2                      Microsoft Network Adapter Multiplexor Protocol     ms_implat            False
Ethernet2                      Link-Layer Topology Discovery Responder            ms_rspndr            True
Ethernet2                      インターネット プロトコル バージョン 6 (TCP/IPv6)  ms_tcpip6            True
Ethernet2                      Hyper-V Extensible Virtual Switch                  vms_pp               False
Ethernet2                      Link-Layer Topology Discovery Mapper I/O Driver    ms_lltdio            True
Ethernet2                      QoS パケット スケジューラ                          ms_pacer             True
設定変更はSet-NetAdapterBindingコマンドレットで行う。今回は「Ethernet2」の「ms_tcpip6」を無効化する。
PS C:\> Set-NetAdapterBinding -Name "Ethernet2" -ComponentID "ms_tcpip6" -Enable $false
設定後の確認を行うと、「インターネット プロトコル バージョン 6 (TCP/IPv6)」が「False」になっていることがわかる。
PS C:\> Get-NetAdapterBinding |  Where-Object {$_.Name -eq "Ethernet2"}

Name                           DisplayName                                        ComponentID          Enabled
----                           -----------                                        -----------          -------
Ethernet2                      Microsoft LLDP プロトコル ドライバー               ms_lldp              True
Ethernet2                      Microsoft ネットワーク用ファイルとプリンター共有   ms_server            True
Ethernet2                      インターネット プロトコル バージョン 4 (TCP/IPv4)  ms_tcpip             True
Ethernet2                      Microsoft ネットワーク用クライアント               ms_msclient          True
Ethernet2                      Microsoft Network Adapter Multiplexor Protocol     ms_implat            False
Ethernet2                      Link-Layer Topology Discovery Responder            ms_rspndr            True
Ethernet2                      インターネット プロトコル バージョン 6 (TCP/IPv6)  ms_tcpip6            False
Ethernet2                      Hyper-V Extensible Virtual Switch                  vms_pp               False
Ethernet2                      Link-Layer Topology Discovery Mapper I/O Driver    ms_lltdio            True
Ethernet2                      QoS パケット スケジューラ                          ms_pacer             True

NICに固定IPアドレスを付与する

NICに固定IPアドレスを設定する前に、インターフェースの名前を確認しよう。インターフェース一覧はGet-NetAdapterコマンドレットで確認できる。今回は「Ethernet2」を対象に設定変更を行うことにする。
PS C:\> Get-NetAdapter | Sort-Object Name

Name                      InterfaceDescription                    ifIndex Status       MacAddress             LinkSpeed
----                      --------------------                    ------- ------       ----------             ---------
Ethernet0                 Intel(R) 82574L Gigabit Network Conn...      16 Up           00-0C-29-AF-24-83         1 Gbps
Ethernet1                 Intel(R) 82574L Gigabit Network Co...#2       4 Up           00-0C-29-AF-24-8D         1 Gbps
Ethernet2                 Intel(R) 82574L Gigabit Network Co...#3      37 Up           00-0C-29-AF-24-97         1 Gbps
vEthernet (Intel(R) 82... Hyper-V Virtual Ethernet Adapter              9 Up           00-0C-29-AF-24-83         1 Gbps
続けて、インターフェースに設定されているIPアドレスをGet-NetIPAddressコマンドレットにて確認する。
PS C:\> Get-NetIPAddress |ft InterfaceAlias, IPAddress,PrefixLength

InterfaceAlias                                                          IPAddress                    PrefixLength
--------------                                                          ---------                    ------------
Ethernet2                                                               fe80::c57b:1420:969:f48b%37            64
vEthernet (Intel(R) 82574L Gigabit Network Connection - Virtual Switch) fe80::c19f:f1cb:d7ca:df6%9             64
ローカル エリア接続* 10                                                 fe80::155e:acfe:8b10:d8ab%12           64
Ethernet1                                                               fe80::7c63:ecf4:628:44e4%4             64
Loopback Pseudo-Interface 1                                             ::1                                   128
Ethernet2                                                               169.254.244.139                        16
vEthernet (Intel(R) 82574L Gigabit Network Connection - Virtual Switch) 192.168.11.111                         24
ローカル エリア接続* 10                                                 169.254.2.65                           16
Ethernet1                                                               192.168.55.111                         24
Loopback Pseudo-Interface 1                                             127.0.0.1                               8
それではIPアドレスを設定してみよう。IPアドレスはNew-NetIPAddressコマンドレットで設定可能となる。-DefaultGatewayオプションを付けることでデフォルトゲートウェイの設定も可能。ただし、デフォルトゲートウェイはサーバ内で1つしか設定できないため、本コマンドでデフォルトゲートウェイを設定した場合、すでに設定済みデフォルトゲートウェイの設定がある場合は消えてしまうので注意すること。

「Ethernet2」のアダプターに対して、「192.168.77.111/24」でデフォルトゲートウェイを「192.168.77.31」に設定してみた。
PS C:\> New-NetIPAddress -IPAddress "192.168.77.111" -InterfaceAlias "Ethernet2" -DefaultGateway "192.168.77.31" -PrefixLength 24


IPAddress         : 192.168.77.111
InterfaceIndex    : 37
InterfaceAlias    : Ethernet2
AddressFamily     : IPv4
Type              : Unicast
PrefixLength      : 24
PrefixOrigin      : Manual
SuffixOrigin      : Manual
AddressState      : Tentative
ValidLifetime     : Infinite ([TimeSpan]::MaxValue)
PreferredLifetime : Infinite ([TimeSpan]::MaxValue)
SkipAsSource      : False
PolicyStore       : ActiveStore

IPAddress         : 192.168.77.111
InterfaceIndex    : 37
InterfaceAlias    : Ethernet2
AddressFamily     : IPv4
Type              : Unicast
PrefixLength      : 24
PrefixOrigin      : Manual
SuffixOrigin      : Manual
AddressState      : Invalid
ValidLifetime     : Infinite ([TimeSpan]::MaxValue)
PreferredLifetime : Infinite ([TimeSpan]::MaxValue)
SkipAsSource      : False
PolicyStore       : PersistentStore
設定を元に戻す場合は、デフォルトのDHCPに変更すればよい。
Set-NetIPInterface -InterfaceAlias "Ethernet2" -Dhcp Enable

NICの有効化・無効化

NICの有効化はEnable-NetAdapterコマンドレットで行うことができる。
PS C:\> Enable-NetAdapter -Name "Ethernet2"
NICの無効化はDisable-NetAdapterコマンドレットで行うことができる。
PS C:\> Disable-NetAdapter -Name "Ethernet2"

確認
この操作を実行しますか?
Disable-NetAdapter 'Ethernet2'
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"): y
確認が不要な場合は-Confirm $falseをオプションとして付与すればよい。
PS C:\> Disable-NetAdapter -Name "Ethernet2" -Confirm $false
2019年2月27日水曜日

【PowerShell】Windowsの役割・機能を追加する

Windows Server構築時の序盤に必ず発生する作業として、サーバーマネージャーから「役割と機能の追加」がある。この作業はGUI操作となり、何回もウィザードの画面を遷移させる必要があるので地味に面倒くさい・・・。


ということでPowerShellで実施できるよう、コマンドを確認してみた。

Get-WindowsFeatureコマンドレットで「役割と機能の追加」の一覧を確認する

インストールを実施する前に、選択可能な役割と機能をGet-WindowsFeatureコマンドレットで確認しておこう。ここで、インストールしたいもののNameの値を確認しておき、後ほどインストール時に指定する必要がある。
PS C:\> Get-WindowsFeature

Display Name                                            Name                       Install State
------------                                            ----                       -------------
[ ] Active Directory Federation Services                ADFS-Federation                Available
[ ] Active Directory Rights Management サービス         ADRMS                          Available
    [ ] Active Directory Rights Management サーバー     ADRMS-Server                   Available
    [ ] ID フェデレーション サポート                    ADRMS-Identity                 Available

~(中略)~

[ ] マルチパス I/O                                      Multipath-IO                   Installed

~(以下略)~
今回は「マルチパス I/O (Multipath-IO)」をインストールしてみる。

Install-WindowsFeatureコマンドレットで「役割と機能の追加」を実施する

役割と機能のインストールは、Install-WindowsFeatureコマンドレットを使うことで実現できる。インストールする対象に応じて、以下2つのオプション付与も考慮しよう。
  • IncludeAllSubFeature : 下の階層の役割と機能をすべてインストールする
  • IncludeManagementTools : 管理ツールを合わせてインストールする。基本的に管理ツールは必須となる場合が多いので、このオプションは必ず付与しておけばよいと思われる
それではインストールをしてみよう。まず、PowerShellを「管理者として実行する」を選んで開く。


Install-WindowsFeatureコマンドレットでインストールを実行する。マルチパス I/Oの場合は、インストール後に再起動が必要な旨の警告が表示される。
PS C:\> Install-WindowsFeature -Name Multipath-IO -IncludeManagementTools

Success Restart Needed Exit Code      Feature Result
------- -------------- ---------      --------------
True    Yes            SuccessRest... {マルチパス I/O}
警告: インストール処理を完了するには、このサーバーを再起動する必要があります。
警告に従い、OSを一度再起動する。
PS C:\> shutdown /r /t 0
再起動すると、「マルチパス I/O」の機能が「Installed」の状態で表示されるようになった。
PS C:\> Get-WindowsFeature | Where-Object {$_.InstallState -eq "Installed"}

Display Name                                            Name                       Install State
------------                                            ----                       -------------
[X] ファイル サービスと記憶域サービス                   FileAndStorage-Services        Installed
    [X] 記憶域サービス                                  Storage-Services               Installed
[X] .NET Framework 4.6 Features                         NET-Framework-45-Fea...        Installed
    [X] .NET Framework 4.6                              NET-Framework-45-Core          Installed
    [X] WCF サービス                                    NET-WCF-Services45             Installed
        [X] TCP ポート共有                              NET-WCF-TCP-PortShar...        Installed
[X] SMB 1.0/CIFS ファイル共有のサポート                 FS-SMB1                        Installed
[X] Windows Defender の機能                             Windows-Defender-Fea...        Installed
    [X] Windows Defender                                Windows-Defender               Installed
    [X] Windows Defender の GUI                         Windows-Defender-Gui           Installed
[X] Windows PowerShell                                  PowerShellRoot                 Installed
    [X] Windows PowerShell 5.1                          PowerShell                     Installed
    [X] Windows PowerShell ISE                          PowerShell-ISE                 Installed
[X] WoW64 サポート                                      WoW64-Support                  Installed
[X] グループ ポリシーの管理                             GPMC                           Installed
[X] マルチパス I/O                                      Multipath-IO                   Installed
[X] リモート サーバー管理ツール                         RSAT                           Installed
    [X] 役割管理ツール                                  RSAT-Role-Tools                Installed
        [X] AD DS および AD LDS ツール                  RSAT-AD-Tools                  Installed
            [X] AD DS ツール                            RSAT-ADDS                      Installed
                [X] Active Directory 管理センター       RSAT-AD-AdminCenter            Installed
                [X] AD DS スナップインおよびコマンド... RSAT-ADDS-Tools                Installed
            [X] AD LDS スナップインおよびコマンドラ...  RSAT-ADLDS                     Installed
            [X] Windows PowerShell の Active Directo... RSAT-AD-PowerShell             Installed
        [X] DNS サーバー ツール                         RSAT-DNS-Server                Installed
2017年7月28日金曜日

SCEPの定義ファイルを手動で適用するスクリプトを作った

先日、Windows Defenderの定義ファイルを更新するスクリプトを作ってみたのだが、SCEPでも同様にできるものかと試してみた、という小ネタ。

結論から言うと少しコマンドの修正が必要だった(黄色網掛け箇所)。Windows DefenderとSCEPでは、同じ動作をするコマンドレットであっても、微妙にコマンドレット名が違うので注意が必要。

------------------------------
#
# SCEP定義ファイル更新スクリプト
# update_scep.ps1
#

# SCEPのモジュールをインポート
Import-Module "C:\Program Files\Microsoft Security Client\MpProvider\MpProvider.psd1"

# 定義ファイルのダウンロード先を指定
$url = "https://go.microsoft.com/fwlink/?LinkID=87341"

# 定義ファイルのダウンロードフォルダを指定
$workdir = "c:\work\"

# 実行コマンド
$cmd = $workdir + "mpam-fe.exe"

# 定義ファイルをダウンロード
Invoke-WebRequest -Uri $url -OutFile $cmd

# 適用チェック
if ( (Get-Item $cmd).VersionInfo.FileVersion -eq (Get-MProtComputerStatus).AntivirusSignatureVersion ){
   echo "定義ファイルは最新です。"   
}else{
   echo "定義ファイルを更新します。"

   # 更新処理
   Start-Process $cmd -Wait
}
------------------------------

定義ファイルは毎日更新されるようなので、タスクスケジューラーで毎日実行するように仕掛けておけばよい。

2017年6月23日金曜日

Windows Defenderの定義ファイルを手動で適用するスクリプトを作った

自宅の検証環境にWindows Server 2016を評価版としてインストールして使っているのだが、Windows Defenderの定義ファイルがうまく更新できないという事象が発生している(WSUS環境なので、WSUS側の問題かもしれない)。

そのため、不定期に定義ファイルをダウンロードして、手動で適用していたのだが、それすらも面倒にもなってきたし、セキュリティ的にも可能な限り定義ファイルは最新にしておきたいと考え、スクリプトを組んで自動化することにした。

手作業でやる場合

Windows Defenderの定義ファイルをダウンロード元は、以下URLとなる。

・Updating your Microsoft antimalware and antispyware software
https://www.microsoft.com/en-us/security/portal/definitions/adl.aspx

「Antimalware and antispyware updates」の項目に、Microsoftの各セキュリティ製品の定義ファイルの最新リンクが記載されているので、該当するものをクリックしてダウンロードする。Windows Server 2016であれば、「Windows Defender in Windows 10 and Windows 8.1 - 64bit」を選べばよい。


「mpam-fe.exe」というexeファイルがダウンロードされる(2017年6月時点で124MB)。このexeファイルをダブルクリックで実行するだけで、定義ファイルが更新される。

スクリプトでやる場合

手作業でやっていた作業を単純にPowerShellで実行するスクリプト「update-windefender.ps1」を作成し、タスクスケジューラで1日1回実行するようにした。動作はPowerShell 3.0で確認している。


シンプルなスクリプトではあるが、Windows版wgetのようなInvoke-WebRequestコマンドの存在を知ることができたり、久しぶりにPowerShellに触れたこともあって、なかなか楽しく作ることができた。

参考

・Defender Cmdlets
https://technet.microsoft.com/ja-jp/library/dn433280.aspx



2017年1月2日月曜日

PowerShellでWindowsのシステム情報やネットワーク・ディスクの情報を確認する方法

Windowsは昔からGUIベースのOSということもあって、コマンドでの設定確認は限界があるものと感じていた。しかし、Windowsもバージョンが上がり、PowerShellが搭載されるようになってから、ほぼすべての設定項目はPowerShellで確認できるようになった。

これを知っていると効率よくサーバー構築や設計書作成ができると感じたので以下に使えそうな設定確認コマンドをまとめてみる。なお、確認はWindows Server 2012 (無印)で実施した。

システム系

Windowsの役割と機能

GUIではサーバーマネージャーから確認できるが、コマンドでも確認可能。なお、Where-Object文を削除すれば、インストールされていない役割と機能を含めて一覧で表示される。

Get-WindowsFeature | Where-Object {$_.InstallState -eq "Installed"}
------------------------------
Display Name                                            Name                       Install State
------------                                            ----                       -------------
[X] Hyper-V                                             Hyper-V                        Installed
[X] ファイル サービスおよび記憶域サービス               FileAndStorage-Services        Installed
    [X] ファイル サービスおよび iSCSI サービス          File-Services                  Installed
        [X] ファイル サーバー                           FS-FileServer                  Installed
        [X] iSCSI ターゲット サーバー                   FS-iSCSITarget-Server          Installed
    [X] 記憶域サービス                                  Storage-Services               Installed
[X] .NET Framework 3.5 Features                         NET-Framework-Features         Installed
    [X] .NET Framework 3.5 (.NET 2.0 および 3.0 を含む) NET-Framework-Core             Installed
[X] .NET Framework 4.5 Features                         NET-Framework-45-Fea...        Installed
    [X] .NET Framework 4.5                              NET-Framework-45-Core          Installed
    [X] WCF サービス                                    NET-WCF-Services45             Installed
        [X] TCP ポート共有                              NET-WCF-TCP-PortShar...        Installed
[X] Media Foundation                                    Server-Media-Foundation        Installed
[X] Windows PowerShell                                  PowerShellRoot                 Installed
    [X] Windows PowerShell 3.0                          PowerShell                     Installed
    [X] Windows PowerShell 2.0 エンジン                 PowerShell-V2                  Installed
    [X] Windows PowerShell ISE                          PowerShell-ISE                 Installed
[X] WoW64 サポート                                      WoW64-Support                  Installed
[X] インクと手書きサービス                              InkAndHandwritingSer...        Installed
[X] グループ ポリシーの管理                             GPMC                           Installed
[X] マルチパス I/O                                      Multipath-IO                   Installed
[X] ユーザー インターフェイスとインフラストラクチャ     User-Interfaces-Infra          Installed
    [X] グラフィック管理ツールとインフラストラクチャ    Server-Gui-Mgmt-Infra          Installed
    [X] サーバー グラフィック シェル                    Server-Gui-Shell               Installed
    [X] デスクトップ エクスペリエンス                   Desktop-Experience             Installed
[X] リモート サーバー管理ツール                         RSAT                           Installed
    [X] 役割管理ツール                                  RSAT-Role-Tools                Installed
        [X] Hyper-V 管理ツール                          RSAT-Hyper-V-Tools             Installed
            [X] Hyper-V GUI 管理ツール                  Hyper-V-Tools                  Installed
            [X] Windows PowerShell 用 Hyper-V モジュ... Hyper-V-PowerShell             Installed
------------------------------

サービス

[管理ツール]→[サービス]で確認できる内容と同じ。

get-wmiobject win32_service | ft Name, StartMode, State, Status -AutoSize
------------------------------
Name                                         StartMode State   Status

----                                         --------- -----   ------
AeLookupSvc                                  Manual    Stopped OK
ALG                                          Manual    Stopped OK
AllUserInstallAgent                          Manual    Stopped OK
AppIDSvc                                     Manual    Stopped OK
Appinfo                                      Manual    Running OK
AppMgmt                                      Manual    Stopped OK
AudioEndpointBuilder                         Manual    Stopped OK
Audiosrv                                     Manual    Stopped OK
AxInstSV                                     Manual    Stopped OK
BFE                                          Auto      Running OK
BITS                                         Manual    Running OK

~以下略~

------------------------------

インストールプログラム

[コントロールパネル]→[プログラムと機能]で確認できる内容と同じ。

Get-WmiObject -Class Win32_Product | ft Name,Vendor,Version -AutoSize
------------------------------
Name                                                                        Vendor                Version
----                                                                        ------                -------
VMware Tools                                                                VMware, Inc.          10.0.9.3917699
Microsoft Security Client                                                   Microsoft Corporation 4.10.0207.0
Microsoft Visual C++ 2008 Redistributable - x64 9.0.30729.4148              Microsoft Corporation 9.0.30729.4148
Microsoft Visual C++ 2008 Redistributable - x64 9.0.21022                   Microsoft Corporation 9.0.21022

~以下略~
------------------------------

適用HotFix

Windowsの重要な更新やセキュリティアップデートの確認。

Get-HotFix
------------------------------
Source        Description      HotFixID      InstalledBy          InstalledOn
------        -----------      --------      -----------          -----------
T1115W212     Security Update  KB2727528     NT AUTHORITY\SYSTEM  2016/12/23 0:00:00
T1115W212     Security Update  KB2736693     NT AUTHORITY\SYSTEM  2016/08/22 0:00:00
T1115W212     Security Update  KB2742614     T1115W212\Adminis... 2016/08/20 0:00:00
T1115W212     Security Update  KB2742616     NT AUTHORITY\SYSTEM  2016/08/22 0:00:00
T1115W212     Update           KB2756872     NT AUTHORITY\SYSTEM  2016/08/22 0:00:00
T1115W212     Update           KB2758246     NT AUTHORITY\SYSTEM  2016/08/22 0:00:00
T1115W212     Update           KB2761094     NT AUTHORITY\SYSTEM  2016/08/22 0:00:00
T1115W212     Update           KB2764870     NT AUTHORITY\SYSTEM  2016/08/22 0:00:00
T1115W212     Update           KB2769034     T1115W212\Adminis... 2016/08/20 0:00:00
T1115W212     Update           KB2769165     T1115W212\Adminis... 2016/08/20 0:00:00
T1115W212     Update           KB2769166     NT AUTHORITY\SYSTEM  2016/08/22 0:00:00
T1115W212     Security Update  KB2770660     T1115W212\Adminis... 2016/08/20 0:00:00

~以下略~
------------------------------

コントロールパネル一覧

コントロールパネルに表示される項目の一覧。

Get-ControlPanelItem
------------------------------
Name                          CanonicalName                 Category                      Description
----                          -------------                 --------                      -----------
アクション センター           Microsoft.ActionCenter        {システムとセキュリティ}      最近のメッセージを確認し、...
管理ツール                    Microsoft.AdministrativeTools {システムとセキュリティ}      コンピューターの管理に関す...
自動再生                      Microsoft.AutoPlay            {ハードウェア}                CD、DVD およびデバイスの既...
色の管理                      Microsoft.ColorManagement     {すべてのコントロール パネ... 画面、スキャナーおよびプリ...
資格情報マネージャー          Microsoft.CredentialManager   {ユーザー アカウント}         Windows 資格情報を管理しま...
日付と時刻                    Microsoft.DateAndTime         {時計、言語、および地域}      日付、時刻とタイム ゾーン...
既定のプログラム              Microsoft.DefaultPrograms     {プログラム}                  Windows 上で、Web 閲覧、写...
デバイス マネージャー         Microsoft.DeviceManager       {すべてのコントロール パネ... ハードウェアの設定の表示と...
デバイスとプリンター          Microsoft.DevicesAndPrinters  {ハードウェア}                デバイス、プリンター、印刷...
ディスプレイ                  Microsoft.Display             {デスクトップのカスタマイ...  ディスプレイ設定を変更し、...
コンピューターの簡単操作セ... Microsoft.EaseOfAccessCenter  {コンピューターの簡単操作,... お使いのコンピューターを使...
フォルダー オプション         Microsoft.FolderOptions       {デスクトップのカスタマイズ}  ファイルやフォルダーの表示...
フォント                      Microsoft.Fonts               {デスクトップのカスタマイズ}  コンピューターのフォントを...
インターネット オプション     Microsoft.InternetOptions     {ネットワークとインターネ...  インターネットの表示と接続...
iSCSI イニシエーター          Microsoft.iSCSIInitiator      {すべてのコントロール パネ... リモート iSCSI ターゲット...
キーボード                    Microsoft.Keyboard            {すべてのコントロール パネ... カーソルの点滅速度や文字の...
言語                          Microsoft.Language            {時計、言語、および地域}      地域と言語の設定をカスタマ...
マウス                        Microsoft.Mouse               {すべてのコントロール パネ... ボタンの構成、ダブルクリッ...
MPIO                          Microsoft.MPIOConfiguration   {すべてのコントロール パネ... マルチパスのデバイスの MPI...
ネットワークと共有センター    Microsoft.NetworkAndSharin... {ネットワークとインターネ...  ネットワークの状態の確認、...
通知領域アイコン              Microsoft.NotificationArea... {すべてのコントロール パネ... 通知領域に表示するアイコン...
個人設定                      Microsoft.Personalization     {デスクトップのカスタマイズ}  このコンピューターの画像、...
電話とモデム                  Microsoft.PhoneAndModem       {すべてのコントロール パネ... 電話のダイヤル情報とモデム...
電源オプション                Microsoft.PowerOptions        {ハードウェア, システムと...  コンピューターの電源管理の...
プログラムと機能              Microsoft.ProgramsAndFeatures {プログラム}                  コンピューター上のプログラ...
地域                          Microsoft.RegionAndLanguage   {時計、言語、および地域}      言語、数値、時刻および日付...
RemoteApp とデスクトップ接続  Microsoft.RemoteAppAndDesk... {すべてのコントロール パネ... RemoteApp とデスクトップ接...
サウンド                      Microsoft.Sound               {ハードウェア}                オーディオ デバイスを構成...
同期センター                  Microsoft.SyncCenter          {すべてのコントロール パネ... このコンピューターとネット...
システム                      Microsoft.System              {システムとセキュリティ}      コンピューターの情報を表示...
タスク バー                   Microsoft.Taskbar             {デスクトップのカスタマイズ}  表示される項目の種類、項目...
音声合成                      Microsoft.TextToSpeech        {すべてのコントロール パネ... 音声合成と音声認識 (インス...
トラブルシューティング        Microsoft.Troubleshooting     {すべてのコントロール パネ... 一般的なコンピューターの問...
ユーザー アカウント           Microsoft.UserAccounts        {ユーザー アカウント}         このコンピューターを共有す...
Windows ファイアウォール      Microsoft.WindowsFirewall     {システムとセキュリティ}      ファイアウォール セキュリ...
Windows Update                Microsoft.WindowsUpdate       {システムとセキュリティ}      ソフトウェアやドライバーの...
Flash Player (32 ビット)                                    {システムとセキュリティ}      Flash Player の設定を管理
メール (32 ビット)                                          {ユーザー アカウント}         Microsoft Outlook プロファ...
------------------------------

イベントログ

とりあえず最近の100個のイベントログを確認するには以下の通り。なお、LogNameにはSystem、Application、Securityなどを選択する。

Get-EventLog -LogName system -Newest 100
------------------------------
   Index Time          EntryType   Source                 InstanceID Message
   ----- ----          ---------   ------                 ---------- -------
  116156 12 30 10:05   Information Service Control M...   1073748860 DPMRA サービスは 停止 状態に移行しました。
  116155 12 30 10:00   Information Service Control M...   1073748860 Device Setup Manager サービスは 停止 状態に移行...
  116154 12 30 10:00   Information Service Control M...   1073748860 Microsoft Software Shadow Copy Provider サービ...
  116153 12 30 10:00   Information Service Control M...   1073748860 DPMRA サービスは 実行中 状態に移行しました。
  116152 12 30 09:59   Information Service Control M...   1073748860 Windows Modules Installer サービスは 停止 状態...

~以下略~
------------------------------

Informationのログを省略し、エラーや警告ログだけを見たいのであれば、以下の通りにする。

Get-EventLog -LogName system -Newest 100 | Where-Object {$_.EntryType -match "Err|Warn"}
------------------------------
   Index Time          EntryType   Source                 InstanceID Message
   ----- ----          ---------   ------                 ---------- -------
  116150 12 30 09:58   Error       UmrdpService                 1111 プリンター Microsoft Print to PDF に必要なドラ...
  116149 12 30 09:58   Error       UmrdpService                 1111 プリンター HP ePrint + JetAdvantage に必要なド...
  116148 12 30 09:58   Error       UmrdpService                 1111 プリンター Foxit PhantomPDF Printer に必要なド...
  116114 12 30 09:05   Error       Ntfs                           55 ボリューム C: のファイル システム構造で破損が検...
  116113 12 30 09:05   Warning     Microsoft-Windows...           98 ソース 'Microsoft-Windows-Ntfs' のイベント ID '...

~以下略~
------------------------------

ネットワーク系

ネットワークアダプター一覧

Up、Downの状況やMacアドレスなどの確認。

Get-NetAdapter
------------------------------
Name                      InterfaceDescription                    ifIndex Status       MacAddress             LinkSpeed
----                      --------------------                    ------- ------       ----------             ---------
Ethernet1                 Intel(R) 82574L Gigabit Network Co...#2      13 Up           00-0C-29-AA-90-B7         1 Gbps
vEthernet (vSwitch1)      Hyper-V 仮想イーサネット アダプター #2       16 Up           00-0C-29-AA-90-B7        10 Gbps
------------------------------

ネットワークアダプターのプロパティ

[ネットワークアダプターのプロパティ]にて確認できる各種パラメータの確認。

Get-NetAdapterBinding
------------------------------
Name                           DisplayName                                        ComponentID          Enabled
----                           -----------                                        -----------          -------
Ethernet1                      Hyper-V 拡張可能仮想スイッチ                       vms_pp               True
Ethernet1                      Link-Layer Topology Discovery Responder            ms_rspndr            False
Ethernet1                      Link-Layer Topology Discovery Mapper I/O Driver    ms_lltdio            False
Ethernet1                      Microsoft Network Adapter Multiplexor Protocol     ms_implat            False
Ethernet1                      Microsoft ネットワーク用クライアント               ms_msclient          False
Ethernet1                      Windows ネットワーク仮想化フィルター ドライバー    ms_netwnv            False
Ethernet1                      QoS パケット スケジューラ                          ms_pacer             False
Ethernet1                      Microsoft ネットワーク用ファイルとプリンター共有   ms_server            False
Ethernet1                      インターネット プロトコル バージョン 6 (TCP/IPv6)  ms_tcpip6            False
Ethernet1                      インターネット プロトコル バージョン 4 (TCP/IPv4)  ms_tcpip             False
vEthernet (vSwitch1)           Hyper-V 拡張可能仮想スイッチ                       vms_pp               False
vEthernet (vSwitch1)           Link-Layer Topology Discovery Responder            ms_rspndr            True
vEthernet (vSwitch1)           Link-Layer Topology Discovery Mapper I/O Driver    ms_lltdio            True
vEthernet (vSwitch1)           Microsoft Network Adapter Multiplexor Protocol     ms_implat            False
vEthernet (vSwitch1)           Microsoft ネットワーク用クライアント               ms_msclient          True
vEthernet (vSwitch1)           Windows ネットワーク仮想化フィルター ドライバー    ms_netwnv            False
vEthernet (vSwitch1)           QoS パケット スケジューラ                          ms_pacer             True
vEthernet (vSwitch1)           Microsoft ネットワーク用ファイルとプリンター共有   ms_server            True
vEthernet (vSwitch1)           インターネット プロトコル バージョン 6 (TCP/IPv6)  ms_tcpip6            False
vEthernet (vSwitch1)           インターネット プロトコル バージョン 4 (TCP/IPv4)  ms_tcpip             True
------------------------------


ネットワークアダプタの構成の詳細

[ネットワークアダプターのプロパティ]→[構成]→[詳細]にて確認できる各種パラメータの確認。

Get-NetAdapterAdvancedProperty
------------------------------
Name                      DisplayName                    DisplayValue                   RegistryKeyword RegistryValue
----                      -----------                    ------------                   --------------- -------------
Ethernet1                 Flow Control                   Rx & Tx Enabled                *FlowControl    {3}
Ethernet1                 Interrupt Moderation           Enabled                        *InterruptMo... {1}
Ethernet1                 IPv4 Checksum Offload          Rx & Tx Enabled                *IPChecksumO... {3}
Ethernet1                 Jumbo Packet                   Disabled                       *JumboPacket    {1514}
Ethernet1                 Large Send Offload V2 (IPv4)   Enabled                        *LsoV2IPv4      {1}
Ethernet1                 Large Send Offload V2 (IPv6)   Enabled                        *LsoV2IPv6      {1}
Ethernet1                 RSS プロセッサの最大数         8                              *MaxRssProce... {8}
Ethernet1                 優先する NUMA ノード           システムの既定値               *NumaNodeId     {65535}
Ethernet1                 RSS キューの最大数             1 Queue                        *NumRssQueues   {1}
Ethernet1                 Priority & VLAN                Priority & VLAN Enabled        *PriorityVLA... {3}
Ethernet1                 Receive Buffers                256                            *ReceiveBuffers {256}
Ethernet1                 Receive Side Scaling           Enabled                        *RSS            {1}
Ethernet1                 RSS 基本プロセッサ数           0                              *RssBaseProc... {0}
Ethernet1                 Speed & Duplex                 Auto Negotiation               *SpeedDuplex    {0}
Ethernet1                 TCP Checksum Offload (IPv4)    Rx & Tx Enabled                *TCPChecksum... {3}
Ethernet1                 TCP Checksum Offload (IPv6)    Rx & Tx Enabled                *TCPChecksum... {3}
Ethernet1                 Transmit Buffers               512                            *TransmitBuf... {512}
Ethernet1                 UDP Checksum Offload (IPv4)    Rx & Tx Enabled                *UDPChecksum... {3}
Ethernet1                 UDP Checksum Offload (IPv6)    Rx & Tx Enabled                *UDPChecksum... {3}
Ethernet1                 Adaptive Inter-Frame Spacing   Disabled                       AdaptiveIFS     {0}
Ethernet1                 Interrupt Moderation Rate      Adaptive                       ITR             {65535}
Ethernet1                 Log Link State Event           Enabled                        LogLinkState... {51}
Ethernet1                 Gigabit Master Slave Mode      Auto Detect                    MasterSlave     {0}
Ethernet1                 Locally Administered Address   --                             NetworkAddress  {--}
Ethernet1                 Wait for Link                  Auto Detect                    WaitAutoNegC... {2}
vEthernet (vSwitch1)      IPv4 Checksum Offload          Rx & Tx Enabled                *IPChecksumO... {3}
vEthernet (vSwitch1)      IPsec Offload                  Auth Header and ESP Enabled    *IPsecOffloadV2 {3}
vEthernet (vSwitch1)      Jumbo Packet                   無効                           *JumboPacket    {1514}
vEthernet (vSwitch1)      Large Send Offload Version ... 有効                           *LsoV2IPv4      {1}
vEthernet (vSwitch1)      Large Send Offload Version ... 有効                           *LsoV2IPv6      {1}
vEthernet (vSwitch1)      TCP Checksum Offload (IPv4)    Rx & Tx Enabled                *TCPChecksum... {3}
vEthernet (vSwitch1)      TCP Checksum Offload (IPv6)    Rx & Tx Enabled                *TCPChecksum... {3}
vEthernet (vSwitch1)      UDP Checksum Offload (IPv4)    Rx Enabled                     *UDPChecksum... {2}
vEthernet (vSwitch1)      UDP Checksum Offload (IPv6)    Rx Enabled                     *UDPChecksum... {2}
vEthernet (vSwitch1)      ネットワーク アドレス          --                             NetworkAddress  {--}
------------------------------

ディスク系

物理ディスク

[サーバーマネージャー]→[ファイルサービスと記憶域サービス]→[ディスク]で確認できる内容と同じ。

Get-Disk
------------------------------
Number Friendly Name                            OperationalStatus                    Total Size Partition Style
------ -------------                            -----------------                    ---------- ---------------
0      VMware Virtual disk SCSI Disk Device     Online                                    50 GB MBR
1      MSFT Virtual HD  Multi-Path Disk Device  Offline 
------------------------------

ボリューム

[サーバーマネージャー]→[ファイルサービスと記憶域サービス]→[ボリューム]で確認できる内容と同じ。

Get-Volume
------------------------------
DriveLetter       FileSystemLabel  FileSystem       DriveType        HealthStatus        SizeRemaining             Size
-----------       ---------------  ----------       ---------        ------------        -------------             ----
                  システムで予約済み        NTFS             Fixed            Healthy                   94.2 MB           350 MB
C                                  NTFS             Fixed            Healthy                  15.16 GB         49.66 GB
A                                                   Removable        Healthy                       0 B              0 B
D                                                   CD-ROM           Healthy                       0 B              0 B
------------------------------



人気の投稿