Scripting Weblog

むたぐち(牟田口大介)が、Windows上で動作するスクリプティング環境(Windows PowerShell、IronPython、Windows Script Host(WSH)、HTML Application(HTA)、Windowsサイドバー ガジェットetc)に関するニュースやサンプルコードなどを紹介します。

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  201  : 記事  1  : コメント  437  : トラックバック  41

ニュース

2009/10/17 このブログのミラーを作りました
2009/7/30 共著「PowerShellによるWindowsサーバ管理術」発売!
2009/7/1 MSMVP for PowerShell再受賞!
拙著「Windows PowerShellポケットリファレンス」2008/4/11に発売になりました!
自宅Webサーバー「winscript.jp」本格稼働

自己紹介

ライター兼プログラマでMSMVP for Data Center Management - PowerShell のむたぐち(牟田口大介)です。

MVP Logo

Microsoft MVP for Visual Developer - Scripting July 2004-June 2007
Microsoft MVP for Data Center Management - PowerShell July 2007-June 2010

広告

書庫

日記カテゴリ

My Sites

コミュニティ

2010年1月20日 #

第 19 回 Admintech.jp 勉強会(2/6,東京)でPowerShell 2.0についてしゃべります。東京でPowerShell 2.0を話すのは初めてです。ご興味のある方はぜひお越しください!(前回、大阪でしゃべったのと同様の内容です)

他にも、最近猛威をふるっているガンブラーについてのセッションや、Hyper-Vのセッションもあります。皆様、ぜひぜひお誘い合わせのうえふるってご参加ください!

2/6は名古屋ではわんくま勉強会があり、ここでもPowerShellセッションがあります。なんと全国2箇所で同日にPowerShellセッションがあるというめずらしい日なのです。こちらもぜひどうぞ。

なお、むたぐちの今後の予定ですが、3/13名古屋わんくま勉強会でPowerShellネタをしゃべります。5/29大阪わんくま勉強会ではWindows デスクトップ/サイドバー ガジェットの話をやろうかなと思っています。全国展開です。よろしくどうぞ。

posted @ 19:24 | Feedback (0)

2010年1月10日 #

こんなビルドイベントはいかがでしょうか?

copy "$(TargetPath)" C:\Windows\System32\WindowsPowerShell\v1.0\Modules\PSTweets\
start powershell -NoExit -command "Import-Module PSTweets"

PSプロバイダやコマンドレットが含まれるdll(PSモジュール)をモジュールフォルダにコピーし、モジュールを読み込んだ状態でPowerShellを起動してくれます。ただし、systemフォルダに書き込む手順があるのでVisual Studioは管理者権限で起動してください。

posted @ 17:35 | Feedback (0)

2010年1月1日 #

あけましておめでとうございます!

ついに10年代の到来です。今まで以上にプログラミングもできるライターとして躍進していきたいですね。

読者のみなさま、わんくま同盟のみなさま、編集者のみなさま、お客様、どうぞよろしくお願いいたします。

2.0になって進化したPowerShellもよろしく!

posted @ 10:40 | Feedback (4)

2009年12月9日 #

PowerShell 2.0では新しい演算子-splitと-joinがサポートされました。-splitは「文字列を特定の文字で切り分けて配列を作る」演算子、-join演算子は「配列を特定の文字列を使って繋いで一つの文字列にする」演算子です。

使い方です

$a="a,b,c,d,e" -split ","
$a[1]

これは-split演算子を使って、a,b,c,d,eという文字列を、,(カンマ)で切り分けて配列にし、2つ目の要素を取り出す例です。結果は次のようになります。

b

配列は-joinを使って一つの文字列にすることができます。先ほど作った配列を&という文字で繋げるには次のようにします。

$a -join "&"

結果は以下のようになります。

a&b&c&d&e

このように、PowerShellでもVBScriptのSplit関数やJoin関数を使った場合と同様の文字列配列操作が可能になりました。

なお、PowerShell 1.0ではこのようにします。

-split演算子の代わり。string型のインスタンスに対し、Splitメソッドを実行する。

$b="a,b,c,d,e".Split(",")

-join演算子の代わり。stringクラスのスタティックメソッドJoin()を使用。

[string]::Join("&",$b)
posted @ 20:33 | Feedback (0)

2009年12月3日 #

