Scripting Weblog

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

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

ニュース

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

広告

RSS表示パーツ
RSS表示パーツ

最新の記事リスト

RSS表示パーツ

書庫

日記カテゴリ

My Sites

コミュニティ

2009年7月1日 #

7/1付でMSMVP for Data Center Management - PowerShellを再受賞しました。表彰期間は1年間です。皆様のご支援の賜物です。ありがとうございます。

2004年からカテゴリは変われども6回目の受賞となりずいぶん長くなりました。

気づけばPowerShell限定のカテゴリになっていて、より一層PowerShellの情報発信を求められてるのかなぁとも思います。PowerShellをはじめいろいろなことをこれからも発信していきたいのでみなさまよろしくお願いします。

posted @ 0:32 | Feedback (13)

2009年6月30日 #

Windows Server 2008 R2ではPowerShell v2が標準機能ですが、v2の目玉の一つとしてリモートでサーバーのPSを実行できる機能があります。

詳しくは、7/4の大阪のセッションでデモを交えてお話しできると思いますが、http://technet.microsoft.com/ja-jp/magazine/2008.08.windowspowershell.aspxを読んで予習しておくのもいいかと思います。

なお、この記事が書かれたときの最新バージョンのCTP2から変更点があり、コマンドレット名が若干変わっています。

New-RunSpace→New-PSSession

push-runspace→Enter-PSSession

pop-runspace→Exit-PSSession

さて、PSRemotingはWinRM2.0を用いたリモート通信なのですが、WinRM2.0は認証にKerberos認証を用います。Active Directoryにログオンしたクライアントから

New-PSSession ServerName

のようにすると、ログオン時の認証情報が用いられ、認証され、通信が始まります。しかし、ログオン時とは異なる認証情報を送る必要がある場合もあるので、そのときは-credentialパラメータを使います。

New-PSSession ServerName -credential (Get-Credential)

のようにすると、認証ダイアログが表示されるので、ユーザー名とパスワードを入れて認証情報を送りログオンすることができます。

posted @ 23:23 | Feedback (0)

2009年6月8日 #

むたぐちです。いろいろあってご無沙汰になっていますが、ぼちぼち復活中です。

1年間更新が途絶えていたWSH連載(@IT)が再開になりました。遅くなってすみませんです。

チェック式 WSH入門
第18回 FileSystemObjectオブジェクトを利用する(3)
http://www.atmarkit.co.jp/fwin2k/tutor/cformwsh18/cformwsh18_01.html

懲りずにネタを仕込んでますが気づいた方はしれっと流してくださいw

この連載記事も次回で最終回です。 @ITのWindows Server Insiderフォーラムではいつも上位PVをキープしているようでありがとうございます。

http://www.atmarkit.co.jp/fwin2k/

また、Windows 7とWindows Server 2008 R2の標準機能(コマンドプロンプトと同様に削除もできない)となるPowerShell ver2についていち早く紹介するセッションを7/4(土)わんくま大阪勉強会でやります。ぜひご参加ください!

http://www.wankuma.com/seminar/20090704osaka30/Default.aspx

おそらく、7を入れてみて多くの人が思うことは、まずタスクバーが分からないってのと、スタートメニューのアクセサリにあるPowerShellってなんぞ?ってなると思うんですよね。タスクバーはタスクバーのプロパティを適当に設定すればVistaライクになりますが、PowerShellはいきなり見てもなんだか分からないと思いますので、基礎をざっとやって、あとはver1からの変更点をお話します。

あと6/13わんくま大阪もスタッフとして参加しますのでよろしくですv

posted @ 20:43 | Feedback (0)

2009年4月18日 #

USERS GROUP ML が終了しました。

WSHのMLは受け入れ先がないようです。

昔、WSH MLもう一個あったんですがそっちも消滅してるっぽいですねぇ・・・

さて。 うちの掲示板が色々あって停滞しているのですが、もしお手すきの方がいらっしゃったらご回答いただけると幸いです。

なお、PowerShell ML はAdmintechさんところにあります。

posted @ 22:00 | Feedback (0)

2009年4月3日 #

こんにちは。むたぐちです。ご無沙汰しております。

皆様には、とくにわんくま同盟の皆様には大変ご迷惑をおかけしてしまって申し訳ありません。

いろいろあって今は療養中です。
あまり元気ではありません。ここ数日ようやく何かしようかな、という気になったというレベルです(何か、がまだわからないのですが・・・)。とりあえず何かするなら近況報告だろうということでしてみます。

療養を続ければまた元気になると思いますので、そのときはまたブログで情報公開や、記事の執筆、勉強会運営のお手伝い、もし機会がいただけるなら講演など、と思っております。

世の中Windows 7ですね。PowerShell 2.0が乗っていると聞いて私もギリギリになってβ版をダウンロードだけはしておきました。PS2はCTP3も出ていますがいまだにPS ver 2に触れてもいないのはさすがにまずいので何とかしないとですねー。コマンドレットが100個ほど増えてるとのことで大変だなーと。

