PowershellスクリプトにてWindowsServerバックアップを行う

WindowsServer標準機能であるWindowsServerバックアップを利用し、Powershellスクリプトで稼働中サーバのシステムバックアップを取得する方法についてです。

1. 動作確認環境

2. 前提条件

  • バックアップ対象サーバに"WindowsServerバックアップ"の機能がインストールされていること。

WindowsServer2012であれば、以下の手順で機能を追加可能です。

  1. タスクバー等からサーバマネージャを起動。
  2. [管理] - [役割と機能の追加]を選択。
  3. [開始する前に]で[次へ]を押下。
  4. [インストールの種類]で"役割ベースまたは機能ベースのインストール"を選択し、[次へ]を押下。
  5. [サーバーの選択]で対象サーバを選択し、[次へ]を押下。
  6. [サーバーの役割]で[次へ]を押下(何も選択しない)。
  7. [機能]で[Windows Server バックアップ]を選択し、[次へ]を押下。

3. WindowsServerバックアップ機能の概要

今回実装するスクリプトではWindowsServerバックアップ機能を使用しますので、簡単に内容について復習しておきます。

(1) WindowsServerバックアップとは?
  • WindowsServer2008以降における標準バックアップツール(2003以前はNTBackup)
  • ボリュームシャドーコピーサービス(VSS)とブロックレベルのバックアップテクノロジにより、OS、ファイル、フォルダ、ボリュームのバックアップと回復を行う
  • 毎回完全バックアップを取得する以外に、初回のみ完全バックアップを取得し、後は増分バックアップを自動的に取得することも可能*1
  • バックアップ先として、内蔵・外部HDD、ネットワーク共有、光メディア(DVD等)、リムーバルメディア、WindowsAzureを指定可能(テープは不可)
  • バックアップ先ディスクはバックアップ専用として構成しても良いし、そうでなくとも良い*2
  • バックアップから特定の項目(ファイルやフォルダ)のみを復元することが可能
  • インストールメディア(DVD/ISO)を用いてバックアップからベアメタル回復が可能
(2) WindowsServer2012からサポートされた機能
  • バックアップファイルの形式がVHDからVHDXに変更
  • 2TBを超えるボリュームのバックアップをサポート
  • ファイルシステムとしてReFSをサポート(従来はNTFSのみ)
  • バックアップ先にWindows Azureを指定可能(その他に、内蔵・外部HDD、ネットワーク共有、光メディア(DVD等)、リムーバルメディアを指定可能)
  • Hyper-Vバックアップ機能を強化

4. 実現したいこと

今回実装するスクリプトでは、以下の要件を実現することとします。

  • 稼働中サーバのオンラインバックアップ(システム状態)を取得したい
  • 完全バックアップを1世代取得したい
  • バックアップ先はローカルディスクまたはネットワーク共有フォルダとしたい

5. バックアップ処理の流れ

今回実装するバックアップスクリプトの大まかな処理の流れは以下の通りです。

  1. バックアップポリシーの作成および設定
  2. バックアップの開始
  3. バックアップジョブの終了判定
  4. バックアップの結果判定
(1) バックアップポリシーの作成および設定

バックアップを開始する前に、まず「バックアップポリシー」を作成し、バックアップ対象や回復方法、バックアップ先などをポリシーとして指定する必要があります。今回は具体的に以下の手順でバックアップポリシーを作成および設定します。

  1. 空のバックアップポリシーを作成("New-WBPolicy")
  2. バックアップ対象として、「システム状態」を指定し、ポリシーに追加("Add-WBSystemState")
  3. 回復方法として、「ベアメタル回復」を指定し、ポリシーに追加("Add-WBBareMetalRecovery")
  4. バックアップ先として、「ローカルディスク」または「ネットワーク共有」を指定し、ポリシーに追加("New-WBBackupTarget", "Add-WBBackupTarget")
  5. VSSバックアップオプションとして「VSSコピー」を選択し、ポリシーに追加("Set-WBVssBackupOptions")

VSSでバックアップを取得する際の方法として、「VSSフルバックアップ」と「VSSコピーバックアップ」があります。これらの違いは、「バックアップ後にアプリケーションログを削除するかしないか」ということです。

ではアプリケーションログって何?って話ですが、具体的にはVSSに対応するアプリケーション(SQL ServerExchange Server)のトランザクションログ等を指しているとのことです。VSSフルバックアップを行うとバックアップ後にログは切り詰められ、VSSコピーバックアップではそのまま残る、という動作になります。