PowerShellには色々な演算子がありますが、その中のひとつに、ある文字列が正規表現にマッチするかどうかを判定する-match演算子というのがあります。使い方は、

"文字列" -match "正規表現"

です。たとえば、文字列にGUIDが含まれるかどうかを調べるには

"これはGUIDを含む文字列です。771d8236-9cc9-46d0-b78c-571746f81393とかね!" -match "[A-Fa-f0-9]{8}\-[A-Fa-f0-9]{4}\-[A-Fa-f0-9]{4}\-[A-Fa-f0-9]{4}\-[A-Fa-f0-9]{12}"

とすると、Trueと表示されます。

ちなみに、一度-match演算子を使うと$matchesというHashtable型のシェル変数に、マッチ情報が入ります。この場合、$matches[0]にGUIDが入ります。サブ式を定義してある場合、$matches[1],$matches[2]...にそれらの値が入ります。ただし$matchesには最初のマッチ情報しか入らないので複数のマッチがある場合はあまり使えないです。素直に

$regex=[regex]"a" 
$regex.Matches("aaa")|ForEach{$_.value}

とかしたほうがいいです。

ところで、-match演算子の左辺には実は配列も指定できます。たとえば、

 "aa1","aaa","2","b" -match "\d"

とすると、

aa1
2

と表示されます。\dは数字が含まれるという正規表現ですが、これを配列に対してかけると、True/Falseではなくマッチした配列要素を返します。これ、私知らなかったんです!なかなか便利だと思うのでぜひつかってみてください。なおこの場合$matchesには何も入りません。

posted @ 22:15 | Feedback (0)

TwitterはRESTなAPIを備えているので、httpの通信ができれば基本的にどんな言語でもクライアントを作ることができるのがいいです。そこで私もPSTweetsというPowerShell版Twitterクライアントを作っているのですが、認証周りで問題が発生しています。

Twitterの認証には標準認証とOAuthが使えるのですが、現在はセキュリティ上の理由で標準認証は非推奨です。標準認証がなぜまずいかというと、マッシュアップサービスでTwitterに対して認証が必要な操作をする場合、ユーザーがその第三者のサービスにTwitterのIDとパスワードを送らなければならないためです。そのサービスがユーザーの認証情報を安全に保持してくれる保証はありません。

そこで考えられたのがOAuthという認証方法です。OAuthはとてもややこしいプロセスを含んでいますが、実質はそんなに難しいものではないです。要は、Twitterというサービス(これをサービスプロバイダという)にアクセスするための権限を、マッシュアップやクライアントを提供する第三者(これをコンシューマという)に委譲する仕組みです。ユーザーが「コンシューマを使いたい!」と思ったら、コンシューマは「じゃあついったーのページに飛ばしますから、あなたのアカウントを私が自由に使うことを許可してね」と言います。それでユーザーがTwitterのOAuth承認ページで「許可」すると、コンシューマはユーザーのアカウント情報を使ってTwitterのAPIを叩けるようになり、ユーザーはコンシューマにTwitterのパスワードを知らせることなくコンシューマの提供するサービスを利用することができるわけです。

さて、このOAuthをコンシューマが利用するには、Twitterにあらかじめ申請する必要があります。といっても登録ページでクライアント/サービス名などを入力するだけです。そうすると、コンシューマキーとコンシューマシークレットという文字列をもらえます。これはクライアントを特定するためのユーザー名とパスワードみたいなものです。ちなみにこの情報はコンシューマを提供する人のTwitterのユーザーアカウントに紐づいています。

コンシューマを通じてユーザーがTwitterのサービスを使うには、コンシューマを通じてTwitterからアクセストークンというものを貰う必要があります。このとき、コンシューマはTwitterに毎回コンシューマキーとコンシューマシークレットを送らなければなりません。

ここでコンシューマが独立したサーバーで運営されているサービスならば何も問題ありません。ユーザーがコンシューマキーとコンシューマシークレットを知る必要もユーザーに知られる危険性もありません。ところが、デスクトップクライアントだとどうなるかというと、コンシューマはデスクトップクライアントそのものです。なので、デスクトップクライアントはコンシューマキーとシークレットを何らかの方法で取得し、Twitterに送る機構が必要になります。

ここで、いくつかの方法があると思います。コンシューマキーとシークレットをデスクトップクライアントに暗号化して埋め込むのも一つの方法でしょう。ですが、結局は復号してTwitterに送らなければならないので、その通信をキャプチャすればユーザーは知ることができます。

