【PowerShell 6.0】スクリプトの作り方【設定編】【Part.1】

一般ユーザーは業務でも趣味でも 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」を選択します。

【PowerShell】スクリプトの作り方

 

 

 

 

 

【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」コマンドを実行します。

【PowerShell】スクリプトの作り方

 

 

 

AWS の場合は下図のようにセキュリティグループの設定で「TCP/5985」のポートを開けておきます。

【PowerShell】スクリプトの作り方

 

 

 

リモートコンピュータへのアクセス【New-PSSession】

リモートコンピュータにアクセスするためには、ローカルコンピュータ上で「PowerShell」を起動し、以下のように「New-PSSession」コマンドを実行します。

C:\Users\xxxxxx> New-PSSession -ComputerName ec2-xxxxxxxxxxxxx.ap-northeast-1.compute.amazonaws.com 
 
 Id Name            ComputerName    State         ConfigurationName     Availability 
 — —-            ————    —–         —————–     ———— 
  7 Session7        ec2-xxxxxxx… Opened        Microsoft.PowerShell     Available 
 
 
PS C:\Users\xxxxxx>

 

 

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>]

 
PS C:\Users\xxxxxx>

 

 

 

 

 

エラー集【FullyQualifiedErrorId : ServerNotTrusted,PSSessionOpenFailed】

「New-PSSession」コマンドでエラーになった場合に以下のようにエラーメッセージが出力されます。

 

「認証スキームが Kerberos と異なる場合、またはクライアント コンピューターがドメインに参加していない場合は、 HTTPS トランスポートを使用するか、または宛先コンピューターが TrustedHosts 構成設定に追加されている必要があります。 TrustedHosts を構成するには winrm.cmd を使用します。」

Windows PowerShell 
Copyright (C) 2013 Microsoft Corporation. All rights reserved. 
 
PS C:\Users\xxxx> $s = New-PSSession -ComputerName ec2-xxxxxxxxxx.ap-northeast-1.compute.amazonaws.com 
New-PSSession : [ec2-xxxxxxxxxxxxxxxxxxxxxxxxxx.amazonaws.com] リモート サーバー ec2-xxxxxxxxxxxxxxxxxxx.ap-northeast-1.compute.amazonaws.com への接続に失敗し、次のエラー メッセージが返されました: WinRM クライアントは要求を処理できません。認証スキームが Kerberos と異なる場合、またはクライアント コンピューターがドメインに参加していない場合は、 HTTPS トランスポートを使用するか、または宛先コンピューターが TrustedHosts 構成設定に追加されている必要があります。 TrustedHosts を構成するには winrm.cmd を使用します。TrustedHosts 一覧に含まれるコンピューターは認証されていない可能性があります。 
 winrm help config コマンドを実行すると、詳細が表示されます。詳細については、about_Remote_Troubleshooting のヘルプ トピックを参照してください。 
発生場所 行:1 文字:6 
+ $s = New-PSSession -ComputerName xxxxxxxxxxxxxxxxxxxxxxxx.ap-northeast-1.compute.amazon … 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo          : OpenError: (System.Manageme….RemoteRunspace:RemoteRunspace) [New-PSSession], PSRemotingTransportException 
    + FullyQualifiedErrorId : ServerNotTrusted,PSSessionOpenFailed

 

 

PowerShell 画面です。

【PowerShell 6.0】スクリプトの作り方【設定編】【Part.1】

 

 

 

■解決策

TrustedHosts にリモートコンピュータを追加します。

 

最初に「Get-Item」コマンドで現在の状態を確認します。

PS C:\Users\xxxx> Get-Item WSMan:\localhost\Client\TrustedHosts ← TrustedHosts の情報を確認します。 
 
WinRM サービスの起動 
WinRM サービスは現在起動していません。このコマンドを実行すると、WinRM サービスが起動します。 
 
続行しますか? 
[Y] はい(Y)  [N] いいえ(N)  [S] 中断(S)  [?] ヘルプ (既定値は “Y”): Y 
 
 
   WSManConfig: Microsoft.WSMan.Management\WSMan::localhost\Client 
 
