[PS]PowerShellリモーティング

PowerShell2.0CTPでは、PowerShellリモーティングなるものが提供されています。リモーティングの言葉通り、リモートコンピュータのPowerShellを手元のPowerShellから操作する機能です。このPowerShellリモーティングを使用するには、以下のような前提条件があります。 Windows XP/Windows Server 2003Windows Remote Managementが必要になります。 Windows VistaSP1が必要になります。現在公開されているRCで問題はありません。 Windows Server 2008特に必要なものはありません。 Windows Remote Management(WinRM)の最新版があれば、PowerShellリモーティングを動作させることができます。WinRMとは、WS-ManagementというSOAPベースのプロトコルを使った管理用プロトコルのWindows実装です。WinRMは、Windows Vistaには標準で含まれているのですが、PowerShell2.0で使用するには更新されたバージョンが必要になるのです。 この準備ができたらPowerShell2.0CTPをインストールしてから、WinRMの設定を行います。設定方法は、PowerShell2.0CTPのリリースノートに記載されている通りで、1)WinRMサービスの起動、2)$PSHome\Configure-Wsman.ps1スクリプトの実行の2つです。  実際の使い方は、2種類あります。1つ目は、以下の通りです。PS (1) >Invoke-Exparession hostname -ComputerName コンピュータ名 Invoke-ExpressionにComputerNameパラメータを指定することで、指定したコンピュータ上のPowerShell2.0でhostnameコマンドを実行して、結果をコンソールに表示します。2つ目の方法は、Runspaceオブジェクトを指定します。PS (2) >$remote = New-Runspace -ComputerName コンピュータ名 PS (3) >Invoke-Exparession hostname -Runspace $remoteNew-Runspaceを使ってコンピュータ名に対応したRunspaceオブジェクトを作成します。このRunspaceオブジェクトを指定してコマンドレットを実行するだけです。つまりPowerShellリモーティングに対応したコマンドレットとは、ComputerNameパラメータとRunspaceパラメータを指定できるように拡張されたコマンドレットであると言えます。この意味で、前回にご紹介したバックグラウンドジョブ(Start-PSJob)などもリモーティングで使用することができます。 このPowerShellリモーティングは、WinRMのエンドポイントとしてPowerShell.exeを登録しています(この設定が、Configure-Wsman.ps1で行っています)。ですので、IISのようなHTTPサーバーを必要としないのです。また、ComputerNameパラメータには、コンピュータ名を配列で指定することができます。つまり1:Nの通信を行うことができるのです。よって、リモートコンピュータの管理という面では便利かなと私は思っています。 内部的な動作としては、RemoteRunspaceオブジェクトを作成して、このRemoteRunspaceの中でコマンドレットを実行しています。そしてComputerNameパラメータを指定した場合は、一時的なRemoteRunspaceオブジェクトを作成してコマンドを実行するようになっています。

2

[PS] 2.0の国際化対応機能

 PowerShell2.0でスクリプトの国際化機能が追加されています。どのような機能かと云えば、変数に格納するデータを言語識別子フォルダ(ja-JP、en-USとか)に格納しておくことで、UICultuteによって自動的に適用するデータを選択するというものです。 具体例を使って説明しましょう。以下に実行したいスクリプトファイル(world.ps1)を示します。# 変数msgTableのデフォルト定義 Data msgTable { ConvertFrom-StringData @’ helloWorld = Hello, World errorMsg = You cannot leave the username field blank. promptMsg = Please enter your username. ‘@ } param ($language) Import-LocalizedData -BindingVariable msgTable -Culture $language $msgTable 次に日本語のデータを定義したファイル(world.psd1)をja-JPフォルダに配置します。ConvertFrom-StringData @’ helloWorld = こんにちは。 errorMsg = ユーザー名は空白にできません。 promptMsg = ユーザー名を入力してください。 ‘@ 更に内容を英語にしたファイル(world.psd1)をen-USフォルダに配置します。そして以下のように実行するとカルチャによってデータの内容が切り替わります。PS (1) >.\world ja-JP #日本語を指定 Name         Value…