どう使い分けるのか?というと、もしサードパーティー製バックアップソフトとWindowsServerバックアップ機能を併用する場合、VSSフルバックアップを行うと、バックアップ後にログが削除されてしまうため、サードパーティー製バックアップソフトが差分または増分バックアップを取得するためにそれらのログに依存する場合、当然影響を受けてしまう、ということですね。

詳しくはTechNet Blogに記載があります。
http://blogs.technet.com/b/filecab/archive/2008/05/21/what-is-the-difference-between-vss-full-backup-and-vss-copy-backup-in-windows-server-2008.aspx

そもそもVSSって何?という方は、下記を参考にしてください。
https://msdn.microsoft.com/en-us/library/windows/desktop/bb968832%28v=vs.85%29.aspx

(2) バックアップの開始

上記(1)で作成したバックアップポリシーを使用して、バックアップを開始します。

今回はスクリプトを実行する度に1世代の完全バックアップを取得するため、バックアップ開始には"Start-WBBackup"コマンドレットを使用します。このコマンドレットは1回のみのバックアップ操作を行う際に用います。

コマンドレットの"-Policy"オプションの引数に設定済みのバックアップポリシーを指定します。また、今回は完全に非対話形式でバックアップを実行するため、確認プロンプトを表示しない"-Force"オプションと、バックアップ開始後即座に制御をPowershellに戻す"-Async"オプションも合わせて指定します。

また、バックアップジョブ終了判定のため、バックアップ開始直後に"Get-WBJob"コマンドレットを実行し、結果を取得しておきます。"Get-WBJob"コマンドレットはオプションなしで実行した場合、現在実行中のバックアップジョブの情報を取得できます。

(3) バックアップジョブの終了判定

"Start-WBBackup"で開始したバックアップはジョブとしてバックグラウンド処理されます。今回はバックアップ完了後に終了状態を判定するため、バックアップジョブの完了を待つ必要があります。

バックアップジョブの完了を判定するため、"Get-WBJob"コマンドレットを用いて、以下の条件を満たすかどうかを定期的に確認するようにします。

  • "Get-WBJob -Previous 1"(完了した前回のバックアップジョブ情報)の実行結果の"StartTime"と、上記(2)で取得した"Get-WBJob"の"StartTime"が一致する
(4) バックアップの結果判定

バックアップが完了したことを確認したら、バックアップが成功したか否かを判定します。

"Get-WBJob -Previous 1"(完了した前回のバックアップジョブ情報)の"HResult"が"0"であれば成功、それ以外であれば失敗となります。

6. スクリプト実装例

下記に実装例を示します。(エラー処理等は省略)

# バックアップイメージ格納先ボリューム
# バックアップイメージは"<DriveLetter>:\WindowsImageBackup\<hostname>"配下に格納される
$dst_path = "D:"

# バックアップポリシーの作成
$wb_policy = New-WBPolicy
# バックアップ元としてシステム状態をポリシーに設定
Add-WBSystemState -Policy $wb_policy
# 回復方法としてベアメタルバックアップをポリシーに設定
Add-WBBareMetalRecovery -Policy $wb_policy
# バックアップ先をポリシーに設定(ローカルディスクの場合)
Add-WBBackupTarget -Policy $wb_policy (New-WBBackupTarget -VolumePath $dst_path) -Force
# VSSバックアップオプションとしてVSSコピーバックアップを指定
Set-WBVssBackupOptions -Policy $wb_policy -VssCopyBackup

# バックアップ実行
Start-WBBackup -Policy $wb_policy -Force -Async
# バックアップジョブ開始時の状態を取得
$start_job_state = Get-WBJob

# 前回のバックアップジョブを取得
$last_job_state = Get-WBJob -Previous 1

# バックアップジョブが完了するまで待つ
while ($start_job_state.StartTime -ne $last_job_state.StartTime) {
    Start-Sleep -s 30
    $last_job_state = Get-WBJob -Previous 1
}

# バックアップ結果判定
if ($last_job_state.HResult -eq 0) {
    # バックアップジョブ正常終了
    exit 0
} else {
    # バックアップジョブ異常終了
    exit -1
}

参考(Get-WBJobの実行結果)

WindowsServerバックアップ中にGet-WBJobを実行すると、以下の様な結果が得られます。

PS > Get-WBJob