Type            Name                           SourceOfValue   Value 
—-            —-                           ————-   —– 
System.String   TrustedHosts 
 
 
PS C:\Users\xxxx> Get-Item WSMan:\localhost\Client\TrustedHosts ← 再度 TrustedHosts の情報を確認します。
 
 
   WSManConfig: Microsoft.WSMan.Management\WSMan::localhost\Client 
 
Type            Name                           SourceOfValue   Value 
—-            —-                           ————-   —– 
System.String   TrustedHosts 
 
 
PS C:\Users\xxxx>

 

 

 

次に「Set-Item」コマンドで TrustedHosts に追加します。

PS C:\Users\xxxxxx> Set-Item WSMan:\localhost\Client\TrustedHosts -Value ec2-xxxxxxxxxxxxx.ap-northeast-1.compute.amazonaws.com 
 
WinRM セキュリティの構成。 
このコマンドは WinRM クライアントの TrustedHosts の一覧を変更します。TrustedHosts 
の一覧内にあるコンピューターは認証されない可能性があります。クライアントはこれらのコンピューターに資格情報を送信する可 
能性があります。この一覧を変更しますか? 
[Y] はい(Y)  [N] いいえ(N)  [S] 中断(S)  [?] ヘルプ (既定値は “Y”): Y

 

 

再度「Get-Item」コマンドで情報を取得します。

PS C:\Users\xxxxxx> Get-Item WSMan:\localhost\Client\TrustedHosts 
 
 
   WSManConfig: Microsoft.WSMan.Management\WSMan::localhost\Client 
 
Type            Name                           SourceOfValue   Value 
—-            —-                           ————-   —– 
System.String   TrustedHosts                                   ec2-xxxxxxxxxxxxx.ap-northeast-1.compute.amazonaws.com 
 
 
PS C:\Users\xxxxxx>

 

 

複数のホストをまとめて信頼する場合は「*(アスタリスク)」で指定も可能です。

※ただしセキュリティが低くなるので注意しましょう。

PS C:\Users\xxxxxx> Set-Item WSMan:\localhost\Client\TrustedHosts -Value * 
 
WinRM セキュリティの構成。 
このコマンドは WinRM クライアントの TrustedHosts の一覧を変更します。TrustedHostsの一覧内にあるコンピューターは認証されない可能性があります。クライアントはこれらのコンピューターに資格情報を送信する可能性があります。この一覧を変更しますか? 
[Y] はい(Y)  [N] いいえ(N)  [S] 中断(S)  [?] ヘルプ (既定値は “Y”): Y 
PS C:\Users\xxxxxx>

 

 

 

再度「Get-Item」コマンドで情報を取得します。

PS C:\Users\xxxxxx> Get-Item WSMan:\localhost\Client\TrustedHosts 
 
 
   WSManConfig: Microsoft.WSMan.Management\WSMan::localhost\Client 
 
Type            Name                           SourceOfValue   Value 
—-            —-                           ————-   —– 
System.String   TrustedHosts                                   * ← Value が「*」になっている。 
 
 
PS C:\Users\xxxxxx>

 

 

 

 

 

エラー集【FullyQualifiedErrorId : WinRMOperationTimeout,PSSessionOpenFailed】

ファイアウォールでブロックされている場合に表示されます。

 

「指定したコンピューター名が有効であること、コンピューターにネットワーク経由でアクセスできること、および WinRM サービスのファイアウォールの例外が有効になっていてこのコンピューターからアクセスできることを確認してください。」