0

[PS] 2.0におけるWMIの機能強化

 PowerShell 2.0では、WMI関係の機能強化が行われています。どのような機能強化かと云えば、以下のようなものがあります。 Get-WmiObject:Impersonation(偽装)などのパラメータが追加された。 Invoke-WmiMethod:WMIクラスのメソッドを呼び出す機能。 Remove-WmiObject:WMIオブジェクトの削除。 Set-WmiInstance:WMIクラスのインスタンスの作成。  この中から、Invoke-WmiMethodとRemove-WmiObjectをご紹介します。最初にサンプルのコードを以下に記述します。PS (1) >$note = Invoke-WMIMethod -Path Win32_Process -Name create -Argumentlist notepad.exe PS (2) >$note __GENUS : 2 __CLASS : __PARAMETERS __SUPERCLASS : __DYNASTY : __PARAMETERS __RELPATH : __PROPERTY_COUNT : 2 __DERIVATION : {} __SERVER : __NAMESPACE : __PATH : ProcessId : 4720 ReturnValue : 0 PS (3) >$ps =…

0

[PS]バックグランド ジョブ

新年、明けましておめでとうございます。ご存じの方も多いと思いますが、PowerShell v2のCTPが2007年11月に公開されています。今回は、v2で追加されたバックグラウンド ジョブに関して記述したいと思います。バックグラウンド ジョブは、文字通りバックグラウンドでコマンドを実行する機能です。この機能に関連したコマンドレットとして、以下が提供されています。 Start-PSJob(ジョブの追加と開始) Get-PSJob(ジョブの取得) Remove-PSJob(ジョブの削除) Wait-PSJob(ジョブの一時停止) Receive-PSJob(ジョブの実行結果の取得) 使い方は簡単で、「Start-PSJob -Command “コマンド文字列”」を実行することでバックグラウンドジョブが開始されます。Start-PSJobは、PSRemotingJobのインスタンスを返します。このPSJobのインスタンスを取得するのが、Get-PSJobコマンドレットになります。 実行を開始したPSJobはバックグラウンドで動作しますので、結果を受け取るのに「Receive-PSJob -InputObject $PSJob」を実行します。これでコンソールに実行結果を受け取ることができます。 PSJobが、PSRemotingJobのインスタンスである点に注意してください。何故なら、v2からPowerShell Remoting(Windows Remote Managementが必須、VistaではSP1が必須)が導入されており、リモートのコンピュータに対する操作をバックグラウンドでできるようになっているからです。それとPowerShellのコマンド実行は、Runspaceオブジェクトのインスタンスを使って実行しますので、バックグラウンドジョブはテンポラリのRunspaceオブジェクトを作成して利用しています。オプションで独自のRunspaceオブジェクト(New-Runspaceコマンドレット)を指定することもできます。 このバックグランドジョブですが、現時点では管理者権限が必須のようです。一般ユーザー権限で実行したところ、実行が失敗するので管理者権限で試したら、正常に動作しました。  PowerShell v2 CTPを試される場合に注意していただく点が、2つあります。1つ目は、PowerShell1.0の置き換えになることです。このためインストール前に、PowerShell 1.0をアンインストールする必要があります。最後は、ヘルプに関してです。v2 CTPは英語版のため、日本語OSではヘルプを表示することができません。このため「地域と言語」を英語に設定していただくか、$PSHome\en-USフォルダをja-JPフォルダにリネームしていただく必要があります。

1

[PS] PowerShellの書籍がまもなく発売になります

