PowershellスクリプトにてWindowsServerバックアップを行う
WindowsServer標準機能であるWindowsServerバックアップを利用し、Powershellスクリプトで稼働中サーバのシステムバックアップを取得する方法についてです。
1. 動作確認環境
- WindowsServer 2012R2 Std
- Powershell 4.0
2. 前提条件
- バックアップ対象サーバに"WindowsServerバックアップ"の機能がインストールされていること。
WindowsServer2012であれば、以下の手順で機能を追加可能です。
- タスクバー等からサーバマネージャを起動。
- [管理] - [役割と機能の追加]を選択。
- [開始する前に]で[次へ]を押下。
- [インストールの種類]で"役割ベースまたは機能ベースのインストール"を選択し、[次へ]を押下。
- [サーバーの選択]で対象サーバを選択し、[次へ]を押下。
- [サーバーの役割]で[次へ]を押下(何も選択しない)。
- [機能]で[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) バックアップポリシーの作成および設定
バックアップを開始する前に、まず「バックアップポリシー」を作成し、バックアップ対象や回復方法、バックアップ先などをポリシーとして指定する必要があります。今回は具体的に以下の手順でバックアップポリシーを作成および設定します。
- 空のバックアップポリシーを作成("New-WBPolicy")
- バックアップ対象として、「システム状態」を指定し、ポリシーに追加("Add-WBSystemState")
- 回復方法として、「ベアメタル回復」を指定し、ポリシーに追加("Add-WBBareMetalRecovery")
- バックアップ先として、「ローカルディスク」または「ネットワーク共有」を指定し、ポリシーに追加("New-WBBackupTarget", "Add-WBBackupTarget")
- VSSバックアップオプションとして「VSSコピー」を選択し、ポリシーに追加("Set-WBVssBackupOptions")
VSSでバックアップを取得する際の方法として、「VSSフルバックアップ」と「VSSコピーバックアップ」があります。これらの違いは、「バックアップ後にアプリケーションログを削除するかしないか」ということです。
ではアプリケーションログって何?って話ですが、具体的にはVSSに対応するアプリケーション(SQL ServerやExchange 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となり、何も表示されません。
大量のリモートサーバ(複数ドメイン)にファイルを配布する
300台程度のサーバー(複数ドメイン)にフォルダ・ファイルを配布する必要性が出てきたので作成。
1. 動作確認環境
- WindowsServer 2012R2 Std
- Powershell4.0
2. やりたいこと
- 別ドメインのリモートサーバの任意のフォルダ配下にフォルダ・ファイルを配布したい
- 配布先の指定にはUNCパスを用いたい(管理共有機能を用いる)
3. 処理の流れ
以下の処理を配布する資材単位で実行する。
一括して大量のサーバに資材を配布する場合は、CSVファイル等を作成し、配布先サーバ情報やログイン資格情報、配布資材情報を定義し、順次処理するようにすると良い。
- "net use"コマンドで配布先サーバの管理共有リソースにリモート接続
- "Copy-Item"コマンドレットで配布先サーバに資材配布
- "Get-ChildItem"コマンドレットで資材配布結果確認
- "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
実装方法
実装例は以下の通り。例外処理は省略。
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"の方の手順を英訳すると以下の通り。
- Preferences > Browse Packages… メニューをクリック
- Explorerで1つ上位のフォルダに移動して、"Installed Packages/"フォルダに移動
- "Package Control.sublime-package"をDLして、"Installed Packages/"フォルダに配置
- SublimeTextを再起動
3. SublimeTextのProxy設定(必要に応じて)
今後PackageをインストールしたりするときにSublimeTextからHTTPアクセスが発生するので、必要に応じてProxy設定を入れておく。
- メニューから、Preferences > Package Settings > Package Control > Settings - User を選択
- 以下の設定を追記して保存、SublimeTextの再起動
{ "http_proxy": "http://[proxyserver]:[port]", "proxy_username": "[user]", "proxy_password": "[pass]" }
これで、Package Controlを使用する準備が完了。
4. PowerShellパッケージのインストール
- SublimeTextにて、[Ctrl] + [Shift] + P でCommand Paletteを開く
- "Package Control:Install"を選択
- "PowerShell"で検索してパッケージを選択、インストール
- SublimeTextを再起動(再起動後にエラーメッセージが出たらもう一回再起動)
これで、SublimeTextでPowershellのカラースキーマが適用されるようになります。
5. Rictyフォントのインストール
下記URLを参考に、RictyフォントをWin7にインストール。
Windows環境にRictyフォントをインストールする - Qiita
MacTypeを入れないとアンチエイリアスが効かず、フォントサイズが小さい場合に日本語等の表示が一部欠けたりするので注意。*1
6. "ConvertToUTF8"パッケージのインストール
SublimeText3はSJISに対応していないため、SJISを正常に表示させるために、"ConvertToUTF8"パッケージをインストールする。
- SublimeTextにて、[Ctrl] + [Shift] + P でCommand Paletteを開く
- "Package Control:Install"を選択
- "ConvertToUTF8"で検索してパッケージを選択、インストール
- 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のインベントリ情報を収集する方法を纏めてみた。
動作確認環境は以下の通り。
- WindowsServer 2012R2
- Powershell 4.0
基本的に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
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
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ファイルを操作する
PowershellでCSVファイルを読込む場合は、"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-CsvはCSVファイルの先頭行をヘッダーとして自動的にオブジェクトプロパティに設定してくれるので、上記のようにある列の値のみを取得する、などといったことが簡単に実現できる。
また、Where-Objectを用いればある条件に合致する行を抽出可能。