JobType          : Backup
StartTime        : 2015/03/22 18:26
EndTime          :
JobState         : Running
CurrentOperation : 2 個のうち 2 個目のボリューム (89%)。
HResult          : 0
DetailedHResult  : 0
ErrorDescription :
JobItems         : {VolumeList, SystemState, BareMetalRecovery}
VersionId        : 03/22/2015-09:26
SuccessLogPath   :
FailureLogPath   :

現在実行中のバックアップの進行状況が確認可能です。

また、バックアップ完了後に"Get-WBJob -Previous 1"を実行すると、以下の結果となります。

PS > Get-WBJob -Previous 1


JobType          : Backup
StartTime        : 2015/03/22 18:26
EndTime          : 2015/03/22 18:35
JobState         : Completed
CurrentOperation :
HResult          : 0
DetailedHResult  : 0
ErrorDescription :
JobItems         : {VolumeList, SystemState, BareMetalRecovery}
VersionId        : 03/22/2015-09:26
SuccessLogPath   : C:\Windows\Logs\WindowsServerBackup\Backup-22-03-2015_09-26-09.log
FailureLogPath   : C:\Windows\Logs\WindowsServerBackup\Backup_Error-22-03-2015_09-26-09.log

バックアップジョブ履歴が存在しない場合、上記結果は$nullとなり、何も表示されません。

*1:バックアップ先にネットワーク共有を指定した場合は世代管理不可

*2:2008ではバックアップ専用ディスクが必須だったが、2008R2から専用ディスクは不要

大量のリモートサーバ(複数ドメイン)にファイルを配布する

300台程度のサーバー(複数ドメイン)にフォルダ・ファイルを配布する必要性が出てきたので作成。

1. 動作確認環境

  • WindowsServer 2012R2 Std
  • Powershell4.0

2. やりたいこと

  • ドメインのリモートサーバの任意のフォルダ配下にフォルダ・ファイルを配布したい
  • 配布先の指定にはUNCパスを用いたい(管理共有機能を用いる)

3. 処理の流れ

以下の処理を配布する資材単位で実行する。

一括して大量のサーバに資材を配布する場合は、CSVファイル等を作成し、配布先サーバ情報やログイン資格情報、配布資材情報を定義し、順次処理するようにすると良い。

  1. "net use"コマンドで配布先サーバの管理共有リソースにリモート接続
  2. "Copy-Item"コマンドレットで配布先サーバに資材配布
  3. "Get-ChildItem"コマンドレットで資材配布結果確認
  4. "net use /delete"コマンドでリモート接続削除

4. 実装例

以下に実装例を示す。(例外処理は割愛)

# 配布先サーバFQDN or IPアドレス
$remote_server = "sampleserver01.hoge.local"
# リモート接続マウントポイント
$mount_point = "\\$hostname\d$"
# ローカルサーバ上の配布元資材格納先フォルダ
$src_path = "D:\work\installer\*"
# 配布先サーバ上の資材格納先フォルダ
$dst_path = "$mount_point\tmp\installer\"
# ログインユーザ
$user = "hoge\admin01"
# ログインパス
$pass = "password"

# 1. 配布先サーバの管理共有リソースにリモート接続
net use $mount_point ("/user:$user") $pass
# 2. 配布先サーバに資材配布
Invoke-Expression ("Copy-Item $src_path $dst_path -Force -Recurse")
# 3. 資材配布結果確認
Get-ChildItem $dst_path
# 4. リモート接続削除
net use /delete $mount_point


上記例では、ローカルサーバの"D:\work\installer"配下の全てのフォルダ・ファイルを、再帰的に配布先サーバの"D:\tmp\installer"フォルダ配下へコピーしている("Copy-Item"コマンドレットの"-Recurse"オプションを使用)。

上記例のインプットパラメータを予めCSVファイル等の外部ファイルに記載しておけば、それを入力として大量のサーバに任意の資材を配布できる。

他にも良い方法がありそうだけどとりあえずこれで事足りたので・・・。

Powershellスクリプトにてメールを送信する

今回は、.NetFrameworkのSystem.Net.Mail 名前空間 ()に定義された各クラスを用いてPowershellからメール送信できるようにした。

動作環境

今回動作確認をした環境は以下の通り。
以下のレジストリ値から、.NetFrameworkのバージョンは4.5.1だと分かる。
方法 : インストールされている .NET Framework バージョンを確認する

PS > Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" Release

Release      : 378675
PSPath       : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4
PSChildName  : Full
PSDrive      : HKLM
PSProvider   : Microsoft.PowerShell.Core\Registry

PS > $PSVersionTable