Blogの更新も滞っていたのは、プライベートでも忙しかったためです。長期に渡ってプライベートの時間でPowerShellの書籍を執筆していました。この書籍もやっと最終局面に入ってきて、残すは最後のチェック作業のみになりました。私は気がつかなかったのですが、Amazonに予約販売で掲載されていました。 タイトル:プログラマブル PowerShell  ~プログラマのための活用バイブル~出版社:技術評論社ISBN:4774133329価格:2480円(税抜き)発売予定日:2008/1/9 サブタイトルが「プログラマのための」となっていますが、スクリプトを記述する人向けとするために可能な限り、文法を重視して記述しました。以下に目次を掲載します。Capter1. PowerShellとは1.1.  PowerShellの概要1.2.  PowerShellの導入1.3.  コマンド1.4.  その他の機能と特徴1.5.  インタープリタの機能1.6.  まとめChapter2. スクリプトの開発2.1.  PowerShellと.NET Frameworkの関係2.2.  PowerShell固有の癖2.3.  リテラルの定義2.4.  変数の定義2.5.  データ型2.6.  演算子(オペレータ)2.7.  フロー制御2.8.  関数2.9.  ファイル処理2.10. 例外処理2.11. デバッグ2.12. まとめChapter3. PowerShellの使い方3.1.  .NET オブジェクト3.2.  .NET流なファイル処理3.3.  正規表現3.4.  GUIアプリの開発3.5.  インターネットにアクセスする3.6.  Webサービス3.7.  XMLを使う3.8.  データベースプログラミング3.9.  COMやWMI3.10. まとめChapter4. PowerShellを活用するために4.1.  タイプシステム4.2.  コマンドレットを作る4.3.  他の言語から使用する4.3.1.  PowerShellとC#やVB         ・PowerShellからC#やVBを使用する         ・C#やVBからPowerShellを使用する4.3.2.  PowerShellとIronPython         ・PowerShellからIronPythonを使用する         ・IronPythonからPowerShellを使用する4.4.  スレッド4.5.  セキュリティ4.6.  まとめAppendix執筆時間が長かったため、PowerShell v2.0の最初のCTPも公開されてしまいました。このCTPでは、v1.0を置き換える形でインストールするためにv1.0とv2.0のサイドバイサイドの実行はできませんが、v1.0との互換性を重視しているためv1.0で作成したスクリプトのほとんどが実行できます。

4

[PS]WMIの取り扱いについて

