• マイクロソフトの IT コンシューマライゼーション 全体像 1

    今回は、マイクロソフトの IT コンシューマライゼーション について、その全体像を解説します。

    1. IT を取り巻く状況の変化

    Wikipedia によれば、最初に「コンシューマライゼーション(Consumerization)」という言葉が広く一般の目に触れたのは 2001年のことだそうです。利用者サービスに重点を置いた Web 2.0 が提唱された流れの中で、利用者(消費者、コンシューマー)が活用するオンラインサービスをはじめ、個人が持つPCや携帯電話、その他のデバイスが企業のシステムの一部として活用され浸透していくプロセスをこう呼びました。

    Consumerization - Wikipedia, the free encyclopedia
    ※このサイトに掲載されている Consumerization Report 2011 は面白いので是非とも参照してください

    image_thumb[5]

    上記サイトに掲載されている Trend Micro Consumerization Report 2011(調査対象は 500人以上の従業員を持つ企業で、回答数は600とのこと)によれば、日本において個人デバイスの利用を許可している企業は、全体の 36% だそうです。これに対してアメリカでは 75%。調査対象の企業規模が不明ですが、レポート中のグラフを参照すると従業員数 1000人以上の企業を対象にしているように見えます。もっと小規模な企業を含めれば、この割合もさらに増えるものと思われますが、それでも 36% の日本企業が、従業員に個人デバイスの利用を許可しているという現状は、正直なところ驚きでした。ただし、具体的なデバイスまでは明確にされておらず、"携帯電話"による通話を許可している場合も多く含まれているものと考えられます。

    いずれにしても、国ごとにスピードの差はあれど、間違いなくコンシューマライゼーションは進行しつつあると言えるでしょう。

    そうした状況を裏付ける1つの要素と見られる記事が、Techcrunch に掲載されました。

    PC の次にくるもの:IWの半数以上が3台以上のデバイスを使用
    Here’s What “Post-PC” Looks Like: Over Half Of Info Workers Use 3 Or More Devices | TechCrunch

    ここに抜粋されているレポートは Forrester Research 社が 10,000人のインフォメーションワーカー(IW)と 2,300 人の IT "ハードウェア" 採用決定者(IT hardware decision-makers)対象に行ったものです。

    グラフをご覧いただくと一目瞭然ですが、IW の 52 %が 3台以上の(業務用または個人用の)デバイスを業務目的に使用しており(6台以上が14%!)、そのうちの 60% が仕事とプライベートの兼用であるとこのこと。そして、そうして使われている全デバイスのうち 33% が non-microsoft なデバイスだそうです。つまり、iOS、Android など...ですね。MS デバイス云々はひとまずおいておくとして、注目すべきは、既に 25% がスマートフォンおよびタブレットであるということです。こうした傾向は、今後より強まるでしょう。

    こうした背景を簡単にまとめると以下の通りです。

    image_thumb[8]

    • 1つのデバイスが業務とプライベートの両方に使われる(ユーザーはそうしたいと思っている)
      ※そのかわりプライベートでも仕事のメールが届きます
    • ユーザーの IT スキル(リテラシーとは別物)は、企業が思っている以上に進んでいる(IT 音痴なんて死語である)
      ※リテラシーが不十分なユーザーが好き放題やる怖さを想像してください。マニアが試行錯誤していた時代とは違うのです。
    • デバイスを取り巻く市場(デバイス自身や接続先のクラウドサービスなど)は変化が激しく、企業が自ら最新を追い続けることは困難である
      ※毎年新しいデバイスを貸与できますか?毎年業務プログラムに最新の SaaS を取り込めますか?
    • 災害など、平常時を超えた業務継続性を想定する必要がある
      ※少なくとも関東以西では交通以外はほぼ正常...というもどかしい状況を経験したはずです
    • 企業が「使うな」と言ったところで止められない
      ※ブレーカーが落ちるから電子レンジを使うな...といっても、大丈夫かなぁなんて言いながら使ってしまって落とすでしょう?

    当然、これらを放置すれば「社内情報の漏えい」や「デバイスの紛失」のリスクは増すばかりです。かといって、これまでのように「社内 PC の持ち出し禁止」「個人 PC の持ち込み禁止」「USBメモリの使用禁止」といった机上のルールは、今後有名無実化するでしょう。たとえ罰則を厳しくしたところで、リスクをゼロにすることはできないでしょう。

    であれば、IT 部門が舵を取るべき方向は1つです。

    利用者の要望に応えられる IT インフラを準備すべきです。もちろん、十分な安全性を備えたインフラです。

    マイクロソフトは、セキュリティをとことんまで突き詰めた IT こそが利用者のニーズに最大限にこたえられると考えています。もちろん、それは単にガチガチの IT を作るということではなく、コンシューマライゼーションとともに実装する必要があり、マイクロソフトの製品によってそれを実現できます。そうして完成した IT インフラが柔軟な働き方を実現し、それによって利用者はプライベートとのバランスを保つことができ、かつ企業は生産性の向上を得ることができるのです。理想的な IT インフラは、IT 部門だけでなく利用者のメリットを通じて、経営にも良い影響を与えます。

    image_thumb[12]

    2.フレキシブル ワークスタイルとは

    以下のスライドはフレキシブルワークスタイルのコンセプトを表したものです。

    image_thumb[22]

    フレキシブルワークスタイルは以下の3つのコンセプトから成っています。

    • どこからでも接続できる
    • どこにでも個人環境を再現する
    • 安全性と柔軟性を備えたスマートな IT 基盤

    社内であっても社外からであっても、そしてデバイスが何であろうと、同じように業務リソースにアクセスできることが、フレキシブルワークスタイルの最も基本的な考え方です。もちろん、そのためには高いセキュリティを実現する管理基盤と、クライアント OS が求められます。

    現在、多くの方が Windows XP を使用しています。インターネットを参照したり、電子メールを見たり...おそらく今以上のメリットを何も求めないのであれば Windows XP は必要十分であると言えるでしょう。

    しかし、本当に「今以上のメリット」は必要ないのでしょうか?

    そんなはずはありません。事実、BYOD(Bring Your Own Device)という言葉が出現したきたように、社内の PC を持ち出したり、自分の PC を社内で使いたいという要望が出ています。でもそれが認められないのは、Windows XP がそうした使い方に耐えうる OS では無くなってしまったということです。OS の進化は、「グラフィック」や「デバイスサポート」のみを目的としているわけではありません。時代に合ったセキュリティを実現するのも、OS の重大な役割なのです。

    Windows 7 は、まさにそうした役割を担うべく登場しました。

    image_thumb[29]

    次回は、「どこからでも接続」に挙げた3つのシナリオをベースに、フレキシブルワークスタイルを支えるテクノロジーについて解説します。

    マイクロソフトの IT コンシューマライゼーション 全体像 2

  • 【WP for IT Pros】Windows Phone のセキュリティモデル 4 ~ マルウェアからの保護

    これまでの投稿は以下の通りです。

    今回はマルウェアからの保護について。かなり概念的な内容であまり面白味のある話ではないかもしれませんが、おつきあいいただければ。

    モバイルデバイスのウィルスやマルウェアによる脅威が増えつつあります。今後企業レベルでスマートフォンの導入が進むと、IT Pro にとっては大きな脅威となりえます。

    マイクロソフトはデータ保護において「多層的な縦深防御」というアプローチをとっているということを解説しましたが、本件に関しても同様のアプローチをとっています。このアプローチは大きく以下の2点に分けられます。

    • Windows Phone OS 自身のアーキテクチャによりアタック面を最小限に抑える
    • アプリケーションの配布プロセスにより Windows Phone からマルウェアの脅威を遠ざける

    上記を踏まえ、具体的に解説します。

    ■ アプリケーションプラットフォームとしてのアプローチ

    IT Pro の方にはなじみが薄いかもしれませんが、マイクロソフトが提供するアプリケーションの開発環境は「.NET Framework」と呼ばれています。これは同時に、アプリケーションの実行環境でもあります。

    Windows Phone のアプリケーションプラットフォームは Silverlight と XNA ですが、いずれも .NET 環境で広く使われているテクノロジーであり、これらはマネージコード(Managed Code)フレームワークです。.NET プラットフォームは開発者に対してコントロールされた API セットを提供するものであり、OS へのネイティブなアクセスが行えないように設計されています。

    image

    Windows Phone のアプリケーション開発者に対して .NET のみのマネージドコードによる開発を要求することは、若干の自由度を奪う側面もあるにせよ、開発者の生産性を高め、アプリケーションの安定性を維持できます。.NET フレームワークを適切に使用することで、入力補助機能や安定性チェック、メモリ管理機能などにより、プログラムエラーを回避したり最小限に抑えることができます。

    既に述べたように、Windows Phone のセキュリティアーキテクチャはチャンバー(区切られた部屋)という考え方に基づいています。チャンバーにより、それぞれのアプリケーションの境界が定義され、お互いのメモリを書き換えたりストレージ内のデータを更新することを防ぐことができます。また、全ての Windows Phone アプリは、はじめから分離ストレージへのアクセス権を含め基本的なパーミッションは持っているものの、センサーへのアクセスなどの権限についてはアプリケーションの要求に応じて利用者が承認することで与えられます。ただし、必要な権限はアプリケーションを実行する前に利用者に提示する必要があり、アプリケーションが実行中にその権限を昇格させることはできません。

    Windows Phone は、アプリケーションに対し、ファイル転送などのバックグラウンドプロセスを実行させるようなエージェントの組み込みを許可しています。しかし、だからといってバックグラウンドで実行させることを許可しているわけではありません。ユーザーがアプリケーションを切り替えると、以前ユーザーが使用していたアプリケーションは休止します。このデザインによって、アプリケーションが休止中にリソースを食いつぶしたり、知らずにアタックを受けることから防御しています。

    ■ Internet Explorer Mobile のロックダウン

    ウィルスは、感染したウェブサイトにアクセスするだけでダウンロードされてしまうので、マイクロソフトはブラウザ自信の安全性を可能な限り高めるようなアプローチをとっています。

    Windows Phone には IE9 のモバイルバージョンが実装されています。IE はサンドボックス環境で最小限の権限を持って動作し、他から構成できないようになっています。加えて、IE 上の WEB アプリケーションは他のアプリケーションからアクセスできないようになっています。もちろん、ブラウザを経由してアプリケーションのインストールは行えないので、インターネットからマルウェアや危険なソフトウェアが IE を介してダウンロードされることはありません。

    ■ Windows Phone Update による重要なセキュリティ更新

    Windows Phone Update サービスは、Windows Phone OS を更新するための唯一の手段です。マイクロソフトは、ハードウェアベンダーや携帯電話事業者、そしてWindows Phone のエンジニアリングチームが作成した機能更新パッチやバグフィックスを管理して配布しています。

    加えて、Windows Phone チームは、業界をリードする Microsoft Security Response Center(MSRC)とともに、セキュリティレビュープロセスを開発しました。このプロセスにより、もし大きなインパクトを与える可能性がある問題が発見された場合でも、全ての Windows Phone に重要なセキュリティ更新を配布することができます。

    image

    ■ Windows Phone Marketplace によるアプリケーション配布の制御

    Windows phone のアプリケーションは、Windows Phone Marketplace を経由してインストールすることができます。その他の経路は用意されておらず、サイドローディングやブラウザからのインストールはサポートされていません。

    Marketplace に登録されている全てのアプリケーションは、Windows Phone ユーザーに提供される前にその安全性が評価され、認定がなされます。アプリケーションの評価と認定のプロセスでは、不適切なコンテンツかどうかのチェック(アダルトコンテンツを含んでいないかなど)、セキュリティチェック、マルウェアに対する耐性などがチェックされます。

    マルウェアは、その大部分がインターネット上に存在しますが、一方であまりセキュリティを考慮していないアンマネージドな環境で開発されたアプリケーションが、知らず知らずのうちにマルウェアの発信源となってしまう可能性もあります。認定されたアプリケーションは、認定プロセスにおいて厳密なチェック後に署名されたことの証であり、Windows Phone 上にインストールされて正しく動作するための要件を満たしていると言えます。

    image

  • 【PowerShell】「仮想マシン」か「物理マシン」かを見分ける 2 ~ (2012.2.15 15:36 追記)

    ※ 2012.2.15 VMWare Workstation 6.5 – 7.x に関して追記しました(最後尾)
    ※ 2012.2.15 VMWare ESXi 4.1 に関して追記しました(最後尾)
    ※ 2012.2.14 VMWare Workstation 8 に関して追記しました(最後尾)

    前回の投稿は以下の通りです。

    【PowerShell】「仮想マシン」か「物理マシン」かを見分ける 1

    前回の投稿では、Windows PowerShell を使用して「仮想マシン」か「物理マシン」を見分ける方法についてご紹介しました。方法といっても、たった1行のスクリプトですが。

    では、さらに一歩踏み込んで、どんなタイプの仮想マシンなのかを判断することはできないでしょうか?

    そのヒントとなるスクリプトが Microsoft Deployment Toolkit  2012(MDT 2012) Beta で提供されていました。

    ためしに、上記サイトから MDT 2012 Beta をダウンロードしてインストールしてみてください。以下のスクリプトが見つかるはずです。

    C:\Program Files\Microsoft Deployment Toolkit\Templates\Distribution\Scripts\ZTIGather.wsf

    ※以前のMDTにも含まれていますので無理にダウンロードする必要はありません

    以下にスクリプト内から GetVirtualizationInfo という Function を抜粋したものを掲載します。簡単にコメントも追記しておきました。ここに、さまざまな仮想化プラットフォームの識別方法が vbs で書かれています。重要なのはスクリプト内で赤く太字にした部分です。WMI の Win32_ComputerSystem Win32_BIOS を使用していることがわかります。つまり、Win32_ComputerSystem の Model プロパティで大まかに仮想化ベンダーを判定し、さらに Win32_BIOS の Version プロパティを使用してマイクロソフトの製品名を特定しています。

    ※ZTIGather.wsf 抜粋(スクリプト言語は VBS です)

    '//---------------------------------------------------------------------------
    '//  Function:    GetVirtualizationInfo()
    '//  Purpose:    Get virtualization details
    '//---------------------------------------------------------------------------
    Function GetVirtualizationInfo

        Dim oInstance, oInstances
        Dim sVersionString
        Dim bIsVM, sVMPlatform
        Dim sVMHost, sVMName

        oLogging.CreateEntry "Getting virtualization info", LogTypeInfo

        ' Set variables based on the capabilities of the hardware

        oEnvironment.Item("IsHypervisorRunning") = oUtility.ConvertBooleanToString(oUtility.BDDUtility.IsHypervisorRunning)
        oEnvironment.Item("SupportsVT") = oUtility.ConvertBooleanToString(oUtility.BDDUtility.SupportsVT)
        oEnvironment.Item("SupportsNX") = oUtility.ConvertBooleanToString(oUtility.BDDUtility.SupportsNX)
        oEnvironment.Item("Supports64Bit") = oUtility.ConvertBooleanToString(oUtility.BDDUtility.Supports64Bit)
        If oUtility.BDDUtility.SupportsVT and oUtility.BDDUtility.SupportsNX and oUtility.BDDUtility.Supports64Bit then
            oEnvironment.Item("SupportsHyperVRole") = "True"
        Else
            oEnvironment.Item("SupportsHyperVRole") = "False"
        End if

        ' Determine what virtual machine environment this might be.  Get the BIOS version information

        Set oEnvironment = objWMI.ExecQuery("Select * from Win32_ComputerSystem")

        Set oInstances = objWMI.ExecQuery("Select * from Win32_BIOS")
        For each oInstance in oInstances
            sVersionString = oInstance.Version
        Next

        ' Check the BIOS version information against known values

        bIsVM = false
        sVMPlatform = ""

       If oEnvironment.Item("Model") = "Virtual Machine" then

            ' Microsoft virtualization technology detected, assign defaults

            sVMPlatform = "Hyper-V"
            bIsVM = true

            ' Try to determine more specific values

            Select Case sVersionString
            Case "VRTUAL - 1000831"
                bIsVM = true
                sVMPlatform = "Hyper-V Beta or RC0"
            Case "VRTUAL - 5000805", "BIOS Date: 05/05/08 20:35:56  Ver: 08.00.02"
                bIsVM = true
                sVMPlatform = "Hyper-V"
            Case "A M I  - 2000622"
                bIsVM = true
                sVMPlatform = "VS2005R2SP1 or VPC2007"
            Case "A M I  - 9000520"
                bIsVM = true
                sVMPlatform = "VS2005R2"
            Case "A M I  - 9000816", "A M I  - 6000901"
                bIsVM = true
                sVMPlatform = "Windows Virtual PC"
            Case "A M I  - 8000314"
                bIsVM = true
                sVMPlatform = "VS2005 or VPC2004"
            End Select

            ' Try to get the VM host from the integration components

            sVMHost = ""
            On Error Resume Next
            sVMHost = oShell.RegRead("HKEY_LOCAL_MACHINE\Software\Microsoft\Virtual Machine\Guest\Parameters\PhysicalHostNameFullyQualified")
            If Err then
                oLogging.CreateEntry "The VM physical host name was not found.", LogTypeVerbose
            Else
                oEnvironment.Item("VMHost") = sVMHost
            End if
            On Error Goto 0

            ' Try to get the VM namefrom the integration components

            sVMName = ""
            On Error Resume Next
            sVMName = oShell.RegRead("HKEY_LOCAL_MACHINE\Software\Microsoft\Virtual Machine\Guest\Parameters\VirtualMachineName")
            If Err then
                oLogging.CreateEntry "The VM name was not found.", LogTypeVerbose
            Else
                oEnvironment.Item("VMName") = sVMName
            End if
            On Error Goto 0

        ElseIf oEnvironment.Item("Model") = "VMware Virtual Platform" then

            ' VMware detected

            sVMPlatform = "VMware"
            bIsVM = true

        ElseIf oEnvironment.Item("Model")  = "VirtualBox" then

            ' VirtualBox detected

            bIsVM = true
            sVMPlatform = "VirtualBox"

        ElseIf oEnvironment.Item("Make")  = "Xen" then

            ' Xen server detected

            bIsVM = true
            sVMPlatform = "Xen"

        Else
            oLogging.CreateEntry "This computer does not appear to be a virtual machine (BIOS is '" & sVersionString & "').", LogTypeInfo
        End if

        ' Set the appropriate variables

        oEnvironment.Item("IsVM") = oUtility.ConvertBooleanToString(bIsVM)
        If sVMPlatform <> "" then
            oEnvironment.Item("VMPlatform") = sVMPlatform
        End if

        oLogging.CreateEntry "Finished getting virtualization info", LogTypeInfo

    End function

    上記のスクリプトをごく簡単に PowerShell に書き換えたものが以下の通りです。

    MS 製品と XEN は概ね確認しましたが、VMWare と VirtualBOX は確認しておりません。

    どなたか、間違いがあればご指摘いただけるとうれしいです。

    $oEnvironment = Get-WmiObject Win32_ComputerSystem
    $oInstance = Get-WmiObject Win32_BIOS

    if ($oEnvironment.Model -eq "Virtual Machine") {
        $vmPlatform = "Microsoft"
        switch($oInstance.Version) {
        "VRTUAL - 3000919" {$vmPlatform =  $vmPlatform + " Windows Server 2008 R2 Hyper-V"}
        "VRTUAL - 5000920" {$vmPlatform =  $vmPlatform + " Windows Server 2008 Hyper-V"}
        "A M I  - 2000622" {$vmPlatform =  $vmPlatform + " VS2005R2SP1 or VPC2007"}
        "A M I  - 9000520" {$vmPlatform =  $vmPlatform + " VS2005R2"}
        "A M I  - 9000816" {$vmPlatform =  $vmPlatform + " Windows Virtual PC"}
        "A M I  - 6000901" {$vmPlatform =  $vmPlatform + " Windows Virtual PC"}
        "A M I  - 8000314" {$vmPlatform =  $vmPlatform + " VS2005 or VPC2004"}   
        default {$vmPlatform =  $vmPlatform + "?????"}
        }
    } elseif ($oEnvironment.Model -eq "VMware Virtual Platform") {
        $vmPlatform = "VMWare"
    } elseif ($oEnvironment.Model -eq "VirtualBox") {
        $vmPlatform = "Oracle VM VirtualBox"
    } elseif ($oEnvironment.Model -eq "HVM domU") {
        $vmPlatform = "Xen"
    } else {
        $vmPlatform = "unknown platform"
    }

    $vmPlatform
     

    Xen については AWS の環境を借りて確認しました(クラウドって超便利!)。

    image

    単にベンダー識別するだけならば、Manufacture を見ればよさげですね。

    参考までに、以下もご覧ください。

    [Windows 7] XP Mode か実機か Virtual PC か Hyper-V か見分ける方法とは? - 管理���は見た!~AD と ILM 一家の秘密~ - Site Home - TechNet Blogs

    ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

    2012.2.14 23:36 追記

    @YoshihiroOkabe さんが VMWare Workstation 8 で検証してくださいました。

    その結果、Model = Virtual Machine (← MS製品と同じ)であることが判明。全製品同様というわけでは無いと思われますが、少なくとも Manufacture も判断材料に入れないと正確には識別できないことがわかりました。

    image

    ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

    2012.2.15 0:16 追記

    @GUCHI2010 さんが VMWare ESXi4.1 で検証してくださいました。

    こちらは、Model = "VMware Virtual Platform" になるとの情報をいただきました。

    ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

    2012.2.15 15:43 追記

    えぬなんとかわーるど の 山市良さんからも情報をいただきました

    ※詳しくはコメント欄をご覧ください

    (ご参考)山市良のえぬなんとかわーるど: 仮想マシンのホスト環境をゲストからどこまで識別できるのか?

  • 【PowerShell】「仮想マシン」か「物理マシン」かを見分ける 1

    意識的に PowerShell の投稿を増やしております。まだ Windows PowreShell 未経験のみなさん、始めるなら今ですよ!

    さて、さまざまな場面に PowerShell が浸透しつつありますし、今後もそれが加速するわけですが、最も基本的なシチュエーションの1つに「仮想環境」か「物理環境」かを識別したい...という場合があります。

    最も簡単な方法は、WMI に用意されている win32_computersystem です。

    WMI に拒絶反応を示す方もいらっしゃるかもしれませんが、使い方は超簡単です。

    PowerShell コンソールから以下のように入力してください。

    PS C:\> (get-wmiobject win32_computersystem).model
    Virtual Machine

    上記は Hyper-V 上の仮想マシン上で実行した結果です。結果もシンプルです。

    物理マシン上で実行すると以下のような答えが返されます。

    PS C:\>  (get-wmiobject win32_computersystem).model
    4270CTO

    「4270CTO」って何ぞや?

    これは、物理マシンのモデル名ですね。

    Lenovo - ノートパソコン ThinkPad W520 公式直販サイト – Japan

    物理マシンか仮想マシンかを判断するのであれば、このように win32_computersystem の回答が「Virtual Machine」かどうかを判断すれば OK です。

    え?Virtual PC か Hyper-V かを見分けたい???

    できなくはありません。それについては次回。

  • 【PowerShell】sendkeys で日本語を送りたい

    以前、こんな投稿をしました。

    【PowerShell】WEB ページをアーカイブする

    この投稿の中では、PowerShell を使用して WEBサイトを MHT ファイルに保存する方法について書いたわけですが、ある方から質問をいただきました。

    ファイル名を日本語で入力するにはどうしたらよいか?」

    なんとするどい質問でしょう。

    そうなんです。vbs 使いには昔から有名な話ですが、sendkeys メソッドって日本語が正しく送れないのです。

    例えば以下のようなスクリプトを実行したとします。これは、$url を mht 形式で保存するスクリプトなのですが、「Web ページの保存」ダイアログに対して Sendkeys メソッドでキーシーケンスを送っています。

    $url = "http://www.microsoft.com/"
    $title = "abcdefg1234 マイクロソフト 安納 順一"
    $code = '$WShell = New-Object -comobject WScript.Shell; '
    $code = $code + '$WShell.AppActivate(''Web ページの保存'', $true); '
    $code = $code + '$WShell.SendKeys(''%T'') ; '
    $code = $code + '$WShell.SendKeys(''{DOWN}'') ; '
    $code = $code + '$WShell.SendKeys(''{UP}'') ; '
    $code = $code + '$WShell.SendKeys(''{UP}'') ; '
    $code = $code + '$WShell.SendKeys(''{DOWN}'') ; '
    $code = $code + '$WShell.SendKeys(''{ENTER}'') ; '
    $code = $code + '$WShell.SendKeys(''%N'') ; '
    $code = $code + '$WShell.SendKeys('''+ $title + ''') ; '
    $code = $code + '$WShell.SendKeys(''%S'')'
    $ie = New-Object -ComObject InternetExplorer.Application
    $ie.Navigate( $url )
    while ($ie.ReadyState -ne 4) { Start-Sleep -Milliseconds 100}
    Start-Process powershell.exe -argument ('-version 2.0 -noprofile -windowstyle hidden -command "{0}"' -f $code)
    $ie.ExecWB(4,0,$null,[ref]$null)

    これを実行すると、ファイル名には以下のような文字列が入力されます。

    image

    そう、日本語が正しく入らないのですねぇ。

    じゃ、どうするか。

    検索エンジンを使っていただくといろんな回答が出てきますが、一番簡単なのは clip.exe でしょう。っていうか、書式がシンプルなので個人的に好きです。

    clip.exe を使用すると、文字列をクリップボードにコピーすることができます。以下のように使います。

    echo "ほげほげ" | clip.exe

    これで「ほげほげ」という文字列がクリップボードにコピーされたので、^v を使ってペーストすればよいわけですね。なお「^」は Controlキーのシーケンスです。

    スクリプトを修正すると以下の通りです。

    $url = "http://www.microsoft.com/"
    $title = "abcdefg1234 マイクロソフト 安納 順一"
    $title | clip.exe
    $code = '$WShell = New-Object -comobject WScript.Shell; '
    $code = $code + '$WShell.AppActivate(''Web ページの保存'', $true); '
    $code = $code + '$WShell.SendKeys(''%T'') ; '
    $code = $code + '$WShell.SendKeys(''{DOWN}'') ; '
    $code = $code + '$WShell.SendKeys(''{UP}'') ; '
    $code = $code + '$WShell.SendKeys(''{UP}'') ; '
    $code = $code + '$WShell.SendKeys(''{DOWN}'') ; '
    $code = $code + '$WShell.SendKeys(''{ENTER}'') ; '
    $code = $code + '$WShell.SendKeys(''%N'') ; '
    $code = $code + '$WShell.SendKeys(''^v'') ; '
    $code = $code + '$WShell.SendKeys(''%S'')'
    $ie = New-Object -ComObject InternetExplorer.Application
    $ie.Navigate( $url )
    while ($ie.ReadyState -ne 4) { Start-Sleep -Milliseconds 100}
    Start-Process powershell.exe -argument ('-version 2.0 -noprofile -windowstyle hidden -command "{0}"' -f $code)
    $ie.ExecWB(4,0,$null,[ref]$null)

    これで、めでたくファイル名に日本語が入りました。

    image

    このように、.NET Framework を駆使しなくても、1行追加するだけで実装できてしまいます。

    clip.exe コマンド、便利ですねぇ。