Name                           Value
----                           -----
PSVersion                      4.0
WSManStackVersion              3.0
SerializationVersion           1.1.0.1
CLRVersion                     4.0.30319.34014
BuildVersion                   6.3.9600.17090
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0}
PSRemotingProtocolVersion      2.2

使用するクラス

System.Net.Mail名前空間で定義されたクラスのうち、今回使用するのは以下の3つ。

Attachmentクラスはメールに添付ファイルを付けたい場合のみ使用する。

実装方法

実装例は以下の通り。例外処理は省略。

Function Send-Mail([string]$subject, [string]$body, [string]$from_address, [string]$to_address, [string]$smtp_server, [string]$smtp_port, [string]$attached_file, [string]$password)
{
    # SMTPクライアントオブジェクトの生成
    $client = New-Object Net.Mail.SmtpClient($smtp_server, $smtp_port)
    # SMTPクライアントのSSL使用を無効化
    $client.EnableSsl = $false
    # SMTP送信者アカウント認証
    if ($password -ne $null) {
        $client.Credentials = New-Object System.Net.NetworkCredential($from_address, $password)
    }
    
    # メールメッセージオブジェクトの生成
    $message = New-Object Net.Mail.MailMessage($from_address, $to_address, $subject, $body)
    
    # 添付ファイルの付与
    if ($attached_file -ne $null) {
        $filepath = @(Get-ChildItem $attached_file)
        $attachment = New-Object Net.Mail.Attachment($filepath)
        $message.Attachments.Add($attachment)
    }

    # メール送信
    $client.Send($message)
}

その他の方法

上記の方法以外に、Powershellの"Send-MailMessage"コマンドレットでもメール送信が可能となっている。
Send-MailMessage

SublimeText3でPowershellコーディング環境を整備@Win7

Windows7端末上で、SublimeText3を使用するPowershellコーディング環境を整えたので、手順をメモ。

1. SublimeText3のインストール

まず、下記URLからインストーラをDL。
Sublime Text - Download

インストーラを実行するとバイナリの保存先とかいくつか設定を聞かれるので、適当に設定して[Install]ボタンをクリックしてインストール完了。

2. Package Controlのインストール

下記URLを参照してPackage Controlをインストール。
Installation - Package Control

"Simple"の方法でも"Manual"の方法でもどちらでも良い。"Simple"の方の手順はProxy認証が必要な環境ではうまくいかないので、自分はいったん"Manual"の手順でインストール。

一応、"Manual"の方の手順を英訳すると以下の通り。

  1. Preferences > Browse Packages… メニューをクリック
  2. Explorerで1つ上位のフォルダに移動して、"Installed Packages/"フォルダに移動
  3. "Package Control.sublime-package"をDLして、"Installed Packages/"フォルダに配置
  4. SublimeTextを再起動

3. SublimeTextのProxy設定(必要に応じて)

今後PackageをインストールしたりするときにSublimeTextからHTTPアクセスが発生するので、必要に応じてProxy設定を入れておく。

  1. メニューから、Preferences > Package Settings > Package Control > Settings - User を選択
  2. 以下の設定を追記して保存、SublimeTextの再起動
{
    "http_proxy": "http://[proxyserver]:[port]",
    "proxy_username": "[user]",
    "proxy_password": "[pass]"
}

これで、Package Controlを使用する準備が完了。

4. PowerShellパッケージのインストール

  1. SublimeTextにて、[Ctrl] + [Shift] + P でCommand Paletteを開く
  2. "Package Control:Install"を選択
  3. "PowerShell"で検索してパッケージを選択、インストール
  4. SublimeTextを再起動(再起動後にエラーメッセージが出たらもう一回再起動)

これで、SublimeTextでPowershellのカラースキーマが適用されるようになります。

5. Rictyフォントのインストール

下記URLを参考に、RictyフォントをWin7にインストール。
Windows環境にRictyフォントをインストールする - Qiita

MacTypeを入れないとアンチエイリアスが効かず、フォントサイズが小さい場合に日本語等の表示が一部欠けたりするので注意。*1

6. "ConvertToUTF8"パッケージのインストール

SublimeText3はSJISに対応していないため、SJISを正常に表示させるために、"ConvertToUTF8"パッケージをインストールする。

  1. SublimeTextにて、[Ctrl] + [Shift] + P でCommand Paletteを開く
  2. "Package Control:Install"を選択
  3. "ConvertToUTF8"で検索してパッケージを選択、インストール
  4. SublimeTextを再起動