またよろしくお願いいたします。

あ、あとなんかいつのまにかMVPのカテゴリがAdmin FrameworkというよくわからないのからPowerShellになったみたいです。より一層PowerShellerとして活動せねばなりませぬな。では。

posted @ 20:19 | Feedback (1)

2009年1月4日 #

仕事・私事ともにごたごたしてまして大変なのですが、皆様のおかげでなんとか年を越せました。

今年は、いろいろ見えないところも多いんですが、やはりScript系技術を中心に追っていこうと思っています。PowerShell v2を追いたいですし、DLRというかC#4.0/VB10/.NET 4.0がスクリプトに近いものになるのか見届けたいですし。レガシなASPやWSHもまだまだ遊べそうです。本業プログラマ副業ライター趣味スクリプト、という感じでやっていこうかと。あ、ディープな趣味はhttp://winscript.jp/blog/ でw

ここでTips。

Vistaを再インストールしたんですが、OfficeのSelfCert.exeによるコード署名ができなくなってしまいました。その復旧方法。

C:\Users\ユーザー名\AppData\Roaming\Microsoft\Crypto\RSA

を削除。以上。異常になったときも試してみるといいのでは。

だいたいAppDataをバックアップするのが間違いなんですがね。副作用が多いのですが環境がすぐに復帰するので私はバックアップしてます。

posted @ 0:50 | Feedback (2)

2008年12月28日 #

Windows PowerShell V2 CTP3 がリリースされました

MSエバンジェリスト田辺さんのブログより。

私もそろそろ触らなきゃなーと思いますw
GUI環境では.NET3.5が要るとか、WinRMがいるとか、1.0と共存できないとかでなかなか触る環境を作れないでいるのですが…。

コマンドレットが倍というのがなかなか大変そうです。

CTPも3まできましたので、そろそろ機能もだいぶ固まって来る頃だと思います。逆に言えば、現状の不満を反映してもらえる最後のチャンスでもありますので、何かありましたら開発チームに直接言うか、私に言ってみてください。なんとかPowerShellチームに伝えてみますので。

Windows 7とそのサーバーには載るんでしょうかねー?

posted @ 10:04 | Feedback (0)

2008年12月20日 #

ありがちなRe: Re: Re:なサブジェクトを何とかする方法。 「Re: Re:」や「RE:Re: Re:」などのサブジェクトを「Re: 」にします。 組み込み方は前のエントリを参照

Dim reSubjectRe As New RegExp
reSubjectRe.Global = True
reSubjectRe.IgnoreCase = True
reSubjectRe.Pattern = "(?:re\d*\:\s*)+"
oMailItem.Subject = reSubjectRe.Replace(oMailItem.Subject, "Re: ")

あと知らなかったんですがOfficeには簡単にオレオレコード署名を作る方法があるんですね。これを使えばデフォルトのセキュリティ設定でThisOutlookSessionが動きます。導入の仕方はこちらを参考に。makecert.exeとか使わなくてもいいんだーへぇー

12/23追記。Re2:とかにも対応

posted @ 19:01 | Feedback (0)

2008年12月7日 #

Function GetSelfURL()
	If Request.ServerVariables("HTTPS")="on" Then
		sSelfURL = "https://"
	ElseIf Request.ServerVariables("HTTPS")="off" Then
		sSelfURL = "http://"
	End If
	sSelfURL = sSelfURL & Request.ServerVariables("HTTP_HOST") & Request.ServerVariables("PATH_INFO")
	sQuery = Request.ServerVariables("QUERY_STRING")
	If sQuery <> "" Then
		sSelfURL = sSelfURL & "?" & sQuery
	End If
	GetSelfURL = sSelfURL
End Function

環境変数PATH_INFOの意味はApacheとIISで違うのがミソですねー。このコード、DimとかすればASP.NETでも使えるけどRequest.Uriがあるからいらないですね。

IISでは"URL"と"PATH_INFO"は同じみたいですね。Apacheではhttp://hogehoge/hoge.cgi/aaa/bbb みたいにできて、PATH_INFOは/aaa/bbbの部分を返します。ASPではそもそもできないっぽいですね。ASP.NETだとできますが。その場合Request.PathInfoで取得できます。

posted @ 21:28 | Feedback (0)

レガシASPでサイトを作ってると、Shift-JISなサイトを作るのが基本になると思います。なんでかというと、FileSystemObjectが基本的にShift-JISの読み書きにしか対応しておらず(UTF-16もいけますが)、いまどきのUTF-8を使うのはちょっと面倒です(FSOの代わりにADODB.Streamを使えば行けますけどどうでしょうねー?私はあんまり好きじゃないです)。