なぜコンシューマキーとシークレットをユーザーに知られるとまずいかというと、それらを使うとまったく別のクライアントやサービスを、そのサービス名を詐称して作ることができてしまうからです。これがどうして問題なのかというと、そうなるとOAuthの承認が有名無実化してしまうためです。ユーザーがOAuthの承認ページで承認するサービスが本物かどうか調べるすべがありません。

メール登録制にしてコンシューマキーとシークレットを配布するとか考えましたが、なんだか大昔のシェアウェアのようで、なんとかシリアル集がはびこったように誰かが漏らしてしまう危険性を考えると難しいです。

コンシューマキーとシークレットを自分で取得してもらうというのも考えましたが、それはユーザーにとってかなり敷居が高いうえ、クライアント名がみんなバラバラになってしまいます(Twitterクライアント名はユニークであるため)。

コンシューマキーとシークレットを保持し、ユーザーからのリクエストに応じてアクセストークンを発行するサーバーを立てるというのも考えましたが、それってもうデスクトップTwitterクライアントじゃなくて、Twitterマッシュアップのデスクトップクライアントになってしまいます。

なので、デスクトップクライアントでOAuthを使うのは事実上無理なんじゃないかというのが私の結論です。

標準認証でもいいんですが、現在は標準認証は非推奨であり、そのため今からクライアントを作る場合は標準認証だとクライアント名をTwitterに登録することができなくなっています(タイムラインには「APIで」という表示になってしまう)。昔はメールでクライアント名を申請できたんですが、今はできません(この体制になる前に申請されたクライアントなら、今でも標準認証でもクライアント名を名乗れます)。これから作るクライアントで、クライアント名を名乗るにはOAuth必須です。ボット作者など、コンシューマ=ユーザーの場合はそれでもいいんですが…。これはぜひなんとか改善してもらいたいところですね。といっても、Twitter側からみると、それがコンシューマからのアクセスなのか、ユーザーからのアクセスなのか、区別をするのは難しいでしょうから、デスクトップアプリに限り標準認証でもクライアント名を名乗れるようにする、というのは難しいんじゃないかという気はします。

最近、新しいデスクトップクライアントがあまり登場せず、一方でやたらTwitterのマッシュアップサイトが増えたと思いませんか?中には、それデスクトップアプリでいいじゃないというものもちらほら。もしかして、この制限ができたためなんじゃないかと邪推までしています。うーむ、なんとかならないですかねー?

posted @ 21:24 | Feedback (8)

以前、[Twitter][WSH]Twitterにポストするという記事を書いたんですが、もっと簡単にできましたので修正版。


sUser = "userid" 'ユーザーID
sPassword = "password" 'パスワード
sURL = "http://twitter.com/statuses/update.json"

Set oHTTP = WScript.CreateObject("Msxml2.XMLHTTP")
Set wshShell=CreateObject("WScript.Shell")

oHTTP.Open "POST", sURL, False, sUser, sPassword
oHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
oHTTP.setRequestHeader "X-Twitter-Client", "twitterPost.vbs"
oHTTP.setRequestHeader "X-Twitter-Client-Version", "1.0"
oHTTP.send "status=" & "テストです"

ポイントは、URLエンコードが実は必要なかったというところです。XMLHTTPは呼び出し元の文字コードに関わらず必ず文字列をUTF-8でURLエンコードしてポストするのでした。というわけでこれを使ってください。

posted @ 20:32 | Feedback (0)

2009年10月28日 #

というわけで、PowerShell 2.0が出ましたのでモジュールをなんか作ってみたいと思います。手ごろで最近熱いといえばやっぱりTwitterクライアントじゃないかなあと。というわけで題材はこれ。

設計的なもの

・PSプロバイダを実装することで実現

・よって、独自コマンドレットは必要最低限実装

・Get-ChildItemでタイムラインを表示

・タイムラインはTimeLineオブジェクトで表現

・発言はTweetオブジェクトとして表現

・TimeLineオブジェクトの中にTweetオブジェクトの配列が含まれる

・PSpathとしてはタイムラインの場合Twitter::Friendになり、発言の場合はTwitter::username\0000000とかになる

・Set-Locationでタイムライン移動(フレンドTL,リプライTL,DirectMessage,任意のユーザー)

・Get-Contentでタイムラインや発言を文字列として取得