7. 最後に

ライセンスコードを入れないと保存時に「SublimeTextのライセンス買ってね!」ってたまに言われる。未登録状態でもそれ以外はフル機能使えるので、非常に良心的かと。しばらく使ってみて非常に使い勝手が良いのでライセンス買おうかな。

*1:MacTypeを動作させているとOracle VirtualBoxが正常に動作しない事象を確認。その他のソフトウェアとも干渉する可能性があるので注意。

Powershellでリモートサーバに対するL3レベルのネットワーク疎通を確認する

リモートサーバとの疎通確認をPowershellスクリプト内で行いたい場合、
"Test-Connection"コマンドレットを用いると使い勝手が良い。

基本的な使用方法

PS > Test-Connection -ComputerName "dstserver01"

Source        Destination     IPV4Address      IPV6Address                              Bytes    Time(ms)
------        -----------     -----------      -----------                              -----    --------
srcserver01   dstserver01     192.168.0.11                                              32       0
srcserver01   dstserver01     192.168.0.11                                              32       0
srcserver01   dstserver01     192.168.0.11                                              32       0
srcserver01   dstserver01     192.168.0.11                                              32       0

"-ComputerName"オプションには名前解決可能なホスト名かIPアドレスを文字列で指定する。

pingコマンドと同様に、ICMPを用いてリモートサーバとの疎通を確認するのだが、違いは結果がテキストではなくPSObjectで返却されるということ。そのため、疎通確認結果をPowershellスクリプト内で扱うことが容易になる。

通常の出力は例の如く一部情報が省略されているため、Format-Listで返却結果の全てのプロパティを参照してみる。

PS > Test-Connection -ComputerName "dstserver01" | fl *

PSComputerName                 : srcserver01
IPV4Address                    : 192.168.0.10
IPV6Address                    :
__GENUS                        : 2
__CLASS                        : Win32_PingStatus
__SUPERCLASS                   :
__DYNASTY                      : Win32_PingStatus
__RELPATH                      : Win32_PingStatus.Address="dstserver01",BufferSize=32,NoFragmentation=FALSE,RecordRou
                                 te=0,ResolveAddressNames=FALSE,SourceRoute="",SourceRouteType=0,Timeout=4000,Timestamp
                                 Route=0,TimeToLive=80,TypeofService=0
__PROPERTY_COUNT               : 24
__DERIVATION                   : {}
__SERVER                       : srcserver01
__NAMESPACE                    : root\cimv2
__PATH                         : \\srcserver01\root\cimv2:Win32_PingStatus.Address="dstserver01",BufferSize=32,NoFr
                                 agmentation=FALSE,RecordRoute=0,ResolveAddressNames=FALSE,SourceRoute="",SourceRouteTy
                                 pe=0,Timeout=4000,TimestampRoute=0,TimeToLive=80,TypeofService=0
Address                        : dstserver01
BufferSize                     : 32
NoFragmentation                : False
PrimaryAddressResolutionStatus : 0
ProtocolAddress                : 192.168.0.10
ProtocolAddressResolved        :
RecordRoute                    : 0
ReplyInconsistency             : False
ReplySize                      : 32
ResolveAddressNames            : False
ResponseTime                   : 0
ResponseTimeToLive             : 128
RouteRecord                    :
RouteRecordResolved            :
SourceRoute                    :
SourceRouteType                : 0
StatusCode                     : 0
Timeout                        : 4000
TimeStampRecord                :
TimeStampRecordAddress         :
TimeStampRecordAddressResolved :
TimestampRoute                 : 0
TimeToLive                     : 80
TypeofService                  : 0
Scope                          : System.Management.ManagementScope
Path                           : \\srcserver01\root\cimv2:Win32_PingStatus.Address="dstserver01",BufferSize=32,NoFr
                                 agmentation=false,RecordRoute=0,ResolveAddressNames=false,SourceRoute="",SourceRouteTy
                                 pe=0,Timeout=4000,TimestampRoute=0,TimeToLive=80,TypeofService=0
Options                        : System.Management.ObjectGetOptions
ClassPath                      : \\srcserver01\root\cimv2:Win32_PingStatus
Properties                     : {Address, BufferSize, NoFragmentation, PrimaryAddressResolutionStatus...}
SystemProperties               : {__GENUS, __CLASS, __SUPERCLASS, __DYNASTY...}
Qualifiers                     : {dynamic, provider}
Site                           :
Container                      :

