• 【MVA 解説編】System Center と Windows Azure を使用したハイブリッド クラウドへの移行(01 監視、管理、および運用)

    ※ この投稿は Windows Azure Advent Calender に参加しています。

    System Center は言うまでもなくマイクロソフトの運用管理製品です。最新版は System Center 2012 R2 です。

    System Center を使用すると、オンプレミスのインフラストラクチャーに加えて、Windows Azure に展開したインフラストラクチャーやアプリケーションも管理、監視できます。

    以下のコースウェアでは、System Center を使用して Windows Azure を含むハイブリッドクラウド環境を管理することを学習することができます。

    System Center と Windows Azure を使用したハイブリッド クラウドへの移行ジャンプ スタート
    http://www.microsoftvirtualacademy.com/training-courses/38d1d8c0-240e-432b-994c-ab34e71088b6#?fbid=pJeqjxv8UId

    各モジュールにはテストも用意されていますが、解説が無いので、このBLOGで各問の開設をしたいと思います。

    今回は「01 | 監視、管理、および運用」について。System Center の基本的な機能について学習しましょう。

    Q) System Center Operations Manager を使用して、クラウドに展開した WEB アプリケーションの可用性とパフォーマンスを監視する必要があります。次のうちどの Operations Manager の機能を使用しますか。

    1. Windows の管理パック
    2. ネットワーク デバイスの監視
    3. Hyper-V の管理パック
    4. .NET と JEE のアプリケーション パフォーマンス監視

    System Center 2012 には新たに APM(Appliation Performance Monitoring)が実装されました。これは以前 AVICode と呼ばれていたもので、マイクロソフトが買収し System Center に組み込んだものです。

    APM を使用すると、.NET Framework または JEE(Java Enterprise Edition)で開発されたアプリケーションを監視することができます。

    System Center Operations Manager 2012: 簡単に監視機能を拡張する
    http://technet.microsoft.com/ja-jp/magazine/hh825624.aspx

    Monitoring .NET Applications
    http://technet.microsoft.com/en-us/library/hh212856.aspx

    Monitoring Java Applications
    http://technet.microsoft.com/ja-jp/library/hh212856.aspx

    もちろん、アプリケーションが Windows Azure に展開されていても監視可能です。

    Q) System Center Operations Manager を使用して、クラウド ファブリックを監視する必要があります。次のうちどの Operations Manager の機能を使用しますか。

    1. ネットワーク デバイスの監視
    2. レポート ビューとダッシュボード ビュー
    3. 通知配信登録
    4. Windows、Hyper-V、および Virtual Machine Manager の管理パック

    これは特に迷うことはないと思います。ファブリックを監視するわけですから、物理レイヤ、仮想レイヤを統合的に監視できなければなりません。

    よって、4. が正解です。

    Oprations Manager には「管理パック」と呼ばれる監視用のアドインが用意されています。

    管理パックは製品や機能ごとに用意されており、この問の場合にはOS用の管理パック、物理レイヤを監視するHyper-V管理パック、仮想レイヤを監視するVMM管理パックを使用します。

    Fabric Monitoring
    http://technet.microsoft.com/en-us/library/dn249700.aspx

    もちろん、Windows Azure を監視するための管理パックも用意されています。

    System Center Management Pack for Windows Azure
    http://www.microsoft.com/en-us/download/details.aspx?id=38414

    Q) System Center コンポーネントを使用して、クラウドを監視する必要があります。既定の監視対象は次のうちどれですか (2 つ選択してください)。

    1. SQL Server のファイル ストレージ
    2. クラウド ファブリック
    3. サービス正常性
    4. Microsoft Exchange インフォメーション ストア

    この問題はあまり難しく考えないでください。

    既定で監視できるのは、クラウド ファブリックとその中に展開されている各サービスの正常性です。

    SQL Server や Microsoft Exchange を監視するには、別途管理パックを追加する必要があります。

    Q)チャージバック レポートを実装する予定です。必要な System Center コンポーネントは次のうちどれですか (2 つ選択してください)。

    1. Service Manager
    2. Configuration Manager
    3. Orchestrator
    4. Operations Manager CI コネクタ

    ここでいうチャージバックとは、クレジットカードの払い戻しプロセスのことではありません。顧客ごとのクラウドリソースの使用状況を計測することを意味しています。

    つまり、チャージバックレポートとは、クラウド使用量に関するレポートのことでです。

    チャージバック レポートについて
    http://technet.microsoft.com/ja-jp/library/jj614457.aspx

    チャージバックレポートを作成するための System Center コンポーネントは Service Manager なのですが、各リソースの使用量を計測するために Operations Manager と連携する必要があります。この時に使用するのが、Operations Manager CI コネクタです。CI は Configuration Item のことです。

    Q)チャージバック レポートのインストールモジュールに含まれているコンポーネントは次のうちどれですか (3 つ選択してください)。

    1. 管理パック ファイル
    2. XML 構成ファイル
    3. Web.config
    4. Windows PowerShell のインストール スクリプト
    5. Excel サンプル レポート

    Service Manager のチャージバック レポートは、管理パック ファイル、管理パック ファイルをインポートするための Windows PowerShell スクリプト、Microsoft Excel サンプル レポートなど、さまざまなファイルで構成されています。 これは、覚えるしかないですね。。。

    チャージバック レポートをインストールする方法
    http://technet.microsoft.com/ja-jp/library/jj614406.aspx

    Q) 価格シートを実装する予定です。価格の対象となるプライベート クラウド オブジェクトを見つける手段は次のうちどれですか。

    1. Service Manager の手動登録
    2. Configuration Manager による探索
    3. Operations Manager CI コネクタによる探索
    4. Orchestrator の同期

    チャージバックレポートを作成するには、各リソースの価格が設定されている必要があります。

    その価格のリストを「価格シート」といいます。別名 レートカードとも言います。

    もちろん、顧客のSLAによって価格も変わりますから、SLAごとに異なる価格シートを用意することもできます。

    答えはもちろん、Operations Manager CI コネクタです。これを使用して、クラウド内のオブジェクトを探索します。

    チャージバック レポートについて
    http://technet.microsoft.com/ja-jp/library/jj614457.aspx

    価格シートを作成または変更する方法
    http://technet.microsoft.com/ja-jp/library/jj614404.aspx

    Q) クラウド オブジェクトと価格シートを関連付ける必要があります。関連付けの前に必要な作業は次のうちどれですか。

    1. 価格シートを保存してエクスポートする
    2. 価格シートを作成して公開する
    3. オブジェクトの探索を実行する
    4. Orchestrator をインストールする

    これは、実際にオペレーションをしたことないと難しいですが、ちょっと考えるとわかるかもです。

    価格シートとは、「こういうオブジェクトはこのくらいの価格」というポリシーです。

    実際のクラウドオブジェクトを値付けするには、事前に価格シートが作成されていなければいけないことは、容易に想像がつくと思います。

    富士山頂にある自動販売機(クラウドオブジェクト)に、「コーラ 100円」という価格シートと、「コーラ 200円」という価格シートのどちらを適用するか決定するには、事前に「価格シート」が存在しなければならいですよね。

    詳細な手順は以下を参照してください。

    価格シートを作成または変更する方法
    http://technet.microsoft.com/ja-jp/library/jj614404.aspx

    Q) 展開したクラウドの正常性と容量に関するレポートを確認する必要があります。どの System Center コンポーネントを使用しますか。

    1. Operations Manager
    2. Windows Intune
    3. System Center Advisor
    4. Service Manager

    これは悩むと思うのですが、レポートを確認するのに最適なのは Service Manager です。Operations Manager はダッシュボードで個々のコンポーネントの監視を行ったりレポートを参照することは可能なのですが、「クラウドの正常性」という大きなくくりで全体の正常性をレポートするのであれば、CMDB を持つ Service Manager が最適です。

    Q) クラウドの可用性とパフォーマンスに関する値を監視する必要があります。どの System Center コンポーネントを使用しますか。

    1. Operations Manager
    2. Windows Intune
    3. System Center Advisor
    4. Service Manager

    パフォーマンスに関する具体的な値を監視するのであれば、Operations Manager です。

    次回は、「02 | パブリック クラウドへの System Center の接続」について解説します。

  • 【PowerShell】MVA対策講座 Windows PowerShell 3.0 を基礎から学ぶ ‐ Part4 高度な関数 編

    正直言って、今回は難しいです。どこから説明してよいかわからないくらいです。。。orz
    Microsoft Virtual Academy で公開されているオンライントレーニングコース「PowerShell 3.0 を使用した高度なツールとスクリプト」のテスト解説シリーズ、第4回目です。

    テストは以下から受けられます!

    Microsoft Virtual Academy - PowerShell 3.0 を使用した高度なツールとスクリプト
    http://www.microsoftvirtualacademy.com/training-courses/advanced-tools-and-scripting-with-powershell-3-jump-start-japanese#?fbid=pJeqjxv8UId

    前回までの投稿は以下より。

    さて、今回のタイトルは 「高度な関数」なのですが、「高度」と言われても何のことやら?ですよね。

    これ、英語版だと「Advanced Function」と書かれています。 「Advanced」の訳って難しいですよね。個人的にはあえて訳さなくてもよいと思うんですけど。ちなみに「Advanced Windows Firewall」は「セキュリティが強化された Windows Firewall」と訳されていますね。ローカライズチームも苦労しているのだと思います。。。

    PowerShell を使用すると、スクリプトだけで関数を定義できることはご存知の通りなのですが、「高度な」とつくからには単に Function ブロックで括る以上の「ナニカ」が無ければなりません。

    解説を始める前に、関数とは何かについておさらいしておきましょう。

    以下のようなスクリプト hello.ps1 があったとします。Param ブロック内に定義されている $a は引数です。

    param($a="Hello!")
    Write-Output $a

    これを実行するには、PSコンソールで以下のように入力する必要があります。

    image

    このスクリプトを再度呼び出したいときや、別のスクリプトから呼び出したいときにも、同様にスクリプト hello.ps1 ごと呼び出す必要があります。

    もちろんそれでもよいのですが、もうすこし使い勝手を良くするには、これを関数化します。

    関数化するには、以下のように Function ブロックで括ります。

    Function Echo-Something {
        param($a="Hello!")
        Write-Output $a
        }

    同じファイル名 hello.ps1 で保存し、以下のように ドット ソース モード(Part3 参照)で実行すれば、スクリプト名を指定することなく、「Echo-Something」という名前で呼び出すことが可能です。

    image 

    ちなみに、ドット ソース でスクリプトを実行したあと、以下のように Function: ドライブに移動してみてください。Dir コマンドを使用すると、Echo-Somethig 関数が登録されていることが確認できます。

    image

    じゃ、Echo-Something 関数を呼び出すために毎回ドット ソース モードでスクリプトを呼び出す必要があるのかといえば、そうではありません。

    関数を永続化する方法がいくつかあります。

    もっとも簡単なのは、PowerShell のプロファイルスクリプトに 「 . c:\tmp\hello.ps1」を記述しておく方法です。

    PowerShell コンソールが起動するたびに実行されるので、毎回 hello.ps1 を実行する手間が省けます。

    話が複雑になるので要点だけ書くと、プロファイル用スクリプト(の一つ)は以下の通りです。

    C:\Users\<ユーザー名>\Documents\WindowsPowerShell\profile.ps1

    プロファイルについては改めて別の投稿で解説します。

    (参考)Understanding and Using PowerShell Profiles
    http://blogs.technet.com/b/heyscriptingguy/archive/2013/01/04/understanding-and-using-powershell-profiles.aspx

    ってことで、関数については理解していただけましたでしょうか?

     

    では、解説をはじめましょう。 あー憂鬱だ。。。

    PowerShell コマンドレットの構造はどれですか

    1. コマンド ライン – ステートメント
    2. コマンド –メッセージ
    3. 名詞 - 動詞
    4. 動詞 - 名詞

    Windows PowerShell のコマンドレットの構造にはキマリがあります。それは、かならず「動詞-名詞」という形になっているということです。

    コマンドレットの一覧を参照するには Get-Command コマンドレットを使用しますが、これも「動詞ー名詞」という構造になっていることがわかります。

    以下はコマンドの例です。コマンドレット名を見ると、およそ何をしたいコマンドなのかが予測できるようになっています。

    Function        Update-StorageProviderCache                        Storage               
    Function        Write-DtcTransactionsTraceSession                  MsDtc                 
    Function        Write-PrinterNfcTag                                PrintManagement       
    Cmdlet          Add-ADCentralAccessPolicyMember                    ActiveDirectory       
    Cmdlet          Add-ADComputerServiceAccount                       ActiveDirectory       
    Cmdlet          Add-ADDomainControllerPasswordReplicationPolicy    ActiveDirectory       
    Cmdlet          Add-ADFineGrainedPasswordPolicySubject

    逆に、自分でコマンドレットを作成する場合にもこの規則に沿って命名することをお勧めします。

    例えば、「新入社員を人事データベースから抽出する」コマンドを作成するのであれば、その名称は Get-FreshmanFromHRDB とでもすれば、他の方がこのコマンドを呼び出すときにも便利です。

    高度な関数の用途はどれですか

    1. コンパイル済みコマンドレットを作成する
    2. コマンドレットと同様に動作する、再利用可能なスクリプトを作成する
    3. 常駐型のメモリ内呼び出しを行う
    4. モジュールの作成を自動化する

    「高度な関数」の「高度な」の意味が問われています。

    答えは「2.コマンドレットと同様に動作する、再利用可能なスクリプトを作成する」ことです。

    スクリプトでコマンドレット(のようなもの)を定義するという意味で、スクリプトコマンドレットと呼ばれることもあります。

    では「コマンドレットと同様に」とはどういう意味でしょう?

    単に「コンソールからコマンドレットのように呼び出せる」ということではありません。これだけならば、VBSript だって似たようなことができなくもありません。

    バイナリで作成されたコマンドレットにはPowerShell特有のオプションが実装されています。

    例えば、-confirm オプションがその1つです。

    以下の例では Remove-Item コマンドレットを使用して sample フォルダ配下を削除しようとしていますが、-Confirm オプション指定することで、削除の確認メッセージが表示できます。

    image

    (参考)about_Functions_CmdletBindingAttribute
    http://technet.microsoft.com/en-us/library/hh847872.aspx

    ただの関数であれば、このような機能を実装するには関数内に別途スクリプトを記述する必要がありますが、「コマンドレット」と同様に動作させることで、コマンドレットが本来持っている機能を関数にも実装できるのです。じゃ、関数を高度化するにはどうすればよいかについては後述します。

    PowerShell ISE でスクリプト テンプレートを簡単に呼び出すキーボード コマンドはどれですか

    1. Ctrl+Z
    2. Ctrl+I
    3. Ctrl+J
    4. Ctrl+T

    正直、私はあまり使わないのですが、PowerShell ISE(統合スクリプト環境。要はインテリジェントなエディターです)を使用すると、事前に定義されている構文テンプレートを呼び出すことができます。

    そのときに使用するショートカットが Ctrl + J です。Ctrl +J を押すと、以下のような画面が表示されるので、ここから使いたいテンプレートを選択します。

    image

    上記の中に「Cmdlet(高度な関数)」「Cmdlet(高度な関数)- 完了」という2つのテンプレートがありますが、これが関数を定義する際のテンプレートです。

    完了」と書かれているのは、おそらく翻訳ミスで「完全」のことだと思われます。。。ほんとすんまそん。。。

    つまり、「簡易版テンプレート」と「完全版テンプレート」という意味なのでしょう。実際、中身もそうなっています。

    簡易版テンプレートを選択すると、以下のようなスクリプトが展開されます。

    <#
    .Synopsis
       短い説明
    .DESCRIPTION
       詳しい説明
    .EXAMPLE
       このコマンドレットの使用方法の例
    .EXAMPLE
       このコマンドレットの使用方法の別の例
    #>
    function Verb-Noun
    {
        [CmdletBinding()]
        [OutputType([int])]
        Param
        (
            # パラメーター 1 のヘルプの説明
            [Parameter(Mandatory=$true,
                       ValueFromPipelineByPropertyName=$true,
                       Position=0)]
            $Param1,

            # パラメーター 2 のヘルプの説明
            [int]
            $Param2
        )

        Begin
        {
        }
        Process
        {
        }
        End
        {
        }
    }

    スクリプトを単純に Function ブロックで括っても関数化することはできますが、上記を見ると他にも様々なブロックが用意されていることがわかります。

    それぞれのブロックについての説明は、後の問題で。

    PowerShell のドキュメントに使用するコメント ブロックを定義するにはどうすればよいですか

    1. "<!--" と "-->" でブロックを囲む
    2. "\*" と "*/" でブロックを囲む
    3. "<#" と "#>" でブロックを囲む
    4. "<comment>" と "</comment>" でブロックを囲む

    前問のテンプレートにも書かれている通り、コメントは <# ~ #> で括ります。

    1行だけならば、先頭に # をつけるだけでOKです。

    正誤問題: PowerShell ISE には、関数やスクリプトの作成に推奨されるプラクティスやスタイルに従ったテンプレートが用意されている

    既に書きましたね。もちろん○です。

    正誤問題: 高度な関数は、C# と .NET Framework を使用してのみ作成できる

    これも大丈夫ですよね。×です。

    C#やその他の言語を使用すればバイナリーなコマンドレットを作成することができますが、スクリプトだけでもコマンドレットのように扱える「高度な」関数を作成することができます。

    関数における CmdletBinding 属性の機能は何ですか

    1. 任意の実行ポリシー コンテキストで関数を実行する
    2. ドット コンテキストで関数を読み込む
    3. 関数の動作をコンパイル済みコマンドレットのようにする
    4. 関数を管理者コンテキストに昇格する

    数問前で「高度な関数」とは「コマンドレットのように動作する関数」であると書きましたが、それを実現しているのが関数内に定義する「CmdletBinding」属性です。

    この属性が定義されていると、バイナリのコマンドレットが持っているようなオプションを有効化できます。

    その一つが -Confirm であることは既に書いた通りです。他にも CmdletBinding によって有効化できる機能がありますので、紹介しておきます。

    CmdletBinding 属性のいくつかの機能を有効にした関数例を以下に示します。

    function Echo-Something
    {
        [CmdletBinding(
            ConfirmImpact="High",
            SupportsShouldProcess=$True,
            DefaultParameterSetName="Set2"
            )]

        Param
        (
            [Parameter(Mandatory=$True,ParameterSetName="Set1")]
            [string[]]$Param1,

            [Parameter(Mandatory=$True,Position=1,ParameterSetName="Set2")]
            [string[]]$Param2,
            [Parameter(Mandatory=$True,Position=2,ParameterSetName="Set2")]
            [string[]]$Param3
        )

        Begin
        {
        }
        Process
        {
            if ($PSCmdlet.ShouldProcess("ほげほげ")) {
                Write-Output "1 $Param1"
                Write-Output "2 $Param2"
                Write-Output "3 $Param3"
                }
        }
        End
        {
        }
    }

    SupportsShouldProcess = $True は -Confirm と -Whatif オプションを有効にするための設定です。

    これにより、関数の実行時に以下のように確認メッセージを表示することができます。

    image

    DefaultParameterSetName はとても使い勝手の良い機能で、複数の引数パターンのうち既定のパターンをどれにするか指定できます。

    Paramブロックの中を見てください。ParameterSetName という属性が定義されていることがわかります。これは、引数がどのパターンに属するのかを示したものです。

    今回は DefaultParameterSetName = ”Set2” と指定しているので、引数を何も指定しなければ以下のように パターン Set2 を使うものとして、値を聞いてくれます。

    image

    このほか、CmdletBinding を定義するだけで以下の共通オプションが使えるようになります。これらにより、デバッグに便利な Write-Debug コマンドや Write-Verbose コマンドも使えるようになるので、関数を定義するときには CmdletBinding を定義しておくことをお勧めします。

    • -Verbose

    • -Debug

    • -WarningAction

    • -WarningVariable

    • -ErrorAction

    • -ErrorVariable

    • -OutVariable

    • -OutBuffer

    (参考)Build Your Own PowerShell Cmdlet: Part 4 of 9
    http://blogs.technet.com/b/heyscriptingguy/archive/2012/10/02/build-your-own-powershell-cmdlet-part-4-of-9.aspx

    関数における Process ブロックの目的は何ですか

    1. 受け取った値を反復処理するたびに実行する
    2. パイプライン入力に関係なく、1 回だけ実行する
    3. 文字列以外の値が入力された場合のみブロックを実行する
    4. 文字列値が入力された場合のみブロックを実行する

    答えは「1. 受け取った値を反復処理するたびに実行する」なのですが、唐突に「反復処理」と言われても意味が分からないですよね。

    「反復処理」とは、「受け取った引数の数」だけ実行されるということです。「引数の数」というのは Param ブロックで定義した引数の数ではありません。

    Windows PowerShell ではパイプを使って、前のコマンドの結果をオブジェクトとして繰り返し受け取ることができます。

    例えば Get-Service というコマンドレットがあります。このコマンドレットの出力結果には、システム上の個々のサービスの情報が格納されています。以下は、Get-Service コマンドレットの出力結果例です。

    image

    これを踏まえ、以下のようなコマンドを実行したとします。

    Get-Service | Echo-Something

    これにより、Get-Service の結果が1回ずつ(上の出力結果例の1行ずつ)Echo-Something に引数として渡されます。

    結果が Echo-Something に渡されると、そのたびに Process ブロック内の処理が実行されます。

    例を示しましょう。以下のような関数を定義したとします。

    function Echo-Something
    {
        [CmdletBinding()]
        Param
        (
            [Parameter( ValueFromPipeline =$true)]
            $Param1
        )

        Begin
        {
            "----Begin----"
        }
        Process
        {
            $Param1.Name
        }
        End
        {
            "----End----"
        }
    }

    Process ブロック内では、引数として渡されたオブジェクトの Name プロパティを表示しています。

    以下のようにして、この関数を実行してみます。

    image

    結果は一目瞭然ですね。

    Begin ブロック内が一番最初に1回だけ実行されます。

    その後、パイプラインから渡された結果が繰り返し Process ブロックに渡されて処理されています。

    最後に End ブロックが1回だけ実行されて、処理は終了します。

    関数における Begin ブロックの目的は何ですか

    1. パラメーターを受け取る
    2. 変数を初期化する
    3. Process ブロックと同じ回数実行する
    4. Process ブロックの実行をスキップする

    前問の結果から、もうわかりますよね。答えは「2. 変数を初期化する」です。

    上の例では何もしていませんが、本当はここで引数の値を確認したり、変数の初期値を設定したりします。

    関数における End ブロックの目的は何ですか

    1. Process ブロックの実行をスキップする
    2. Process ブロックの実行を制限する
    3. クリーンアップ タスクを実行する
    4. パラメーターの使用を制限する

    これもOKですね。

    「3. クリーンアップ タスクを実行する」が正解です。

    Begin ブロックで用意した変数を初期化したり、ファイルをクローズするなどの処理はここで行います。

    ーーー

    以上で終わりなのですが、ちょっと中途半端なのでパラメタ(引数)の扱いについてもう少し解説しておきたいと思います。

    以下のように Echo-Something 関数を定義したとします。

    function Echo-Something
    {
        Param
        (
            [Parameter( Mandatory=$True,
                        Position=1,
                        ValueFromPipeline=$true)]
            [string]$Param1,

            [Parameter(Mandatory=$True)]
            [string]$Param2,

            [Switch]$EchoString
        )

        Begin
        {
        }
        Process
        {
                If($EchoString){
                Write-Output $Param1
                Write-Output $Param2
            }
        }
        End
        {
        }
    }
     

    Parameter 部分に注目してください。

    この関数には3つの引数が定義されており、両方とも Mandatory=$True と指定されています。つまり、Param1 と Param2 は必須ということです。

    なので、パラメタを指定せずに Echo-Something を実行すると、以下のように入力を求められます。

    image

    Position=1 というのは、引数として受け取る順番を意味しています。つまり「1番目の引数は Param1 用である」ということが宣言されています。

    一方で、Param2 には Position が設定されていないため、引数は必ず名前付きで指定する必要があります。

    つまり以下のように。

    image

    [Switch] として定義されている3つ目の引数 $EchoString はとても素敵な機能です。

    以下のように、関数のパラメタとして指定された場合には、$EchoString には $True が格納されます。指定されない場合には $False が格納されます。つまり、この値の中身を判断することで、処理のオン/オフを切り替えられるわけです。

    image

    詳しくはまた別の機会に。

    (参考)Windows PowerShell: パラメーターを定義する
    http://technet.microsoft.com/ja-jp/magazine/jj554301.aspx

  • 【PowerShell】MVA対策講座 Windows PowerShell 3.0 を基礎から学ぶ ‐ Part3 単純なスクリプトと関数 編

    Microsoft Virtual Academy で公開されているオンライントレーニングコース「PowerShell 3.0 を使用した高度なツールとスクリプト」のテスト解説シリーズ、第3回目です。

    腕に自信のある方は、まずはテストを受けてみてくださいね!

    通過できない場合には、こちらの解説講座に戻ってきてください。

    Microsoft Virtual Academy - PowerShell 3.0 を使用した高度なツールとスクリプト
    http://www.microsoftvirtualacademy.com/training-courses/advanced-tools-and-scripting-with-powershell-3-jump-start-japanese#?fbid=pJeqjxv8UId

    前回までの投稿は以下より��

    今回は PowerShell の「単純なスクリプトと関数」について解説します。

    是非とも満点でテストを通過してください!

     

    PowerShell スクリプトを作成する理由は何ですか

    1. 自動化のため
    2. 互換性のため
    3. PowerShell v2 を操作できるようにするため
    4. .NET Framework の機能を使用するため

    うーん、なんか、いろいろ考えすぎてしまいますね。でもここはシンプルに「自動化のため」と考えましょう。

    MCPもそうですが、マイクロソフト本社が作成するこの手の問題は「マイクロソフトの意図が理解できているかどうか」を問うものが多いです。「スクリプト」に込められた第一の意図は、やはり「自動化」なんですね。

    PowerShell スクリプトを作成するには、どのツールを使用しますか

    1. PowerShell PowerTools
    2. Visual Studio 2012
    3. Windows PowerShell ISE
    4. Windows PowerShell Editor

    ここは迷わず 3. Windows PowerShell ISE と回答していただきたいところです。4. PowerShell Editor というツールが世の中には存在しないわけではありませんが、ISEが選択してとして挙げられている以上、マイクロソフトはこれを選んで欲しいのです。

    ちなみに、Visual Studio 2012 でスクリプトの作成が不可能かといえば、そんなことはありません。.NET Frameork には PowerShell Class が用意されており、これを使えばPowerShell スクリプトを Run Space 上で実行し、結果を Visual Studio で受け取ることもできます。が、スクリプト作成の最適なツールではありません。

    もしかすると、PowerToys for Windows PowerShell ISE と勘違いして PowerTools を選んでしまった方がいらっしゃるかもしれません。PowerTools は CodePlex で公開されている Open XML 用のツール群です。

    PowerTools for Open XML http://powertools.codeplex.com/

    PowerShell スクリプトにはコマンドレットが 1 つ以上含まれている必要がある

    Windows PowerShell のスクリプトには必ずしもコマンドレットが含まれている必要はありません。なんなら、DOSのコマンドだけでスクリプトを作成しても問題ありません。

    スクリプトのパラメーター化に使用する PowerShell コンポーネントの種類は何ですか

    1. モジュール
    2. スナップイン
    3. 関数
    4. 変数

    これもわかりずらい問題ですね。。。

    そもそも「スクリプトのパラメーター化」って言い回しが難解です。英語版では「Parameterize」と書かれていますので、まぁ、日本語としては間違いではないのですが。。。

    何を言いたいかというと、「スクリプトを汎用化する際には、値をハードコードするのではなくパラメタ化したほうがよいわけですが、その際使用するのは何ですか?」という問いです。

    答えは「変数」ですが、ちょっと意図が分かりずらいですね。

    例えば、以下のようなスクリプトがあったとしましょう。

    image

    これだと、値がスクリプトに埋め込まれているので、処理を変更するには毎回スクリプトを編集する必要があります。

    これを以下のように「Param」で囲んであげることで、変数をスクリプトのパラメタ(引数)として扱うことができます。

    image

    このことを「パラメタ化」と言っているのですね。

    PowerShell スクリプトに使用するファイル拡張子は何ですか

    1. .vbs
    2. .cs
    3. .psm1
    4. .ps1

    これについては解説は必要ないですね。4. ps1 が正解です。

    .vbs は言うまでもなく VBScript。.cs は C# で書かれたソースコードが保存されるファイルの拡張子です。

    .psm1 については知らない方もいらっしゃるかもしれませんが、スクリプトをモジュール化する際に使用する拡張子です。

    (参考)Windows PowerShell: スクリプトを簡単に共有できるようになりました
    http://technet.microsoft.com/ja-jp/magazine/ff625835.aspx

    パラメーターを受け取るためにスクリプトに追加する必要があるブロックの種類は何ですか

    1. Comment ブロック
    2. Script ブロック
    3. Param ブロック
    4. Function ブロック

    パラメーターとは、ここではスクリプトの引数を意味しています。

    スクリプト内で引数を受け取るには、以下のように Param ブロックを使用します。

    image

    Comment ブロックとは、以下のように複数行にわたるコメントを記述する際に使用します。

    <# 
    This is
    a
    block comment
    #>

    Scriptブロック とは、その中に書かれたスクリプトを実行する際に使用するのですが、例えば以下のようにリモートコンピューター上で実行したいコマンドを記載するのに使用します。

    Invoke-Command -ComputerName RemotePC -ScriptBlock{ Restart-Computer }

    Functionブロックは、ある処理を関数化する際に使用します。例えば以下のように使用します。

    Function EchoDateTime {

    Get-Date

    }

    EchoDateTime

    PowerShell で関数を定義するには、どのキーワードを使用しますか

    1. Module
    2. Function
    3. Param
    4. While

    前問で書いた通り、関数を定義するには Function を使用します。

    While はループを記述する際のキーワードですね。

    Get-DiskInfo という関数を DiskUtilities.ps1 というスクリプトに追加しました。PowerShell ISE の外部でこの関数をテストするには、どのような手順を実行する必要がありますか (2 つ選択してください)。

    1. DiskUtilities.ps1 スクリプトを実行する
    2. スクリプトをモジュールとして読み込む
    3. Get-Diskinfo を呼び出す
    4. ドット ソース モードで DiskUtilities.ps1 スクリプトを実行する

    まず初めに謝っておきます。

    これ、答えが間違えています。。。。ごめんなさい。本社にフィードバックしておきます。

    正解は、3,4 ですが、2,4と回答しないと正解になりません。。。ほんとごめんなさい。

    気を取り直して解説しておきましょう。

    おそらく、以下のようなスクリプトを作成して、DiskUtilities.ps1 というファイル名で保存したのでしょう。「関数を保存した」というところに注目してください。

    image

    このスクリプトを ISEの「実行ポタン」ではなくPSコンソールやタスクマネージャー等から起動するにはどうしたらよいか?という問いです。

    ここで注意していただきたいのは、保存したスクリプトは「関数」であるということです。

    上記のような関数が書かれたスクリプトを単純に実行すると「関数が定義」されるだけで、関数そのものは実行されません。

    でもって、定義された関数はスクリプトが終われば消えてしまいます

    つまり、以下のように行っても、関数は実行されないのです。

    PS C:\> .\DiskUtilities.ps1

    PS C:\> Get-DiskInfo

    よって、「1.」は不正解です。

    じゃ、「2. スクリプトをモジュールとして読み込む」はどうかといえば、一見よさげですが、これも × です。

    モジュールとして読み込むには、.psm1 という拡張子で保存し、所定のモジュールフォルダに格納する必要があります。

    拡張子 .ps1 で保存したスクリプトファイル内にある関数を呼び出すには、「ドット ソース モード」と呼ばれる手法でスクリプトを実行する必要があります。

    具体的には以下のように、先頭にドット スペースを追記します。

    PS C:\>. .\DiskUtilities.ps1

    ドット 半角スペース ドット\DiskUtilities.ps1 と書かれてます。

    これにより、ps1 内の Get-DiskInfo 関数は、同じ PSセッション内であればいつでも呼び出して実行できます。

    PowerShellコンソールを閉じてしまうと、PSセッションも消滅するので、関数も使えなくなります。

     

  • 【PowerShell】MVA対策講座 Windows PowerShell 3.0 を基礎から学ぶ ‐ Part2 PowerShell のスクリプト言語 編

    Microsoft Virtual Academy で公開されているオンライントレーニングコース「PowerShell 3.0 を使用した高度なツールとスクリプト」のテスト解説シリーズ、第2回目です。

    腕に自信のある方は、まずはテストを受けてみてくださいね!通過できない場合には、こちらの解説講座に戻ってきてください。

    Microsoft Virtual Academy - PowerShell 3.0 を使用した高度なツールとスクリプト
    http://www.microsoftvirtualacademy.com/training-courses/advanced-tools-and-scripting-with-powershell-3-jump-start-japanese#?fbid=pJeqjxv8UId

    前回までの投稿は以下より。

    第1回 スクリプト入門編

    今回は PowerShell のスクリプト言語について。

    是非とも満点でテストを通過してください!

     

    PowerShell で変数を宣言するには、どの記号を使用しますか

    1. !
    2. @
    3. #
    4. $

    これは比較的簡単ですね。正解は “$” です。文字列の頭に $ をつけることで変数として扱うことができます。

    他のスクリプト言語同様、Windows PowerShell でも特殊記号を使用することで文字列に特別な意味を持たせることができます。

    !(エクスクラメーション)は 論理否定(-not)の短縮形です。変数が NULL 値かどうかの判定なんかで使います。”NULL 値は論理値的には False” なので、! $null と書けば、True を意味することになります。ちなみに、$null は NULL 値を表現する既定の変数です。

    image

    @ を使用するとアレイ値を宣言することができます。 @(1,2,3) とすれば、数値の1,2,3それぞれが入った配列が定義できます。文字列も同様に、@(“a”,”b”,”c”) などとするだけです。

    image

    配列と似たものでハッシュテーブルと呼ばれるものもあります。これはキーと値のペアで格納できるものです。

    例えば各国の人口をプログラムの中で使いたい場合、事前に以下のように定義しておきます。

    $P = @{“Japan” = 127600000 ; “USA” = “313900000” }

    こうすれば、日本の人口を取り題したいときには $P.Item("Japan")  とすればよいわけです。いちいちデータベース等にアクセスする必要がなくなるので、繰り替えし処理が多い場合などは処理を高速化できます。

    image

    # はご存知ですよね。これはコメント行を意味します。

    文字列内の変数と併用した二重引用符の機能はどれですか

    1. すべての変数を解決する
    2. 変数が置換されないようにする
    3. 一般的な変数を置換する
    4. 個別の変数が置換されないようにする

    これ、意味が分かりずらいかもしれません。次の問題とも関係するのですが、文字列の中に$で始まる文字列を書いた場合を考えてみてください。例えば、以下のように。

    $a = “6”

    $b = “12345$a”

    このとき、$b の中に格納されているのは、”123456” です。なぜならば文字列を二重引用符(ダブルクオーテーション)で括っているからです。

    image

    つまり、正解は「1. すべての変数を解決する」です。ここでいう「解決」とは、「名前解決」と同じような意味です。変数を置き換えることを意味しています。

    文字列内の変数と併用した単一引用符の機能はどれですか

    1. すべての変数を解決する
    2. 変数が置換されないようにする
    3. 一般的な変数を置換する
    4. 個別の変数が置換されないようにする

    前問の続きになりますが、以下のように単一引用符(シングルクオーテーション)で文字列をくくった場合を考えてみます。

    $a = “6”

    $b = ’12345$a’

    この場合、変数は展開されずに、そのまま文字列として扱われます。

    image

    よって、正解は「2. 変数が置換されないようにする」です。

    文字列内の変数と併用したアクサン グラーブの機能はどれですか

    1. すべての変数を解決する
    2. 変数が置換されないようにする
    3. 一般的な変数を置換する
    4. 個別の変数が置換されないようにする

    アクサン グラーブって、どれのことかわかりますか?106/109日本語キーボードですと以下がアクサングラーブです。

    image

    これはスクリプトの継続行を意味する記号として使われますが、それ以外にも $ の前に付加することで、$ を単なる文字列として扱うことができます。

    image

    つまり答えは「4. 個別の変数が置換されないようにする」です。

    PowerShell でオブジェクトに関するプロパティやメソッドを取得する必要があります。どのコマンドレットを使用しますか

    1. Get-Object
    2. Get-Service
    3. Get-ChildItem
    4. Get-Member

    これは覚えておきましょう。「4. Get-Member」です。

    PowerShell のコマンドレットは高機能なので、その戻り値がどのようなプロパティやメソッドを持っているかを記憶することは不可能ですし、かといっていちいち調べるのも面倒です。

    なので出力結果から、どのような値が得られ、どのような処理が可能になるのかを簡単に予測できることは、効率的なスクリプティングにとってとても重要です。

    例えば、 Get-Process というコマンドレットを考えてみましょう。

    このコマンドレットの結果、プロセス一覧が取れるであろうことは予測できますが、具体的にどのような値が取れるのかを調べるには、以下のように、Get-Process の出力結果を、パイプを介して Get-Memeber に渡します。

    image

    知っているととても便利です。

    PowerShell の論理構文は次のうちどの構文ですか (2 つ選択してください)。

    1. If .. ; Then .. ; Else
    2. If .. ; ElseIf  .. ; Else
    3. Case  .. ; Select
    4. Switch
    5. While

    「論理構文」って意味わかります?ググっても、もといBingってもそんな言葉出てこないんですけど。。。。

    英語版のテストでは「Logical construct」と書いてあるので「論理構文」なのでしょうが、日本だと「条件分岐構文」のほうがしっくりくるでしょうかね。

    じゃ、上記の中で条件分岐はどれかといえば 1,2,3,4 になりますが、問題文では「2つ選択」と書かれています。

    頭の中に???が並びますよね。

    これ、ひっかけ問題です。

    PowerShell には、 if .. then .. else はありません!正確に書くと、PowerShell には「Then」は書きません!!だから、1. は × です。

    それから、PowerShell には Case 文、Select 文はありません!! これらは Switch 文に吸収されています。

    よって正解は 2 と 4 になります。

    意外と難しいですねぇ。

    PowerShell のループ処理構文は次のうちどの構文ですか (2 つ選択してください)

    1. If ..; Then .. ; Else
    2. Do
    3. Case ..; Select
    4. Switch
    5. While

    これは解説の必要はないですね。

    2、5 が正解です。

    PowerShell のオブジェクトを反復処理する一般的な方法は次のうちどの構文ですか (2 つ選択してください)

    1. If ..; Then ..; Else
    2. ForEach
    3. Case ..; Select
    4. Switch
    5. ForEach-Object コマンドレット

    「オブジェクトの反復処理」というところがミソです。

    PowerShell では、Do や While を含め様々なループ処理があります。

    "For” だけでも、以下の3種類があります。

    • For
    • Foreach
    • ForEach-Object コマンドレット

    この中でオブジェクトに対する反復処理に対応しているのは、Foreach と ForEach-Object コマンドレットの2つです。

    例えば、「WUA で始まるサービスの一覧を取得し、それらをすべて停止する」という処理を考えてみると、以下のように書けます。

    image

    $S には Get-Service の戻り値がオブジェクトとして格納されています。$S から個々のサービスのインスタンスを取り出して Stop() しています。

    てことで正解は 2、5 ですね。

    ということで、第2回目の講義は終わりです。

    テストに通過できなかった方は、上記を踏まえて再度チャレンジしてください!目指せ満点!

    Microsoft Virtual Academy - PowerShell 3.0 を使用した高度なツールとスクリプト
    http://www.microsoftvirtualacademy.com/training-courses/advanced-tools-and-scripting-with-powershell-3-jump-start-japanese#?fbid=pJeqjxv8UId

    次回は 「第3回 単純なスクリプトと関数」編です。

  • 【PowerShell】MVA対策 Windows PowerShell 3.0 を基礎から学ぶ - Part1 スクリプト入門編

    以下に Windows PowerShell 3.0 のオンライントレーニングコースが公開されています。

    もちろん日本語です。

    PowerShell 3.0 を使用した高度なツールとスクリプト
    http://www.microsoftvirtualacademy.com/training-courses/advanced-tools-and-scripting-with-powershell-3-jump-start-japanese#?fbid=pJeqjxv8UId

    是非テストに挑戦していただきたいのですが、テストの解説がどこにも掲載されていないので、今日から9回に分けて解説したいと思います。

     

    PowerShell V3 をサポートしているオペレーティング システムは次のうちどれですか?

    Windows PowerShell v3 を利用するには Windows Management Framework 3.0 が必須です。

    Windows 8 および Windows Server 2012 以降には標準で組み込まれていますが(Windows 8.1 および Windows Server 2012 R2 には v4 が組み込まれています)、それ以前の OS には以下からダウンロードしてインストールする必要があります。

    http://www.microsoft.com/en-us/download/details.aspx?id=34595

    Windows Management Framework 3.0 をサポートしている OS は Windows 7 Service Pack 1, Windows Server 2008 R2 SP1, Windows Server 2008 Service Pack 2 となります。

    なので、設問中の Windows 7 は、微妙ですがサポート外ということになります。

    スクリプトを使用して自動化する作業の種類はどれですか (2 つ選択してください)

    これは結構悩ましい設問です。

    「1回だけ発生して繰り返されない作業」については、一般的に自動化のメリットは得られずらいので選択肢としては妥当ではありません。

    「アドホックな作業」とは、暫定的に行うような作業を意味しており、これも自動化できない作業と考えてよいでしょう。

    よって、「管理者にとって一般的な作業」「繰り返し発生する作業」が選択肢としては適切です。

    IT 環境における PowerShell の目的は何ですか

    これも設問が漠然としていて難しですよね。

    従来よりスクリプトの大きな目的は作業の自動化です。スクリプトがあるからといって、GUIの存在が必要なくなるわけではないし、手動の管理作業が必要なくなるわけではありません。

    よって、最適な選択肢は「作業を管理および自動化するツールを提供する」になりますね。

    PowerShell 3.0 の実行に必要な .NET Framework のバージョンはどれですか。

    間違いやすい問題です。これは、Windows Management Framework 3.0 の動作条件を確認する必要があります。

    以下にも記載されているように、.NET Framework 4.0 が必須となっています。

    image

    Windows XP でサポートされている PowerShell のバージョンはどれですか

    サポート期限が 2014年4月に迫った Windows XP ですが、実は XP でも Windows PowerShell はサポートされていることをご存知の方は意外に少ないです。

    実は、Windows Management Framework 2.0(Windows Management Core Package)は Windows XP SP3 用にも提供されており、これをインストーすることで Windows XP SP3 でも Windows PowerShell 2.0 を利用できます。

    http://www.microsoft.com/ja-jp/download/details.aspx?id=16818

    PowerShell の実行に使用するユーザー コンテキストはどれですか

    これ、質問文が悪いですね。

    言いたいのは「Windows PowerShell を実行する際に使用すべきユーザーコンテキストはどれですか?」という意味です。

    ここでのユーザーコンテキストとは、「ユーザーの実行空間」とでもいえばよいでしょうか。なかなか訳しずらい言葉ですが。

    要は、「どのユーザーの権限で Windows PowerShell を実行すべきか?」という問いです。

    マイクロソフトにおける Windows PowerShell の位置づけはシステム管理ツールなので、「管理者コンテキスト」がただし答えになります。

    Windows PowerShell のコンソールを開くときに「管理者として実行」を選択するようにしてね!というメッセージが込められています。でないと、管理作業がエラーになってしまうので。

    PowerShell を管理者コンテキストで開くとプロンプトに表示されるディレクトリの場所はどれですか

    「管理者コンテキスト」というところがミソですね。

    実際にコンソールを開いてみれば一目瞭然です。

    以下は「管理者として実行」を選択した開いた時のプロンプトです。

    image

    「管理者として実行」を選択しないと、現在のユーザーコンテキストで開かれるので、プロンプトは以下のようになります。

    image

    実行ポリシーを設定するには、どのコマンドレットを使用しますか

    これは、これから Windows PowerShell を使用してシステム管理を始めようとする方が覚えておくべき事項の1つです。逆に言えば、これを知らないとシステム管理が先に進みません。

    当然、こたえは「Set-ExecutionPolicy」ですね。

    PowerShell のコンソールを開いたら、真っ先に以下のコマンドを入力してください。

    Set-ExecutionPolicy  -ExecutionPolicy  RemoteSigned 

    RemoteSigned は、「リモートからダウンロードしてきたスクリプトには署名が必須」という設定です。つまり、インターネット上に転がっているスクリプトをむやみやたらに実行できなくするわけですね。

    ちなみに Windows Server 2012 までの規定値は Restricted(制限されている)です。つまり既定では自分で作ったスクリプトも実行できないので、これではあまりにも厳しすぎる。。。。ということで、RemoteSigned を使用するようにしましょう。R2 からは RemoteSigned が規定値になりました。

    (参考) Set-ExecutionPolicy コマンドレットの使用 http://technet.microsoft.com/ja-jp/library/ee176961.aspx

    PowerShell リモート処理の機能はどれですか

    これは簡単だと思うのですが、どうでしょう。

    「リモートデスクトップ」と書かれている選択肢は明らかに間違いです。リモートデスクトップはリモートデスクトップですからね。全く別の機能です。

    答えは当然「リモート システムに対して対話的にまたはスクリプトで PowerShell を使用する機能」です。

    Windows PowerShell を使用すると、スクリプトを使用してリモートのコンピューターを管理できます。これを「リモーティング」を言います。

    リモーティング機能は、大きく分けて3種類の使い方があります。

    1. 各コマンドレットの -ComputerName パラメタを使用する
    2. Invoke-Command  -ComputerName を使用する
    3. Enter-PSSession ーComputerName を使用して、SSHのようにリモートコンピューターにサインインする

    多くのコマンドレットでは -ComputerName をサポートしていますが、中にはサポートしていないものもあります。場合によっては、リモートコンピューターのDOSコマンドを実行したいことがあるかもしれません。

    そのときは Invoke-Command を使ってください。Invoke-Command を使用すれば任意のコマンドやスクリプトを相手のコンピューター上で実行することができます。

    対話的に相手のコンピューターに入り込みたい場合には、Enter-PSSession -ComputerName を使用します。

    Windows Server 2012 の既定の実行ポリシーは何ですか

    これ、問題または答えが間違えています。

    本当は、「Windows Server 2012 R2 の既定の実行ポリシーは何ですか?」でないといけません。もしくは、答えが 「Restricted」 でないとつじつまが合いません。

    前述したように、Windows Server 2012 R2 の規定値は RemoteSigned です。

    もしこのままの問いだとすると、「Resricted」が答えになるので、満点が取れなくなってしまいます。満点が欲しい方は「RemoteSinged」で答えてください~。

    http://technet.microsoft.com/en-us/library/hh847748.aspx

    本日の講義はここまで。

    次回は、Part2 PowerShell のスクリプト言語 編 です。