【Scripting】VBScript から PowerShell を使用する - ActiveXPoSh (ActiveX PowerShell)

全国の VBScript ファンの皆さん、こんにちは。

Scripting Life を楽しんでますか?

ちょっと前のことになりますが、PowerShell チームの blog に以下の記事が投稿されました。

Invoking PowerShell from VBScript (COM)

この記事では、VBScript から PowerShell を使用する方法として、Sapien Technologies 社が無償提供している ActiveXPosh を紹介しています。

既に InfoQ 日本語版にも掲載されていますし、何名かの Microsoft MVP の方々も blog でも紹介されていますので、ご存じの方も多いかもしれません。

VBScript から PowerShell が使うことに意味があるのか?

てか、はじめから PowerShell を使ったら?

という貴重なご意見には一切耳を貸さず、とりあえず使ってみることにします。

 

<準備>

<リファレンス>

ActiveXPoSh のリファレンスはこちら

<ちょっとだけ使ってみる>

まずは、リファレンスにも掲載されている簡単なスクリプトから。以下のスクリプトを拡張子 vbs で保存してコマンドプロンプトから実行してみてください。

Set objActiveXPosh = CreateObject("SAPIEN.ActiveXPosh") objResult = objActiveXPosh.Init( False ) If objActiveXPosh.Eval("Get-Process Winword") Then      WScript.Echo "Word is running" Else      WScript.Echo "Word is NOT running" End If

もう、何をやっているかは一目瞭然ですね。Winword 、つまりワードのプロセスが起動しているかどうかをチェックしています。

実行結果例を以下に示します。

ActiveXPosh01

ここで注目していただきたいのは、2行目です。この行で、PowerShell環境の初期化を行っていますが、必要であれば プロファイルを指定してロードすることも可能です。この行で初期化を行わないと、以下のエラーが出てコマンドレットを実行することができないので注意してください。

C:\tmp\ActiveXPoshTest.vbs(3, 1) ActiveXPosh: オブジェクト参照がオブジェクト インスタンスに設定されていません。

次に、3行目の Eval メソッドに注目してください。これは、"Get-Process Winword" の実行結果を評価するために使用します。Get-Process winword の結果、正しくオブジェクトが返されれば True に、返されなければ False となります。この場合は、Winword プロセスが返されるかどうかを判定しています。

<もちょっと使ってみる>

このままですと、vbscript でもできるじゃーん、てことになってしまうので、vbs でできないことを powershell に任せるというスクリプトを実行してみたいと思います。

以前、以下の投稿をしました。この投稿では、生パスワードを SHA1 形式で簡単に暗号化する方法が vbscript にないため、PowerShell を使って実現しています。

【IDM】Active Directory から OpenLDAP への パスワードの同期 その1 ~ パスワードを SHA1 で暗号化
https://blogs.technet.com/junichia/archive/2008/05/14/password_5F00_sync_5F00_ad_5F00_to_5F00_Openldap_5F00_1.aspx

ここで紹介している PowerShell スクリプトを ActiveXPoSh を使用して VBScript に組み込んだものが以下です。

拡張子を vbs として保存し、実行してみてください。引数に文字列を指定すると sha1 で暗号化されて表示されます。

Set Args = Wscript.Arguments If Args.Count = 0 then     Wscript.Echo Wscript.ScriptName & " "  & "<生パスワード>"     Wscript.Quit End if

strPassword = Args(0)

Set objActiveXPosh = CreateObject("SAPIEN.ActiveXPosh") objResult = objActiveXPosh.Init( vbFalse ) objActiveXPosh.OutputMode = 2

objActiveXPosh.Execute("$strPassword = '" & strPassword & "'") objActiveXPosh.Execute("$objUTF8Enc = new-object System.Text.UTF8Encoding") objActiveXPosh.Execute("$bytPassword = $objUTF8Enc.GetBytes($strPassword)") objActiveXPosh.Execute("$objCrypt = new-object System.Security.Cryptography.SHA1CryptoServiceProvider") objActiveXPosh.Execute("$bytCryptPassword = $objCrypt.ComputeHash($bytPassword)") objActiveXPosh.Execute("$strBase64Password = [System.Convert]::ToBase64String($bytCryptPassword)") objActiveXPosh.Execute("$strBase64Password")

For Each strInfo In objActiveXPosh.Output     strSha1Password = strSha1Password & strInfo     strSha1Password = strSha1Password & VbCrLf Next

WScript.Echo strSha1Password

青く色が付いている行が、PowerShell 上で実行されるコマンドです。

これで、PowerShell に心を売ることなく(意味不明ですが)、VBSripter としてのプライドを守ることができるような気がしないでもありません。

 

ここに示した例が良いかどうかはアレですが、既存の vbs でできないことを PowerShell に肩代わりさせるという意味では非常に有用なツールです。いきなりすべてのソースを PowerShell に書きかえることは難しいでしょうから、少しずつ PowerShell に移行していきたいというプロジェクトでは使えるかなと思います。

最近は PowerShell で作成したサンプルソースも多いですし、指をくわえて PowerShell の高機能性を見ているだけでなく、積極的に得意な vbscript に取り込んでいくことは良いことだと思います。

Data Protection Manager や Operations Manager 、Exchange Server 2007 など、PowerShell をベースとした管理シェルを実装した製品は増えつつありますので、是非ともこれをきっかけにして PowerShell にも挑戦してみてください。