ただ、UTF-8な他のWebサイト/サービスと連携する場合はどうしても避けて通れません。そこでレガシASPでShift-JISなページを作る際、UTF-8文字列を扱う上で知っておくべきこと。

1. escape関数を使うとShift-JISでURLエンコードがされる

ASPはだいたいVBScriptで書くと思うんですが、隠し関数であるescape関数を使うとURLエンコードができます。ですが、escape関数は呼び出し元のページコードの文字コードでエンコードします。なのでShift-JISなページで呼び出すとShift-JISのエンコードURLを出力します。(ちなみにWSHで使うとUTF-16のものになる)

JScriptのencodeURIComponent関数はどんな場合でもUTF-8文字列を出力するので、これを使うといいでしょう。使い方はこうです。

Set sc = CreateObject("ScriptControl")
sc.Language = "JScript"
Set js = sc.CodeObject
Response.Write js.encodeURIComponent("文字列") 

逆にShift-JISなページでShift-JISなエンコードURL文字列を取得したい場合は単にescape関数を呼び出せばいいです。
さらに別なケースですがUTF-8なページでShift-JISなエンコードURLを取得したい場合は、こんな関数を使うといいんじゃないでしょうか

2. XMLHTTPでPostメソッドでSendする際は必ずUTF-8でURLエンコードがされる

Set xh = CreateObject("MSXML2.XMLHTTP")
xh.Open "POST", "http://hogehoge/hoge.aspx", False
xh.Send "文字列"

このように何も考えずに書いても、勝手にUTF-8でURLエンコードされてPostされるので大丈夫です。

3. UTF-8なページのHTMLを読み込む際

標準機能だけでやろうと思うとADODB.Streamを使うしかないと思います。
ちなみに読み込むページの文字コードが不明の場合は判定した上で変換する必要がありますが、これはかなり面倒なので、BASP21を使うといいんじゃないでしょうか。

Function GetPageString(strUrl)
 Set bobj = CreateObject("basp21")
 Set oHTTP = CreateObject("Msxml2.XMLHTTP")
 oHTTP.Open "GET", strUrl, False
 oHTTP.Send
 GetPageString = bobj.Kconv (oHTTP.responseBody,4)
End Function

これは引数にURLを与えるとそのHTMLを文字列として取得します。対象の文字コードが何であってもOKなのがミソ。

4. UTF-8のURLエンコードされたクエリ、あるいはPOSTされたデータを受ける際

これのやり方が分からない!具体的にはトラックバックpingなんかを受け取る際に困ります(さすがにShift-JISでトラックバックpingを送れ!というのはゴーマンだと思います)。私はここだけASP.NETを使って逃げました。どなたかやり方わかります?

追記。Request.BinaryReadしたやつをADODB.Streamにかけたあと&でsplitして=でsplitしてDictionaryに入れてdecodeURIComponentすればいけるかな?

ただし、ここだけASP.NETを使う際にも注意が必要です。まずweb.configの<system.web>セクションに

<globalization
requestEncoding="Shift-JIS" responseEncoding="Shift-JIS" fileEncoding="Shift-JIS"/>

というのを埋め込んで、まずレスポンスエンコーディングをShift-JISにしておきます。IISの設定でもいいですが。

続いてコーディング。Request.QueryStringやRequest.Formは使えないので、Request.InputStreamを使ってごりごり読まないと駄目じゃないかな・・・。なぜかVB.NETですがUTF-8なトラックバックpingをShift-JISなページで受けるサンプルコードを。

Dim str As System.IO.Stream
Dim counter, strLen, strRead As Integer
str = Request.InputStream
strLen = CInt(str.Length)
Dim strArr(strLen) As Byte
strRead = str.Read(strArr, 0, strLen)

Dim Forms As New Dictionary(Of String, String)

For Each item As String In Split(Encoding.UTF8.GetString(strArr),"&")
    If InStr(item, "=") Then
Dim s As String() = Split(item, "=")
If s.Length = 2 And Not Forms.ContainsKey(s(0)) Then Forms.Add(s(0), HttpUtility.HtmlEncode(HttpUtility.UrlDecode(s(1), Encoding.UTF8)).Trim().Replace(vbNullChar, ""))
End If End If Next

↑自分でも謎なコードを書いてたのでちょっとマシなのに修正。コンパイル通るかどうかわかりませんが・・・さらにゴミコードが残ってたのでバッサリ切りました。

ただし!これの問題は改行コードが消えることなんです。対処法は見つけていません(勘違いでした)。もっといい方法があったら教えてください。そもそもInputStreamを使わないでRequest.Formとか使いたいんですが、Shift-JISのところにUTF-8が来るとうまくいかないですねぇー。

というわけで長々と書きましたが、Shift-JISにこだわらなければこんなに苦労することはないです。FileSystemObjectがUTF-8を読み書きできないので私はSJISにこだわってるだけです。FSOはWSHからも使いますので・・・

posted @ 18:24 | Feedback (0)