上記の通り、結果は"Win32_PingStatus"クラスオブジェクトである。各プロパティの詳細は下記参照のこと。
Win32_PingStatus class (Windows)

疎通確認結果をシンプルにbool値で取得したい場合

Powershellスクリプト内で詳細な疎通確認結果を参照する必要が無く、単純にリモートサーバへの疎通可否をbool値で取得したい場合もある。そういった場合は、"-Quiet"オプションを付与すると良い。

PS > Test-Connection -Computername "dstserver01" -Quiet
True

上記の場合、既定の回数(4回)だけICMPエコー要求をリモートサーバへ送信し、1回でもエコー応答を受信すれば、結果としてTrueを返却する。全て応答が無ければ、Falseが返却される。リモートサーバへエコー要求を送信する回数は"-Count"オプションで変更できる。

その他の詳細情報

TechNetのコマンドレットリファレンスを参照のこと。
Test-Connection

PowershellでWindowsServerのインベントリ情報を収集する

はじめに

PowershellでWindowsServerのインベントリ情報を収集する方法を纏めてみた。
動作確認環境は以下の通り。

基本的にPowershellコマンドレットを用いた情報取得方法を記載するが、一部WMIオブジェクトを用いた方法も併せて記載した。

各コマンドレットを単に実行した場合、表示される情報は一部省略されてしまうため、すべての情報を表示したい場合は、"Format-List"コマンドレットに実行結果(PSオブジェクト)をパイプする必要がある。

PS > Get-NetIPAddress | Format-List *

ちなみに、Format-Listには"fl"というエイリアスが設定されているため、以下の様に実行しても同じ結果が得られる。

PS > Get-NetIPAddress | fl *

インベントリ情報収集

1. PSバージョン確認

PS > $PSVersionTable

Name                           Value
----                           -----
PSVersion                      4.0
WSManStackVersion              3.0
SerializationVersion           1.1.0.1
CLRVersion                     4.0.30319.34014
BuildVersion                   6.3.9600.17090
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0}
PSRemotingProtocolVersion      2.2

2. PSプロバイダ一覧取得

PS > Get-PSProvider

Name                 Capabilities                                      Drives
----                 ------------                                      ------
Alias                ShouldProcess                                     {Alias}
Environment          ShouldProcess                                     {Env}
FileSystem           Filter, ShouldProcess, Credentials                {C, D, A, Z}
Function             ShouldProcess                                     {Function}
Registry             ShouldProcess, Transactions                       {HKLM, HKCU}
Variable             ShouldProcess                                     {Variable}

3. エイリアス一覧取得

PS > Get-Alias

CommandType     Name                                               ModuleName
-----------     ----                                               ----------
Alias           % -> ForEach-Object
Alias           ? -> Where-Object
Alias           ac -> Add-Content
Alias           asnp -> Add-PSSnapin
Alias           cat -> Get-Content
Alias           cd -> Set-Location
Alias           chdir -> Set-Location
Alias           clc -> Clear-Content
...

または、

PS > Get-ChildItem Alias:

4. 環境変数一覧取得

PS > Get-ChildItem env:

Name                           Value
----                           -----
ALLUSERSPROFILE                C:\ProgramData
APPDATA                        C:\Users\testuser01\AppData\Roaming
CLIENTNAME                     testserver01
CommonProgramFiles             C:\Program Files\Common Files
CommonProgramFiles(x86)        C:\Program Files (x86)\Common Files
CommonProgramW6432             C:\Program Files\Common Files
...

5. 特殊変数一覧取得

PS > Get-ChildItem Variable:

Name                           Value
----                           -----
$                              env:
?                              True
^                              GEt-ChildItem
args                           {}
ConfirmPreference              High
ConsoleFileName
DebugPreference                SilentlyContinue
...

6. Windowsエディション取得

PS > Get-WindowsEdition -Online


Edition : ServerStandard

または、

PS > Get-WmiObject Win32_OperatingSystem | % { $_.caption }
Microsoft Windows Server 2012 R2 Standard

7. ローカルユーザアカウント一覧取得

PS > Get-WmiObject Win32_UserAccount | ? { $_.LocalAccount -eq $true }


AccountType : 512
Caption     : testserver01\Administrator
Domain      : testserver01
SID         : S-1-5-21-1912470519-2430121858-3842388152-500
FullName    :
Name        : Administrator
...

"$_.LocalAccount -eq $false"とすると、ドメインユーザアカウントが得られる。

8. ローカルグループアカウント一覧取得