PS C:\Users\xxxxxx> $s = New-PSSession -ComputerName ec2-xxxxxxxxxxxxx.ap-northeast-1.compute.amazonaws.com 
New-PSSession : [ec2-xxxxxxxxxxxxx.ap-northeast-1.compute.amazonaws.com] リモート サーバー ec2-xxxxxxxxxxxxx.ap-northeast-1.compute.amazonaws.com への接続に失敗し、次のエラー メッセージが返されました: WinRM は処理を完了できません。 指定したコンピューター名が有効であること、コンピューターにネットワーク経由でアクセスできること、および WinRM サービスのファイアウォールの例外が有効になっていてこのコンピューターからアクセスできることを確認してください。 既定では、パブリック プロファイルの WinRM ファイウォールの例外によって、同一のローカル サブネット内のリモート コンピューターへのアクセスは制限されます。詳細については、about_Remote_Troubleshooting のヘルプ トピックを参照してください。 
発生場所 行:1 文字:6 
+ $s = New-PSSession -ComputerName ec2-xxxxxxxxxxxxx.ap-northeast-1.compute.amazon … 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo          : OpenError: (System.Manageme….RemoteRunspace:RemoteRunspace) [New-PSSession], PSRemotingTransportException 
    + FullyQualifiedErrorId : WinRMOperationTimeout,PSSessionOpenFailed 
PS C:\Users\xxxxxx>

 

■解決方法

ファイアウォールの設定を見直します。

 

 

エラー集【FullyQualifiedErrorId : AccessDenied,PSSessionOpenFailed】

ローカルコンピュータとリモートコンピュータで、同じ「アカウント」と「パスワード」が設定されていないことが原因です。

 

「xxxxxxxxxxxxxへの接続に失敗し、次のエラー メッセージが返されました: アクセスが拒否されました。詳細については、about_Remote_Troubleshooting のヘルプ トピックを参照してください。」

PS C:\Users\xxxxxx> $s = New-PSSession -ComputerName ec2-xxxxxxxxxxxxx.ap-northeast-1.compute.amazonaws.com 
New-PSSession : [ec2-xxxxxxxxxxxxx.ap-northeast-1.compute.amazonaws.com] リモート サーバー ec2-xxxxxxxxxxxxx.ap-northeast-1.compute.amazonaws.com への接続に失敗し、次のエラー メッセージが返されました: アクセスが拒否されました。詳細については、about_Remote_Troubleshooting のヘルプ トピックを参照してください。 
発生場所 行:1 文字:6 
+ $s = New-PSSession -ComputerName ec2-xxxxxxxxxxxxx.ap-northeast-1.compute.amazon … 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo          : OpenError: (System.Manageme….RemoteRunspace:RemoteRunspace) [New-PSSession], PSRemotingTransportException 
    + FullyQualifiedErrorId : AccessDenied,PSSessionOpenFailed 
PS C:\Users\xxxxxx>

 

 

■解決方法

ローカルコンピュータとリモートコンピュータで、同じ「アカウント」と「パスワード」を設定します。

 

 

別のアカウント(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 
 
 Id Name            ComputerName    State         ConfigurationName     Availability 
 — —-            ————    —–         —————–     ———— 
 12 Session12       ec2-xxxxxxxxx.. Opened        Microsoft.PowerShell     Available 
 
 
PS C:\Users\xxxx>

 

 

 

■個人アカウント(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 
 
 Id Name            ComputerName    State         ConfigurationName     Availability 
 — —-            ————    —–         —————–     ———— 
  3 Session3        ec2-xxxxxxxx… Opened        Microsoft.PowerShell     Available 
 
 
PS C:\Users\xxxxxx>

 

 

 

参考にした技術書

以下の各技術書は、現在インフラ構成管理で利用する PowerShell スクリプトを作成するために読んで勉強している書籍です。

 

この技術書を読んで、PowerShell が「Linux」で具体的にどのように利用できるかを知りました。

また、基本的な構文(if、switch、while、for、foreach 文など)を非常に細かく解説しています。インターネットで調べれば英語での情報が出てきますが、日本語でここまで細かく解説している技術書はなかなかないため重宝しています。

PowerShell実践ガイドブック ~クロスプラットフォーム対応の次世代シェルを徹底解説~

 

 

「PowerShell 実践システム管理ガイド」という題名の通り、具体的にどのように PowerShell で複数台のサーバーのシステム管理をするのか、具体的なコマンドを詳細に解説しています。

Windows PowerShell実践システム管理ガイド 第3版 (TechNet ITプロシリーズ)

 

 

PowerShell で CSV ファイルや Excel を処理するスクリプトが詳しく解説されているので勉強になります。

うごかして学ぶWindows PowerShell

 

 

過去の 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】