一般ユーザーは業務でも趣味でも Windows を利用する場合はグラフィカルインタフェース(GUI)でインターネットにアクセスしたり、メールの送受信をしたり Microsoft Office を利用するのが基本です。
しかし PowerShell を利用することで「システム管理者」はサーバー系の Windows Server(Windows Server 2008、Window Server 2012、Windows Server 2016など)を効率よく運用管理できるようになります。
特にサーバー数百台、数千台規模を運用しているエンタプライズ系の企業では Linux 系だけでなく Windows 系のサーバーもスクリプトで運用管理できるようにする必要があります。
以前の PowerShell 関連の記事は以下を参照してください。
【PowerShell 6】Windows 7、Windows 2016への PowerShell 6 インストール手順
【PowerShell 6.0】スクリプトの作り方【設定編】【Part.1】
【PowerShell 6.0】スクリプトの作り方【作成編】【Part.2】
【PowerShell 6.0】スクリプトの作り方【実行編】【Part.3】
PowerShellとは?
PowerShellとは「.Net Framework」と統合されている新しいコマンドラインシェルで、「コマンドプロンプト(cmd)」の延長ではなく、「.Net Framework」のオブジェクトまで操作できます。
PowerShell は Windows Server 2008 から標準搭載されています。
PowerShell と Windows Script Host(WSH)の違いとは?
PowerShell では、以下の環境で作成したスクリプト(バッチ)も動かすことができます。
- コマンドプロンプト環境で作成したスクリプト
- Windows Script Host(WSH)環境で作成したスクリプト
PowerShell は Linux でも利用可能
PowerShell(PowerShell 6.0)は、Windows だけでなく以下の Linux ディストリビューションで利用できます。
- Ubuntu 17 以降
- Ubuntu 16 以降
- Ubuntu 14.04 以降
- Debian 8.7 以降
- Debian 9
- CentOS 7
- RedHat Enterprise Linux 7
- OpenSUSE 42.2
- Fedora 25
- Fedora 26
検証環境
AWS の EC2 インスタンスを利用して検証します。
AWS 管理コンソールにログインし、「インスタンスの作成」ボタンをクリックして下図のように「コミュニティ AMI」を選択します。
検索欄に「Microsoft Windows Server 2016 Japanese」と入力して検索します。
検索結果より「Windows Server 2016 Japanese Full Base」を選択します。
【Windows 7】【Windows Server 2016】PowerShell 6.0.3 をインストールする手順
Windows 7 と Windows Server 2016 に「PowerShell 6.0.3」をインストールする手順です。
【PowerShell 6】Windows 7、Windows 2016への PowerShell 6 インストール手順
PowerShell のコマンドレット(Cmdlet)
コマンドレット(Cmdlet)とは、PowerShell で利用できるコマンド(命令)のことを言います。
.NET 言語(C# や F#)で開発されています。
「コマンド」と「コマンドレット」の違い
- コマンドプロンプトで利用するコマンド(dir、cd など)
- PowerShell で利用するコマンド(Get-ChilItem、Set-Location など)
結論から言えば、「コマンド」も「コマンドレット」も一緒です。
ただ、コマンドレットには分かりやすい特徴があり、「Get-xxx」や「Set-xxx」などのように形式が決まっています。
PowerShell のコマンドレットの形式
PowerShell のコマンドレットの形式は英語の構文と似ていて、「動詞 – 名詞」という表現で統一されています。
先に「動詞」が来て、その後に「名詞」で作業対象を指定します。
動詞カテゴリ コマンドレット 説明
Get Get-Acl ファイルやレジストリキーなどのリソースのセキュリティ情報を取得します。
Get-ChildItem フォルダやレジストリなど、指定したロケーションからの項目を表示します。
Get-Help コマンドレットのヘルプを表示します。
Get-Command コマンドレットの一覧を表示します。
Set Set-ExecutionPolicy PowerShellの実行ポリシーを設定します。
Set-Alias コマンドレットやその他のコマンド要素に別名を作成または変更します。
Add Add-Content 指定した項目やファイルに内容を追加します。
Add-History 現在のセッション中に入力されたコマンド一覧にエントリを追加します。
Remove Remove-Item 指定した項目を削除します。
New New-Alias 新しい別名を作成します。
Format Format-List コマンド出力の一覧を書式設定します。
「WinRM」サービスが実行しているか確認する
リモートコンピューターで PowerShell スクリプトを実行する場合は、リモートコンピュータ上で「WinRM」サービスが起動している必要があります。
以下の「Get-Service winrm」コマンドで「WinRM」サービスが起動しているか確認することができます。
※「Status」が「Running」となっているのでサービスは起動中であることが分かります。
リモートの WinRM サービスを利用するためには「TCP/5985」を開けておく
リモートコンピュータにアクセスして WinRM サービスを利用するためにはリモートコンピュータの「TCP/5985」を開けておく必要があります。
デフォルトでは「5985番ポート」で設定されていますが、念のために「WinRM」サービスが「TCP/5985」を利用しているか確認します。
リモートコンピュータ上で以下のように「Get-Item WSMan:\localhost\Listener\*\Port」コマンドを実行します。
AWS の場合は下図のようにセキュリティグループの設定で「TCP/5985」のポートを開けておきます。
リモートコンピュータへのアクセス【New-PSSession】
リモートコンピュータにアクセスするためには、ローカルコンピュータ上で「PowerShell」を起動し、以下のように「New-PSSession」コマンドを実行します。
C:\Users\xxxxxx> New-PSSession -ComputerName ec2-xxxxxxxxxxxxx.ap-northeast-1.compute.amazonaws.com |
New-PSSession の構文
New-PSSession の構文は以下のコマンドでも確認することができます。
PS C:\Users\xxxxxx> Get-Command New-PSSession -Syntax New-PSSession [[-ComputerName] <string[]>] [-Credential <pscredential>] [-Name <string[]>] [-EnableNetworkAccess] [-Port <int>] [-UseSSL] [-ConfigurationName <string>] [-ApplicationName <string>] [-ThrottleLimit <int>] [-SessionOption <PSSessionOption>] [-Authentication <AuthenticationMechanism>] [-CertificateThumbprint <string>] [<CommonParameters>]
New-PSSession [-ConnectionUri] <uri[]> [-Credential <pscredential>] [-Name <string[]>] [-EnableNetworkAccess] [-ConfigurationName <string>] [-ThrottleLimit <int>] [-AllowRedirection] [-SessionOption <PSSessionOption>] [-Authentication <AuthenticationMechanism>] [-CertificateThumbprint <string>] [<CommonParameters>]
New-PSSession [[-Session] <PSSession[]>] [-Name <string[]>] [-EnableNetworkAccess] [-ThrottleLimit <int>] [<CommonParameters>]
|
エラー集【FullyQualifiedErrorId : ServerNotTrusted,PSSessionOpenFailed】
「New-PSSession」コマンドでエラーになった場合に以下のようにエラーメッセージが出力されます。
「認証スキームが Kerberos と異なる場合、またはクライアント コンピューターがドメインに参加していない場合は、 HTTPS トランスポートを使用するか、または宛先コンピューターが TrustedHosts 構成設定に追加されている必要があります。 TrustedHosts を構成するには winrm.cmd を使用します。」
Windows PowerShell |
PowerShell 画面です。
■解決策
TrustedHosts にリモートコンピュータを追加します。
最初に「Get-Item」コマンドで現在の状態を確認します。
PS C:\Users\xxxx> Get-Item WSMan:\localhost\Client\TrustedHosts ← TrustedHosts の情報を確認します。 |
次に「Set-Item」コマンドで TrustedHosts に追加します。
PS C:\Users\xxxxxx> Set-Item WSMan:\localhost\Client\TrustedHosts -Value ec2-xxxxxxxxxxxxx.ap-northeast-1.compute.amazonaws.com |
再度「Get-Item」コマンドで情報を取得します。
PS C:\Users\xxxxxx> Get-Item WSMan:\localhost\Client\TrustedHosts |
複数のホストをまとめて信頼する場合は「*(アスタリスク)」で指定も可能です。
※ただしセキュリティが低くなるので注意しましょう。
PS C:\Users\xxxxxx> Set-Item WSMan:\localhost\Client\TrustedHosts -Value * |
再度「Get-Item」コマンドで情報を取得します。
PS C:\Users\xxxxxx> Get-Item WSMan:\localhost\Client\TrustedHosts |
エラー集【FullyQualifiedErrorId : WinRMOperationTimeout,PSSessionOpenFailed】
ファイアウォールでブロックされている場合に表示されます。
「指定したコンピューター名が有効であること、コンピューターにネットワーク経由でアクセスできること、および WinRM サービスのファイアウォールの例外が有効になっていてこのコンピューターからアクセスできることを確認してください。」
PS C:\Users\xxxxxx> $s = New-PSSession -ComputerName ec2-xxxxxxxxxxxxx.ap-northeast-1.compute.amazonaws.com |
■解決方法
ファイアウォールの設定を見直します。
エラー集【FullyQualifiedErrorId : AccessDenied,PSSessionOpenFailed】
ローカルコンピュータとリモートコンピュータで、同じ「アカウント」と「パスワード」が設定されていないことが原因です。
「xxxxxxxxxxxxxへの接続に失敗し、次のエラー メッセージが返されました: アクセスが拒否されました。詳細については、about_Remote_Troubleshooting のヘルプ トピックを参照してください。」
PS C:\Users\xxxxxx> $s = New-PSSession -ComputerName ec2-xxxxxxxxxxxxx.ap-northeast-1.compute.amazonaws.com |
■解決方法
ローカルコンピュータとリモートコンピュータで、同じ「アカウント」と「パスワード」を設定します。
別のアカウント(Administrator or 個人アカウント)とパスワードでセッションを張りたい場合
ローカルコンピュータの「アカウント」と「パスワード」をリモートにも同じように設定できればいいですが、出来ない場合は「-Credential」オプションを付けて、以下のようにコマンドを実行します。
オプション「-Credential」の後にアカウント名「Administrator」を記載します。
PS C:\Users\xxxxx> New-PSSession -Credential “Administrator” -ComputerName ec2-18-179-31-19.ap-northeast-1.compute.amazonaws.com |
コマンドを入力して「Enter」キーを押下すると、下図のようにログイン画面が表示れます。
パスワードを入力して「OK」ボタンをクリックします。
以下のようにセッションが張られます。
PS C:\Users\xxxx> New-PSSession -Credential “Administrator” -ComputerName ec2-xxxxxxxx.ap-northeast-1.compute.amazonaws.com |
■個人アカウント(test)の場合
PS C:\Users\xxxxx> New-PSSession -Credential “test” -ComputerName ec2-xxxxxxxxxxxxxxxxxx.ap-northeast-1.compute.amazonaws.com |
以下のように認証画面が表示されるので「ユーザー名」、「パスワード」を入力し「OK」ボタンをクリックします。
以下のようにセッションが張られることを確認します。
PS C:\Users\xxxxxx> New-PSSession -Credential “test” -ComputerName ec2-xxxxxxxxxxxxxxxx.ap-northeast-1.compute.amazonaws.com |
参考にした技術書
以下の各技術書は、現在インフラ構成管理で利用する PowerShell スクリプトを作成するために読んで勉強している書籍です。
この技術書を読んで、PowerShell が「Linux」で具体的にどのように利用できるかを知りました。
また、基本的な構文(if、switch、while、for、foreach 文など)を非常に細かく解説しています。インターネットで調べれば英語での情報が出てきますが、日本語でここまで細かく解説している技術書はなかなかないため重宝しています。
PowerShell実践ガイドブック ~クロスプラットフォーム対応の次世代シェルを徹底解説~
「PowerShell 実践システム管理ガイド」という題名の通り、具体的にどのように PowerShell で複数台のサーバーのシステム管理をするのか、具体的なコマンドを詳細に解説しています。
Windows PowerShell実践システム管理ガイド 第3版 (TechNet ITプロシリーズ)
PowerShell で CSV ファイルや Excel を処理するスクリプトが詳しく解説されているので勉強になります。
過去の PowerShell の記事
以前の PowerShell 関連の記事は以下を参照してください。
【PowerShell 6】Windows 7、Windows 2016への PowerShell 6 インストール手順
【PowerShell 6.0】スクリプトの作り方【設定編】【Part.1】
【PowerShell 6.0】スクリプトの作り方【作成編】【Part.2】
【PowerShell 6.0】スクリプトの作り方【実行編】【Part.3】
コメント