暫く更新が滞っていました。私事で忙しかったせいですが、今回はPowerShellとWMIで気がついた点を記載します。 Windows Vistaを使ってPowerShellでインストールされたソフトウェアの一覧を表示しようとして、WMIのWin32_Productクラスを使ってみました。 PS (1) >Get-WmiObject Win32_Product Get-WmiObject : エラーです 発生場所 行:1 文字:14 + Get-WmiObject <<<< Win32_Product このようにエラーになってしまいました。一部のソフトウェアが表示される場合もありますが、必ず「Get-WmiObject : エラーです」となってしまいます。色々と調べていくと、Windows Vista のWMIのWin32_Productクラスのバグらしいということが判明しました。この情報はネットニュースのpowershellの中にありました。この内容を見ると既知のバグでVista SP1で修正される予定だと書かれています。じゃあ、他の方法を使わないとWindows Vistaでインストール済みのソフトウェアの一覧を取得できないことになります。で思いついたのが レジストリを列挙する。 Windows Installer APIを使用する。 という方法です。今回は、Windows Installer APIを使用してみたいと思います。 PS (2) >$wi = New-Object -ComObject WindowsInstaller.Installer PS (3) >$wi | Get-Member TypeName: System.__ComObject Name MemberType Definition —- ———- ———- CreateObjRef Method System.Runtime.Remoting.ObjRef CreateObjRef(…

5

[TechEd] PowerShellについて

TechEdでリリース済みの動的言語ということでPowerShellを簡単に説明しました。PowerShellで実行できるコマンドには、以下の4種類があります。 コマンドレット:PowerShell独自のコマンドで「動詞-名詞」というネーミング。 関数:一連の手続きに名前を付けたもの。 スクリプトコマンド:各種のコマンドなどをファイルに保存したもの。 ネイティブコマンド:実行可能プログラム(EXEなど)。 特にネイティブコマンドは重要で、これを使うと「cscript.exe xxxx.vbs」などのWSHのスクリプトをPowerShellの中から実行することができます。つまり、既存のスクリプト資産を移行しなくてもPowerShellで操作できるように配慮されているのです。 デモでお見せした電卓は、以下のようなものです。 これはWindows Formsを使って作成しています。このGUIを作成するときに特徴的な書き方をしているのが以下のようなコードです。,”C”+1..3+,”/”+4..6+,”*”+7..9+,”-“,0,”.”,”=”,”+”|ForEach-Object {new-button $_}   「new-button」という関数をパイプラインで呼び出しています。パイプラインに渡している配列が、ボタンに表示されている文字列なんです。もちろんFor文やForEach文で作成するという方法もありますが、パイプラインを使ってForループと同じことができるんです。PowerShellって… デモでは、このようなGUIのサンプルもお見せしましたが、PowerShellでのGUIプログラミングには、鬼門も潜んでいます。何かと言うとPowerShell.exeは、マルチスレッドで動作している点がGUIと相性が悪いのです。たとえばWindows FormsのWebBrowserコントロールなどは、シングルスレッドでないと利用することができないという制約を持っています。このようなコントロールを普通には扱えないのです。もちろん、独自のコマンドレットを使ったりすれば可能ですし、そういうコマンドレットを公開している方達もいらっしゃいます。 慣れてくると便利なツールです。PowerShellって。I-Oリダイレクションもサポートしていますし、CSVなどもサポートしていますから。色々な情報を集めてテキストファイルへ出力とかが簡単なんですね。

1

[TechEd]明日からTechEd横浜が始まります

明日から今年のTechEd Yokohamaが始まります。その準備に追われているのですが、実はまだデモの内容で悩んでいます。作成済みのデモコードを大幅に手直ししたり、新しいデモ内容を作ってみたりしています。というのも私の担当しているセッションの会場がAルームなもので、会場が広いからどのようなモノをお見せしたものかなという悩みがあるからです。このような状況ですので、さっきもデモの内容を確認したりしています。 デモのテーマとしては、以下のようなものを考えています。 現状でできること DLRのオブジェクト共有 Python ASTとDLR ASTを覗く IronRuby 1.0アルファでできること さてさて、どうしよう。

2

[ps]ByPropertyNameの便利な使い方

PowerShellのコマンドレットの引数にByPropertyNameが指定されているものがあります。これを使ったちょっと便利な使い方を牟田口さんが、まとめてくれました。使い方によっては非常に便利だと思います。 牟田口さん、丁寧にまとめて下さって有難うございます。

1

[MD3] PowerShellについて

MD3の説明でPowerShellの関数って、言語拡張のように見せれるので、中々おもしろいという話をしました。この説明で例題に取り上げたのが、「Windows PowerShell in Action」という書籍なのですが、この書籍で提供されるているサンプルをご紹介したいと思います。本自体は、500頁ちょっとありますので、読むのも大変なんですけど(私の堅い枕の1つです)。 Capter8のサンプルに「class.ps1」と「demo-class.ps1」というファイルがあります。詳細は「class.ps1」を見ていただく必要がありますが、「demo-class.ps1」で以下のような記述を行っています。 CustomClass point { note x 0 note y 0 method ToString { “($($this.x), $($this.y))” } method scale { $this.x *= $args[0] $this.y *= $args[0] } } $p = new point このコードの中で「CustomClass」「note」「method」「new」というキーワードが、実は関数として「class.ps1」で定義されています。クラスという定義方法をPowerShellは提供していませんが、上記のように関数を使用することで、あたかもオペレータを拡張したように見えます。個人的には、これって「おもしろいよなー」と思っています。 この面白ろさというかを皆さんにお伝えしたくて、MD3でPowerShellを取り上げました。それから、DownLoadセンターを見ていてPowerShellを利用する方にお勧めのドキュメントをみつけました。それは、PowerShell Graphical Help Fileです。PowerShellのヘルプのchm形式です。英語で記述されていますが、構文などの全体像を見るのに役立ちます。

1