PS > Get-WmiObject Win32_Group | ? { $_.LocalAccount -eq $true }

Caption                       Domain                        Name                          SID
-------                       ------                        ----                          ---
MP-NDMGS-MG01\Access Contr... testserver01                  Access Control Assistance ... S-1-5-32-579
MP-NDMGS-MG01\Administrators  testserver01                  Administrators                S-1-5-32-544
...

"$_.LocalAccount -eq $false"とすると、ドメイングループアカウントが得られる。

9. コンピュータ名取得

PS > $env:COMPUTERNAME
testserver01

10. ドメイン名取得

PS > $env:USERDNSDOMAIN
HOGE.LOCAL

または、

PS > $env:USERDOMAIN
HOGE

11. ネットワークアダプタ一覧取得

PS > Get-NetAdapter

Name                      InterfaceDescription                    ifIndex Status       MacAddress             LinkSpeed
----                      --------------------                    ------- ------       ----------             ---------
Management                vmxnet3 Ethernet Adapter #2                  13 Up           00-50-56-B7-2D-36         1 Gbps
Service                   vmxnet3 Ethernet Adapter                     12 Up           00-50-56-B7-23-B2         1 Gbps
...

12. ネットワークアダプタ詳細設定取得

PS > Get-NetAdapterAdvancedProperty

Name                      DisplayName                    DisplayValue                   RegistryKeyword RegistryValue
----                      -----------                    ------------                   --------------- -------------
Management                Interrupt Moderation           Enabled                        *InterruptMo... {1}
Management                IPv4 Checksum Offload          Rx & Tx Enabled                *IPChecksumO... {3}
Management                Jumbo Packet                   Standard 1500                  *JumboPacket    {1514}
Management                IPv4 TSO Offload               Enabled                        *LsoV1IPv4      {1}
Management                Large Send Offload V2 (IPv4)   Enabled                        *LsoV2IPv4      {1}
Management                Large Send Offload V2 (IPv6)   Enabled                        *LsoV2IPv6      {1}
Management                Maximum number of RSS Proce... --                             *MaxRssProce... {--}
Management                Priority / VLAN tag            Priority & VLAN Enabled        *PriorityVLA... {3}
Management                Receive Side Scaling           Disabled                       *RSS            {0}
Management                RSS Base Processor Number      --                             *RssBaseProc... {--}
Management                Speed & Duplex                 1.0 Gbps Full Duplex           *SpeedDuplex    {6}
Management                TCP Checksum Offload (IPv4)    Rx & Tx Enabled                *TCPChecksum... {3}
Management                TCP Checksum Offload (IPv6)    Rx & Tx Enabled                *TCPChecksum... {3}
Management                UDP Checksum Offload (IPv4)    Rx & Tx Enabled                *UDPChecksum... {3}
Management                UDP Checksum Offload (IPv6)    Rx & Tx Enabled                *UDPChecksum... {3}
Management                Wake on magic packet           Enabled                        *WakeOnMagic... {1}
Management                Wake on pattern match          Enabled                        *WakeOnPattern  {1}
Management                Enable adaptive rx ring sizing Enabled                        EnableAdapti... {1}
Management                Wake-on-LAN                    Enabled                        EnableWakeOnLan {1}
Management                Rx Ring #1 Size                --                             MaxRxRing1Le... {--}
Management                Rx Ring #2 Size                --                             MaxRxRing2Le... {--}
Management                Max Tx Queues                  --                             MaxTxQueues     {--}
Management                Tx Ring Size                   --                             MaxTxRingLength {--}
Management                MAC Address                    --                             NetworkAddress  {--}
Management                Large Rx Buffers               --                             NumRxBuffers... {--}
Management                Small Rx Buffers               --                             NumRxBuffers... {--}
Management                Offload IP Options             Enabled                        OffloadIpOpt... {1}
Management                Offload TCP Options            Enabled                        OffloadTcpOp... {1}
Management                Offload tagged traffic         Enabled                        OffloadVlanE... {1}
Management                Receive Throttle               --                             RxThrottle      {--}
Management                VLAN ID                        --                             VlanId          {--}
...

13. ネットワークアダプタバインディング取得

PS > Get-NetAdapterBinding

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

14. IPアドレス一覧取得

PS > Get-NetIPAddress