・Invoke-Itemでブラウザを開く

・Remove-Itemで自分の発言削除

・New-Itemでポスト

・Set-ItemPropertyで発言をお気に入りに追加

・認証が必要な操作に関しては-credentialパラメータを使用。ただしデフォルト値はどこかに保持しておく

・ぱっと思いつく必要な独自コマンドレットはGet-FollowerとGet/New/Remove-Followingかな。返す値はTweetする人ということでTweeterクラスを作る

というわけで、非常にシンプルというか硬派なクライアントです。シェルでパイプラインを駆使してフィルターかけたりスクリプトを組んだり、ラッパーGUIを組んだり(!)すると色々楽しいと思います。

とりあえずモジュールのHello Worldまでメモ。

基本はPSスナップインを作るのと同じです。なので、詳細は

C#と諸々 コマンドレットの作成方法
http://csharper.blog57.fc2.com/blog-entry-55.html

をご覧ください。ここでスナップインクラスを作る、インストール、スナップイン登録という部分をまるっきり省けばOKです。

配置ですが、$pshome\Modulesに今回作るクライアント名であるPSTweetフォルダを作ります。そこにPSTweet.dllとPSTweet.psd1を配置します。psd1ファイルはこんな感じで良いようです。

@{
GUID="{847D070F-3247-46AB-BAE9-166038EFEA4B}"
Author="Daisuke Mutaguchi"
CompanyName="Winscript"
Copyright="c Daisuke Mutaguchi. All rights reserved."
ModuleVersion="1.0.0.0"
PowerShellVersion="2.0"
CLRVersion="2.0"
NestedModules="PSTweet"
RequiredAssemblies=Join-Path $psScriptRoot "PSTweet.dll"
}

あとはImport-Module PSTweetでシェルから読み込めます。

というわけでこれから作っていこうと思いますよ。

posted @ 22:19 | Feedback (1)

PowerShell 2.0のXP/Vista/2003/2008用の正式版が10/26にリリースされました。

Description of the Windows Management Framework on Windows XP, Windows Server 2003, Windows Vista, and Windows Server 2008
http://support.microsoft.com/kb/968929/en-us

結局、日本語版のインストーラーがどこにあるのか分かりにくいので直リンクをどうぞ。

2008 x86
2008 x64
2003 x86
2003 x64
Vista x86
Vista x64
XP

パッケージに関して、くわしくはこちらの記事を。

Windows PowerShell Blog : Windows Management Framework is here!
http://blogs.msdn.com/powershell/archive/2009/10/27/windows-management-framework-is-here.aspx

Shigeya Tanabe's blog : XP, Vista, Windows Server 2003, 2008 向けの Windows Powershell 2.0 が公開されました
http://blogs.technet.com/stanabe/archive/2009/10/28/powershell-for-xp-vista-ws03-ws08-released.aspx

さて、PowerShell 2.0は1.0と同居できないため、1.0がインストールされている環境だとインストーラーではねられます。まずは1.0をアンインストールしてください。2008では機能の削除、2003などではプログラムの追加と削除から、「更新プログラム」チェックをつけて「kb926140」を削除してください。

posted @ 13:49 | Feedback (0)

2009年10月22日 #

10/31 Admintech.jp大阪勉強会でPowerShell 2.0の話をします。内容的にはサーバー管理者向けに2.0の新機能を中心にPS2を概説するという感じです。わんくまで7/4しゃべった内容のRTM版対応という感じです。
http://itpro.admintech.jp/wiki/wiki.cgi?page=%C2%E817%B2%F3+Admintech%2Ejp%CA%D9%B6%AF%B2%F1

お時間があるかたでご興味のあるかた、ぜひどうぞ。
Active Directoryの大家、小鮒さんの講演が聴けます!(PowerShell 2.0のActive Directoryモジュールの話もしてくださるみたいです)

この日はWindows 7のイベントが大阪であるそうで、ちょっとかぶってしまいましたが、どちらも魅力的なイベントだと思いますのでどちらかぜひぜひ。

あと、その前の週というか今週の土曜日ですが、わんくま大阪勉強会もありますのでみなさんふるってご参加ください。グループディスカッションがあって面白そうですよ。こちらは私は今回スタッフ参加です。http://wankuma.com/seminar/20091024osaka32/Default.aspx

posted @ 6:05 | Feedback (0)