IPAddress         : 192.168.0.1
InterfaceIndex    : 13
InterfaceAlias    : Management
AddressFamily     : IPv4
Type              : Unicast
PrefixLength      : 16
PrefixOrigin      : Manual
SuffixOrigin      : Manual
AddressState      : Preferred
ValidLifetime     : Infinite ([TimeSpan]::MaxValue)
PreferredLifetime : Infinite ([TimeSpan]::MaxValue)
SkipAsSource      : False
PolicyStore       : ActiveStore
...

15. IP詳細設定取得

PS > Get-NetIpConfiguration

InterfaceAlias       : Management
InterfaceIndex       : 13
InterfaceDescription : vmxnet3 Ethernet Adapter #2
NetProfile.Name      : 識別されていないネットワーク
IPv4Address          : 192.168.0.1
IPv4DefaultGateway   :
DNSServer            :
...

16. ルーティングテーブル取得

PS > Get-NetRoute

または、

Get-WmiObject Win32_IP4RouteTable

17. パーティション一覧取得

PS > Get-Volume

または、

PS > Get-WmiObject Win32_Volume

18. 物理ディスク一覧取得

PS > Get-Disk

Number Friendly Name                            OperationalStatus                    Total Size Partition Style
------ -------------                            -----------------                    ---------- ---------------
1      VMware Virtual disk SCSI Disk Device     Online                                   200 GB MBR
0      VMware Virtual disk SCSI Disk Device     Online                                   100 GB MBR
...

または、

PS > Get-PhysicalDisk

FriendlyName        CanPool             OperationalStatus   HealthStatus        Usage                              Size
------------        -------             -----------------   ------------        -----                              ----
PhysicalDisk1       False               OK                  Healthy             Auto-Select                      200 GB
PhysicalDisk0       False               OK                  Healthy             Auto-Select                      100 GB
...

19. FWプロファイル取得

PS > Get-NetFirewallProfile

Name                            : Domain
Enabled                         : True
DefaultInboundAction            : NotConfigured
DefaultOutboundAction           : NotConfigured
AllowInboundRules               : NotConfigured
AllowLocalFirewallRules         : NotConfigured
AllowLocalIPsecRules            : NotConfigured
AllowUserApps                   : NotConfigured
AllowUserPorts                  : NotConfigured
AllowUnicastResponseToMulticast : NotConfigured
NotifyOnListen                  : False
EnableStealthModeForIPsec       : NotConfigured
LogFileName                     : %systemroot%\system32\LogFiles\Firewall\pfirewall.log
LogMaxSizeKilobytes             : 4096
LogAllowed                      : False
LogBlocked                      : False
LogIgnored                      : NotConfigured
DisabledInterfaceAliases        : {NotConfigured}
...

20. FWポリシー一覧取得

PS > Get-NetFirewallRule

21. 役割と機能一覧取得

PS > 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
...

22. インストール済みアプリケーション一覧取得

PS > Get-WmiObject Win32_Product

IdentifyingNumber : {26A24AE4-039D-4CA4-87B4-2F03217065FF}
Name              : Java 7 Update 65
Vendor            : Oracle
Version           : 7.0.650
Caption           : Java 7 Update 65
...

23. サービス一覧取得

PS > Get-Service

Status   Name               DisplayName
------   ----               -----------
Stopped  AdtAgent           Microsoft Monitoring Agent Audit Fo...
...

または、

PS > Get-WmiObject Win32_Service

24. Hotfix一覧取得

PS > Get-Hotfix

Source        Description      HotFixID      InstalledBy          InstalledOn
------        -----------      --------      -----------          -----------
testserver01  Security Update  KB2868626     testserver01\Adm...  2014/07/09 0:00:00
testserver01  Update           KB2880289     NT AUTHORITY\SYSTEM  2014/09/11 0:00:00
...

PowershellでCSVファイルを操作する

PowershellCSVファイルを読込む場合は、"Import-Csv"コマンドレットを用いる。

例えば、下記のCSVファイル(server.csv)を読込む場合を考える。

Powershellでは、以下の様にCSVファイルを読込むことが出来る。

Import-Csv 'servers.csv'

実行結果は以下の通り。

hostname      os                         version
--------      --                         -------
server1       ReHat Enterprise Linux     6.5
server2       Windows Server             2012R2

1レコードずつ繰り返し処理を行う場合は、ForEach-Objectを用いる。

Import-CsvCSVファイルの先頭行をヘッダーとして自動的にオブジェクトプロパティに設定してくれるので、上記のようにある列の値のみを取得する、などといったことが簡単に実現できる。

また、Where-Objectを用いればある条件に合致する行を抽出可能。