July, 2011 - フィールドSEあがりの安納です - Site Home - TechNet Blogs

フィールドSEあがりの安納です

Microsoft Evangelist -- Junichi Anno

July, 2011

  • 【PowerShell】(更新)PowerShell から Facebook にアクセスしてみる~Facebook PowerShell Module

    2011.8.25 Facebook PowerShell Module のバージョンアップに伴いリライトしました

    CodePlex に以下の SDK とモジュールが公開されています。

    後者を見てざわざわしたものを感じた方は、完全に PowerShell にやられていると言って過言ではないでしょう。

    理屈は追って説明することにして、まずは使ってみましょう。

    以下をクリックして、Facebook PowerShell Module をダウンロードしてください。SDK はひとまず必要ありません

    image←クリックしてダウン��ード

    ダウンロードしたファイルは ZIP形式になっているので、適当な場所(c:\tmp 等)に解凍したファイルを保存しましょう。

    含まれているファイルは以下の通りです。
    • Facebook.dll
    • Facebook.pdb
    • Facebook.ps1
    • Facebook.psd1
    • Facebook.psm1
    • Facebook.xml
    • FacebookExamples.ps1
    • FacebookPSModule Alpha 0.3.3.msi ← インストーラー
    • Microsoft.Contracts.dll

    インストールは簡単です。

    上記の FacebookPSModule Alpha 0.3.3.msi を実行するだけです。

    インストールが完了すると、以下のように、プロファイル内に Facebook というフォルダが作成され、必要なファイルがコピーされます。

    C:\Users\<ユーザー名>\Documents\WindowsPowerShell\Modules\Facebook

    さて、ここまでできたらいよいよ触ってみましょう。

    [スタートメニュー] – [アクセサリ] – [Windows PowerShell] から [Windows PowerShell ISE] を開いてください。なぜ、通常の PowerShell コンソールじゃだめなのかというと、このコマンドレット、ウィンドウを使うのです(理由は後でわかります)。ウィンドウを使用する場合には、powershell.exe –STA でコンソールを起動すればOKなのですが、なぜかこれではうまく動作せず...なので悩んでも仕方ないので今回は ISE を使用します。

    ISE を起動したら、まずは Import コマンドで Facebook コマンドレットを読み込みます。以下のコマンドを入力してください。

    PS C:\> Import-Module facebook

    さらに、以下を入力してコマンドレットの一覧を確認しましょう。「新規追加」と書いているのは、alpha v 0.2 から新たにサポートされたコマンドレットです。

     

    PS C:\> Get-Command –Module facebook

    CommandType Name Definition
    ----------- ---- ----------
    Function    Add-FBEvent           ...
    Function    Add-FBPhoto           ... 新規追加
    Function    Clear-FBConnection    ...
    Function    Convert-FBJSON        ...
    Function    Convert-FBJSONHash    ...
    Function    Get-FBAlbums          ...
    新規追加
    Function    Get-FBAssociation     ...
    Function    Get-FBConnection      ...
    Function    Get-FBEvents          ...
    Function    Get-FBFeed            ...
    Function    Get-FBFriends         ...
    Function    Get-FBObjectData      ...
    Function    Get-FBPosts           ...
    新規追加
    Function    Get-FBRawData         ...
    Function    New-FBConnection      ...
    Function    New-FBFeed            ...
    新規追加
    Function    Read-FBConnection     ...
    Function    Write-FBConnection    ...

    ここまではOKでしょうか?

    では Facebook に接続してみます。細かな理屈は追って解説します。

    PS C:\> New-FBConnection

    すると、Facebook へのログオン画面が表示されるのでログオンしましょう。

    image

    ユーザーの認証が完了すると、今度は以下の画面が表示されます。これはアプリケーションに自分自身のデータへのアクセスを認可する画面です。

    image

    ここで[許可する]をクリックすれば、以降、コマンドレットから Facebook 上に保存されている自分のデータにアクセスすることができます。

    [拒否]すれば、もちろんアクセスできません。

    Facebook から見ると、「Test_Application_jonn_msft」というアプリケーションに対して認可するように見えています。jonn とは、この Facebook PowerShell Module の作者です。

    [許可する] をクリックすると、OAuth2 による認可プロセスが処理され、Facebook からアプリケーション(この場合は Facebook Powershell Module)に対して「アクセストークン」が返されます。

    PS C:\> New-FBConnection

    AccessToken
    ---------------
    99999999999999|de66c7d65c96d39cd580aaa.xxxxxxxxxxxxxxxxxxxxxx... 

    「アクセストークン」とは、Facebook Powershell Module がユーザーの情報にアクセスするためのチケットのようなものです。このアクセストークンが無いと、ユーザー情報にはアクセスできません。

    アクセストークンは %LOCALAPPDATA%\FacebookPowerShellModule_CachedToken.txt というファイル内に生テキストで保存されます。このファイルが流出すると他のプログラムから自分自身の情報にアクセスできてしまうので、くれぐれも取扱いには注意しましょう。

    アクセストークンに関する詳細な解説は別の投稿で行うことにします。

    さっそく ISE の画面から以下のコマンドレットを入力してみましょう。     

    >Get-FBFriends |Sort-Object name

    id                                                                                  name  
    --                                                                                  ----  
    1000017xxxxxxxx                                                                     Ai xxxxxxx
    100xxxxxxx                                                                          Aki xxxxxxxx  
    183xxxxxxx                                                                          Akihiro xxxxxxxx
    112xxxxxxx                                                                          Akiko xxxxxxxx
    105xxxxxxx                                                                          Akiko xxxxxxxx
    10000090xxxxxxx                                                                     Akiko xxxxxxxx
       ・                               
       ・              

    何をしているかは一目瞭然ですよね。自分の Facebook 上の友達(なんか悲しい表現だな..)の一覧を取得して表示しています。その際に、Sort-Object を使用して、nameでソートしています。

    [id] とは Facebook 上の ID です。Facebook 上の一切のオブジェクト(ユーザー、写真、投稿したコメント、その他もろもろ)には必ず識別するための ID がついています。友達の詳細な情報を取得するときにも、この ID を使用します。

    PowerShell なので、当然、こんなこともできます。便利ですね。

    PS C:\> (Get-FBFriends).count
    315

    友達の ID を取得できることがわかったので、今度は特定の友達の詳細な情報を見てみましょう。先ほど取得した ID を使用します。

    PS C:\> Get-FBObjectData -Id "100002xxxxxxxx"

    relationship_status : Single
    id                  : 100002xxxxxxxxx
    last_name           : Taro

    name                : Yamada Taro
    bio                 : SI屋でコードを書きたいのにかけなくてうずうずしながら若さゆえの情熱を持て余す日々。この熱くほてった体を誰かしずめてぇぇぇぇ!
    first_name          : Yamada
    link                :
    http://www.facebook.com/profile.php?id=100002xxxxxxxxxx
    updated_time        : 2011-04-21T15:11:27+0000
    locale              : ja_JP
    gender              : male

    結果を見ると、独身の日本人男性で、少々変○であることがわかります。また、最終更新日が4月21日と、最近ごぶさたなこともわかりますね。こうした情報は、「友達」だから見えるのであって、誰でも彼でも見えるわけではありません。

    なお、Facebook のプロフィールにはもっとたくさんの情報を登録することができます。この方の場合は、必要最小限の情報のみが登録されているようです。

    例えば、私の情報を参照すると以下のように表示されます。-Id に “me” と指定していますが、Facebook では自分自身(認証済ユーザー)は”me” で表現することができます。便利ですね。

    PS C:\> Get-FBObjectData -Id me

    verified          : True
    gender            : male
    last_name         : Anno
    hometown          : @{id=11274xxxxxxxxxx; name=Utsunomiya-shi, Tochigi, Japan}
    email             : junichia@xxxxxxxxxx
    birthday          : 10/02/1968
    link              :
    http://www.facebook.com/profile.php?id=72xxxxxxx
    religion          : 八百万の神々
    locale            : ja_JP
    updated_time      : 2011-07-13T11:57:21+0000
    name              : Junichi Anno
    id                : 72xxxxxxx
    languages         : @{id=109549852396760; name=Japanese}
    work              : {@{position=; start_date=2007-04; end_date=0000-00; employer=}, @{start_date=1991-04; end_date=2007-04; employer=}}
    education         : {@{school=; year=; type=High School}, @{school=; type=College; year=; concentration=}}
    political         : 秘密
    first_name        : Junichi
    favorite_athletes : @{id=175405739162732; name=いません}
    location          : @{id=108279402527734; name=Oyama-shi, Tochigi, Japan}
    timezone          : 9
    bio               : 日本マイクロソフトでエバンジェリストをやってます。どうぞよろしくお願いいたします。

    全ての友達の全てのプロフィールと一気に取得する...なんて場合には以下のように記述することもできます。一度友だち全員のプロフィールを確認して、うかつに「承認」してしまったことを後悔してみるのも悪くありません。

    PS C:\> Get-FBFriends | Get-FBObjectData

    さて、Facebook の醍醐味は、単に自分自身のプロフィールを登録するだけでなく、さまざまな付帯情報を管理できる点にあります。付帯情報とは、「友達」、「投稿」「好きな映画」「いいね!」などなど。これらはまとめて「Connection」と呼ばれています。

    Connection には以下のようなタイプのデータがあります。

    • friends:友だち
    • home:ニュースフィード
    • feed:ウォール
    • likes:いいね
    • movies:映画
    • music:音楽
    • books:本
    • notes:ノート
    • permissions:プライバシー設定
    • photos:写真のタグ
    • albums:アルバム
    • videos:ビデオ
    • videos/uploaded:ウォールにアップロードしたビデオ
    • events:イベント
    • groups:グループ
    • checkins:チェックイン
    • television :テレビ
    • Games :ゲーム
    • Links :ウォールに投稿したリンク

    これ以外にもまだあるはずですが、ちょっと時間が無いのでここまで。

    Connectionタイプの情報を取得するには、Get-FBAssociation コマンドレットを使用します。

    以下は、私が過去に「いいね!」したオブジェクトの一覧です。「いいね!」した日付順に並べています。

    PS C:\> Get-FBAssociation -Id "me" -Type "likes" | Sort-Object created_time

    id                                        name                                      created_time                              category                                
    --                                        ----                                      ------------                              --------                                
    70424008437                               Bing                                      2009-08-22T11:29:37+0000                  Product/service                         
    216311481960                              Bill Gates                                2010-01-19T23:19:28+0000                  Business person                         
    45043912843                               The Official Microsoft MVP Community      2010-05-16T16:59:50+0000                  Product/service                         
    350065477608                              Reading Books                             2010-05-25T01:55:10+0000                  Interest                                
    109592195726412                           Travel                                    2010-05-25T01:55:10+0000                  Interest                                
    115605528452545                           New Technologies                          2010-05-25T01:55:10+0000                  Interest                                
    105613102805639                           Ancient Egypt                             2010-05-25T01:55:11+0000                  Interest                                
    118998374823947                           Agile_Cat                                 2010-10-26T06:16:51+0000                  Website                                 
    167767416591965                           Security-Talk by Cozax                    2010-12-25T04:54:53+0000                  Product/service                         
    2231777543                                Twitter                                   2011-01-07T09:53:58+0000                  Application                             
    129722657098394                           パソナテック/エンジニアカフェ            2011-03-05T06:32:09+0000                  Company                                 
    2345053339                                Developer                                 2011-03-06T12:35:34+0000                  Application                             
    367560701743                              Oasis Hotel in Luxor, Egypt               2011-04-10T02:16:50+0000                  Hotel                                   
    186856198023415                           インストールマニアックス                  2011-04-24T23:22:20+0000                  Product/service                         
    162097640518419                           cloud-girls-mix on Ustream                2011-04-24T23:28:45+0000                  Website                                 
    126395117437023                           Microsoft Developer Forum 2011            2011-05-19T06:51:11+0000                  Software                                
    185004258197188                           Zero Day                                  2011-05-26T08:21:55+0000                  Book                                    
    179334845437863                           栃木県立宇都宮高等学校                    2011-05-29T04:32:47+0000                  School                                  
    147999988604983                           WPdevday on Ustream                       2011-06-08T04:30:48+0000                  Website                                 
    115800991838559                           ASUS Japan                                2011-06-18T04:27:59+0000                  Computers/technology                    
    233115383381196                      日本マイクロソフト UX チーム           2011-06-22T16:21:07+0000                  Product/service                         
    105787369511635                           wp-arch on Ustream                        2011-06-23T03:18:29+0000                  Website                                 
    171192329606787                           Microsoft Developer Forum 2011 Japan o... 2011-06-23T04:56:09+0000                  Website                                 
    212572792111675                           Tech Fielders セミナー on Ustream             2011-06-23T06:12:51+0000                  Website                                 
    186400324743207                           Imagine Cup Japan | イマジンカップジャパン           2011-06-30T05:01:46+0000                  Community                               
    198671676834275                           宇都宮大学                                     2011-07-01T14:25:42+0000                  University                              
    102134986532994                           Hideyuki Takano                           2011-07-01T17:13:11+0000                  Author                                  
    241912695820827                           jazug-girls on Ustream                    2011-07-09T07:08:05+0000                  Website                                 
    107938752635074                           日本マイクロソフト株式会社 ISV                         2011-07-13T05:42:55+0000                  Product/service                         
    162171137156411                           FB C# SDK                                 2011-07-13T05:48:25+0000                  Product/service                         
    179873125388138                           Test Application jonn_msft                2011-07-13T08:11:44+0000                  Application                             
    164821313572981                           ハングオーバー2                                  2011-07-13T10:48:44+0000                  Movie                                   
    106879676011328                           なんでも                                      2011-07-13T10:48:44+0000                  Music                                   
    106310202730728                           見ません                                      2011-07-13T10:50:00+0000                  Tv                                      
    184363171581232                           やりません                                     2011-07-13T10:50:01+0000                  Games/toys                              
    175405739162732                           いません                                      2011-07-13T10:50:58+0000                  Athlete
                                     

    この結果を見て気づいたのですが、プロフィールに指定した「本」や「映画」は「いいね!」としてマークされてるんですね。うかつに変なものは入れておけないですね。

    もちろん、友達の「いいね!」も表示することができます。

    ここで、「人」ではないものも触ってみましょう。上の一覧に、「日本マイクロソフトUXチーム」というのが表示されています。赤文字の部分です。

    これは人ではなく、Facebookページです。もちろんこいつにも ID が付与されており、以下のようにして関連情報を収集することができます。

    以下は、Facebook ページのウォールに投稿されたFeedを収集しています。

    PS C:\> Get-FBAssociation -Id "233115383381196" -Type "feed"

    id           : 233115383381196_251158651576869
    actions      : {@{name=Comment; link=
    http://www.facebook.com/233115383381196/posts/251158651576869}, @{name=Like; link=http://www.facebook.com/233115383381196/posts/25
                   1158651576869}, @{name=@mswinux on Twitter; link=http://twitter.com/mswinux?utm_source=fb&utm_medium=fb&utm_campaign=mswinux&utm_content=910722076771696
                   65}}
    type         : status
    created_time : 2011-07-13T09:11:21+0000
    from         : @{id=233115383381196; name=日本マイクロソフト UX チーム; category=Product/service}
    updated_time : 2011-07-13T09:11:21+0000
    likes        : @{id=146xxxxxxxx; name=Ryosuke xxxxxxxx}
    icon         :
    http://photos-d.ak.fbcdn.net/photos-ak-snc1/v27562/23/2231777543/app_2_2231777543_9553.gif
    message      : CLR/Hの勉強会でWindows Phone "Mango"とWPF系の話をします: マイクロソフトの田中達彦です。2011年7月16日(土)に、札幌で開催されるCLR/HでWindows PhoneとWPF/WPFリボン... http://bit.ly/qucu26
    application  : @{id=2231777543; name=Twitter}



    上記の結果で、「likes」の行をご覧ください。これは、この投稿によせられた「いいね!」です。このようにして、投稿1つ1つからも関連した情報を引っ張ってくることができるのですね。

    なお、Clear-FBConnection というコマンドレットはあるのですが、このバージョンでは Facebook からのログアウトがサポートされていません。よって、現時点では手動でログアウトする必要があります。

    どうでしょう?

    PowerShell が使えるとなると、Facebook が一気に身近なものに感じられますよね。

    次回以降では、内部の動き、特に認証と認可まわりについて解説することにします。

  • 【PowerShell】依存関係チェッカーに学ぶ、必須ソフトウェアのチェック方法

    前回の投稿では、Identity Developer Training Kit で発生する、日本語環境でのエラー回避方法について紹介しました。

    【WP7 for IT Pro】Identity Developer Training Kit の前提条件チェックが通らないときの対処

    エラー回避のキーとなるのは、Windows PowerShell スクリプトでした。

    で、依存関係チェッカーが使用しているスクリプトを改めて眺めてみると、コレが結構勉強になる代物でして。簡単なスクリプトなんですけどね。

    Identity Developer Training Kit で用意されている前提条件チェック用スクリプトは以下の通りです。ファイル名を見れば何をチェックしているか、一目瞭然ですよね。

    PS C:\IdentityTrainingKitVS2010\Assets\DependencyChecker\scripts\dependencies\check> dir |ft name

    Name
    ----
    CheckASPNET4.ps1
    CheckAzureMMC.ps1
    CheckAzureTools13ForVS2010.ps1
    CheckAzureTools14ForVS2010.ps1
    CheckAzureToolsForVS2008.ps1
    CheckAzureToolsForVS2010.ps1
    CheckIIS7.ps1
    CheckIis7AspNet.ps1
    CheckIisRewrite.ps1
    CheckIISStaticContent.ps1
    CheckLoadUserProfile.ps1
    CheckNET35SP1.ps1
    CheckNET4.ps1
    CheckNetServicesSDK.ps1
    CheckSilverlight4ToolsForVS.ps1
    CheckSilverlightDevTools.ps1
    CheckSilverlightToolsForVS.ps1
    CheckSqlServer.ps1
    CheckSqlServer2008.ps1
    CheckVistaSP2.ps1
    CheckVS2008.ps1
    CheckVS2010.ps1
    CheckWCFHTTPAct.ps1
    CheckWifRuntime.ps1
    CheckWifSdk4.ps1
    CheckWP7AddInVS2010.ps1
    CheckWP7Emulator.ps1

    ここで、CheckVS2010.ps1 の中身を見てみましょう。以下は CheckVS2010.ps1 の全体像です。

    function SearchUninstall($SearchFor, $UninstallKey, $Version)
    {
    $uninstallObjects = ls -path $UninstallKey;
    $found = $FALSE;

    foreach($uninstallEntry in  $uninstallObjects)
    {
       $entryProperty = Get-ItemProperty -LiteralPath registry::$uninstallEntry
       if($entryProperty.DisplayName -like $searchFor -and $entryProperty.DisplayVersion -like $Version)
        {      
           $found = $TRUE;
           break;
        }
    }

    $found;
    }

    function SearchAllUninstallKeys($SearchFor, $Version)
    {
        $os = Get-WMIObject win32_operatingsystem
        [bool] $found = $False;
        $SearchFor64bits = "$SearchFor (64-bit)"   
       
        # Seach in uninstall folder
        $found =  SearchUninstall -SearchFor $SearchFor -UninstallKey 'HKLM:SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' -Version $Version;   
        if($found) {return $found;}
       
        #Search in 64 bit keys folders
        if ($os.OSArchitecture -eq "64-bit") {
            #Wow folder
            $found =  SearchUninstall -SearchFor $SearchFor -UninstallKey 'HKLM:SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\' -Version $Version;   
            if($found)  {return $found;}
           
            #Wow folder, 64 bits
            $found =  SearchUninstall -SearchFor  $SearchFor64bits -UninstallKey 'HKLM:SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\'-Version $Version;   
            if($found)  {return $found;}
           
            #32bit folder, 64 bits
            $found =  SearchUninstall -SearchFor  $SearchFor64bits -UninstallKey 'HKLM:SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\'-Version $Version;   
            if($found)  {return $found;}
        }
       
        return $found;
    }


    ## SearchAllUninstallKeys -SearchFor 'Microsoft Visual Studio 2010*' -Version '10.0.30319';
    SearchAllUninstallKeys -SearchFor 'Microsoft Visual Studio 2010*' -Version '10.0.40219';

    一番最後の行が最初に実行されるコマンドで、ここで指定した文字列(製品名)とバージョン番号が SearchUninstall と SearchAllUninstallKeys という関数に渡されます。

    SearchUninstall は引数として与えられたレジストリキー(Uninstall)の中から、製品名とバージョン番号を検索する関数です。エントリと値が存在していれば True が返されます。

    SearchUninstall を呼び出しているのが SearchAllUninstallKeys  関数です。この関数では、以下の4つのパターンを想定して検索を行っており、いずれかが True になればインストールされていると判断しています。

      • 32ビット用のキーに32ビット版がインストールされている場合
      • 64ビット用のキーに64ビット版がインストールされている場合
      • 64ビット用のキーに32ビット版がインストールされている場合
      • 32ビット用のキーに64ビット版がインストールされている場合

    (参考)32-bit and 64-bit Application Data in the Registry (Windows)

    もう一つ、別のタイプのスクリプトを見てみましょう。CheckIIS7.ps1 です。ファイル名からわかるとおり、IIS7とASP.NETがインストールされているかどうかをチェックするスクリプトです。

    function Check-RegistryValue($PropertyPath, $PropertyName, $PropertyValue)
    {
        if ((Test-Path -path $PropertyPath) -ne $True)
        {
            return $FALSE;
        }

        $found = $FALSE;
       
        $entryProperty = Get-ItemProperty -path $PropertyPath

        if($entryProperty.psobject.Properties -ne $null)
        {
            $registryValue = $entryProperty.psobject.Properties[$PropertyName].value;

            if($registryValue -eq $PropertyValue)
            {
                $found = $TRUE;
            }
        }

        $found;
    }

    $query = Get-WmiObject Win32_Service | where {$_.Name -eq "w3svc" }

    $hasIIS = ($query -ne $null);
    $hasAspNet = Check-RegistryValue -PropertyPath "HKLM:\SOFTWARE\Microsoft\INETSTP\Components" -PropertyName "ASPNET" -PropertyValue "1";

    $hasIIS -and $hasAspNet;

    このスクリプトでは、はじめに Win32_Service を使用して IIS(w3csvc)のサービス状態を取得しています。ためしに、PowerShell のコンソールで、以下のコマンドを入力してみてください。

    Get-WmiObject Win32_Service | where {$_.Name -eq "w3svc" }

    IISが稼働しているかどうかにかかわらず、ただしくサービスとしてインストールされていれば、以下のような結果が返されます。

    PS C:\>  Get-WmiObject Win32_Service | where {$_.Name -eq "w3svc" }

    ExitCode  : 0
    Name      : W3SVC
    ProcessId : 3108
    StartMode : Auto
    State     : Running
    Status    : OK

    ASP.NET がインストールされているかどうかはサービスを見るだけでは判別できないため、例によってレジストリキーをチェックしています。ただし、これまでのように「製品」としてインストールされているわけでは無いので Uninstall キーをチェックしても意味がありません。そこで、Uninstall キーの代わりに \SOFTWARE\Microsoft\INETSTP\Components というキーをチェックしています。

    最後に、IIS のインストール状態と ASP.NET のインストール状態を論理演算し、結果が True であればチェックをパスすることができます。

    以前はこうしたスクリプトは VBSで提供されることが多かったのですが、ここ数年ですっかり Windows PowerShell にとって変わられました。こうした現状を見るにつけ、Windows の次のバージョン(なんて名前になるかは知りませんが)で VBS が使えなくなることは無いにしても、おそらく進化も望めないのだろうと、若干寂しくなる今日この頃です。

  • 【WP7 for IT Pro】Identity Developer Training Kit の前提条件チェックが通らないときの対処

    2011年7月より UX & Client Platform Evangelism Group に転属となりました。今後ともよろしくお願いいたします。

    早速ですが新部署移動後、最初の投稿は、Windows Phone 7(WP7)用の Identity Developer Training Kit の日本語環境での非互換についてです。

    Identity Developer Training Kit(ITK) は、Identity 周りのテクノロジーの実装方法を Step by Step で習得できるプログラマー向けのコンテンツです。あいにく英語なのですが、Step by Step なのでさほど難しくありません。

    Identity Developer Training Kit(ITK)2011年4月版(英語)

    Visual Studio を使用するため(ExpressでもOK)、IT Pro には少々敷居が高いのですが、マイクロソフトがサポートする Identity 系テクノロジーのアーキテクチャを理解するのにとても Good なコンテンツなのです。なので、私も無理して Visual Studio を使用しています。

    ITK 2011年4月版には、全部で9つのシナリオが用意されており、その中の1つに Windows Phone 7 と Windows Azure AppFabric ACS を使用するシナリオがあります。このシナリオは、Windows Azure 上の WEBサービスを Windows Phone 7上のアプリから使用するに当たり、Windows Azure AppFabric ACS からセキュリティトークンを発行してもらう...というものです。

    image

    シナリオを学習するには、セットアップスクリプトを実行する必要があるのですが、そのまえに「依存関係チェッカー(Dependencies.dep)」と呼ばれるプログラムを実行しなければなりません。

    依存関係チェッカーを実行すると、以下のように当該シナリオに必要なコンポーネントがインストールされているかどうかがチェックされます。以下の例の場合、「Microsoft Windows Phone 7 Add-in for Visual Studio 2010」がインストールされないというエラーが表示されていることがわかります。

    image

    本当にインストールされていない場合には「Download」をクリックしてコンポーネントをインストールすれば済むのですが、これが何度インストールしてもチェックを通過することができません。コントロールパネルで確認すると、以下のようにインストールされていることがわかります。

    image

    これは明らかに依存関係チェッカーの動作ミスに違いありません。

    ということで、依存関係チェッカー(Dependencies.dep)を確認してみます。

    Dependencies.dep をメモ帳で開くと以下の通りです。ちょっと長いですが、ずらずらっと眺めてみてください。なんとなく、何がしたいかはわかりますよね。

    <?xml version="1.0" encoding="utf-8" ?>
    <DependencyCheckerConfiguration>
      <title>Access Control and Windows Phone 7</title>
     
      <previews>
        <preview name="Check dependencies" description="Check prerequisites for Authenticating Users in a Windows Phone 7 App via Access Control Service, OData Services and Windows Azure Lab"></preview>
        <preview name="Setup database" description="Setup database schema and sample data"></preview>
        <preview name="Install code snippets" description="Install Visual Studio 2010 Code Snippets for the lab"></preview>
      </previews>
     
      <tasks>
        <task description="Setup database" scriptName=".\Scripts\SetupDb.cmd" displayConsole="true" />
        <task description="Install Visual Studio 2010 Code Snippets for the lab" scriptName=".\Scripts\InstallCodeSnippets.cmd" displayConsole="true" />
      </tasks>

      <dependencies>
        <os type="Vista" buildNumber="6000;6001">
          <dependency
                        value=".\Scripts\Dependencies\Check\CheckVistaSp2.ps1"
                        enabled="true"
                        optional="false"
                        title="Vista SP2"
                        explanation="Vista Service Pack 2 is required."
                        scriptName=""
                        downloadUrl="
    http://windows.microsoft.com/en-US/windows/downloads/service-packs" />
        </os>
        <os type="Vista;Server" buildNumber="6002;7600;7601">
          <dependency
                        value=".\Scripts\Dependencies\Check\CheckVS2010.ps1"
                        enabled="true"
                        optional="false"
                        title="Microsoft Visual Studio 2010"
                        explanation="Install Microsoft Visual Studio 2010"
                        scriptName=""
                        downloadUrl="
    http://go.microsoft.com/fwlink/?LinkId=128752" />
          <dependency
                        value=".\Scripts\Dependencies\Check\CheckNET4.ps1"
                        enabled="true"
                        optional="false"
                        title="Microsoft .NET Framework 4"
                        explanation="Download and install the Microsoft .NET Framework 4"
                        scriptName=""
                        downloadUrl="
    http://www.microsoft.com/downloads/details.aspx?FamilyId=AB99342F-5D1A-413D-8319-81DA479AB0D7"/>
          <dependency
                        value=".\Scripts\Dependencies\Check\CheckSqlServer.ps1"
                        enabled="true"
                        optional="true"
                        title="Microsoft SQL Server Express 2008 (or later)"
                        explanation="Install Microsoft SQL Server Express 2008 (or later)"
                        scriptName=""
                        downloadUrl="
    http://www.microsoft.com/express/sql/download/"/>
          <dependency
                        value=".\Scripts\Dependencies\Check\CheckIIS7.ps1"
                        enabled="true"
                        optional="false"
                        title="Microsoft IIS 7.0"
                        explanation="Enable the Internet Information Services 7 feature."
                        scriptName="Scripts\Dependencies\Setup\install-iis.bat" />
          <dependency
                        value=".\Scripts\Dependencies\Check\CheckIis7AspNet.ps1"
                        enabled="true"
                        optional="false"
                        title="IIS7 ASP.NET"
                        explanation="Enable the ASP.NET role."
                        scriptName="Scripts\Dependencies\Setup\install-iis7aspnet.bat" />
        <dependency
                value=".\scripts\dependencies\check\CheckAzureTools14ForVS2010.ps1"
                enabled="true"
                optional="false"
                title="Windows Azure SDK and Windows Azure Tools for Microsoft Visual Studio (March 2011)"
                explanation="Download and install Windows Azure SDK 1.4 and VS Tools"
                downloadUrl="
    http://go.microsoft.com/fwlink/?LinkId=128752"
                scriptName=""/>

       <dependency
                      value=".\scripts\dependencies\check\CheckWP7Emulator.ps1"
                      enabled="true"
                      optional="false"
                      title="Microsoft Windows Phone Developer Emulator"
                      explanation="Download and Install Windows Phone Developer Tools"
                      scriptName=""
                      downloadUrl="
    http://www.microsoft.com/downloads/en/details.aspx?FamilyID=04704acf-a63a-4f97-952c-8b51b34b00ce" />
          <dependency
                      value=".\scripts\dependencies\check\CheckWP7AddInVS2010.ps1"
                      enabled="true"
                      optional="false"
                      title="Microsoft Windows Phone 7 Add-in for Visual Studio 2010"
                      explanation="Download and Install Windows Phone Developer Tools"
                      scriptName=""
                      downloadUrl="
    http://www.microsoft.com/downloads/en/details.aspx?FamilyID=04704acf-a63a-4f97-952c-8b51b34b00ce" />
            <dependency
                        value=".\scripts\Dependencies\Check\CheckWifRuntime.ps1"
                        enabled="true"
                        optional="false"
                        title="Windows Identity Foundation Runtime"
                        explanation="Identity Labs require Windows Identity Foundation Runtime"
                        scriptName=""
                        downloadUrl="
    http://support.microsoft.com/kb/974405" />

            <dependency
                        value=".\scripts\Dependencies\Check\CheckWifSdk4.ps1"
                        enabled="true"
                        optional="false"
                        title="Microsoft Windows Identity Foundation SDK"
                        explanation="Identity Labs require Windows Identity Foundation SDK"
                        scriptName=""
                        downloadUrl="
    http://www.microsoft.com/downloads/details.aspx?familyid=C148B2DF-C7AF-46BB-9162-2C9422208504" />
        </os>
      </dependencies>
    </DependencyCheckerConfiguration>

    黄色でマークした部分が、「Windows Phone 7 Add-in for Visual Studio 2010」のチェック部分です。目を凝らしてみると、

    .\scripts\dependencies\check\CheckWP7AddInVS2010.ps1

    という PowerShell スクリプトが呼ばれていることがわかります。

    ...ということで、CheckWP7AddInVS2010.ps1 を見てみましょう。

    C:\IdentityTrainingKitVS2010\Assets\DependencyChecker\scripts\dependencies\check の配下に格納されている CheckWP7AddInVS2010.ps1 を開くと以下の通りです。

    function SearchAllUninstallKeys($SearchFor, $Version)
    {
        $os = Get-WMIObject win32_operatingsystem
        [bool] $found = $False;
        $SearchFor64bits = "$SearchFor (64-bit)"   
       
        # Seach in uninstall folder
        $found =  SearchUninstall -SearchFor $SearchFor -UninstallKey 'HKLM:SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' -Version $Version;   
        if($found) {return $found;}
       
        #Search in 64 bit keys folders
        if ($os.OSArchitecture -eq "64-bit") {
            #Wow folder
            $found =  SearchUninstall -SearchFor $SearchFor -UninstallKey 'HKLM:SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\' -Version $Version;   
            if($found)  {return $found;}
           
            #Wow folder, 64 bits
            $found =  SearchUninstall -SearchFor  $SearchFor64bits -UninstallKey 'HKLM:SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\'-Version $Version;   
            if($found)  {return $found;}
           
            #32bit folder, 64 bits
            $found =  SearchUninstall -SearchFor  $SearchFor64bits -UninstallKey 'HKLM:SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\'-Version $Version;   
            if($found)  {return $found;}
        }
       
        return $found;
    }

    SearchAllUninstallKeys -SearchFor 'Windows Phone 7 Add-in for Visual Studio 2010 - ENU' -Version '10.0.30319';

    一番下の行を見てください。 -Version '10.0.30319' という記述が見えます。明らかにバージョン番号であることがわかりますね。この番号をコントロールパネルに表示された値と比較すると...合ってる。バージョン番号に問題はありません。

    ではどこがおかしいのか...?

    英語版のスクリプトをデバッグする場合には、文字列比較している部分を疑うのがコツです。ここで一番怪しいのは、黄色くマークした部分です。

    if ($os.OSArchitecture -eq "64-bit") {

    OSのアーキテクチャが “64-bit” の場合には...という判定をしているっぽい記述ですよね。かなり臭いです。

    そこで、PowerShell のコンソールを開いて、以下のコマンドを入力してみてください。

    PS C:\Windows\system32> $os = Get-WMIObject win32_operatingsystem
    PS C:\Windows\system32> $os.OSArchitecture
    64 ビット

    なんと、OSArchitecture プロパティの値は「64 ビット」という日本語じゃないですか!

    やってられーん...こともない!ということで、スクリプトを書き換えましょう。

    if ($os.OSArchitecture -eq "64-bit") {

    ↓以下のように書き換え

    if ($os.OSArchitecture -eq "64 ビット") {

    保存して、再度依存関係チェッカーを実行すると、以下の通り正常終了します。

    image

    Identity Developer Training Kit を使用する場合には、以下も参考にしてください。

    【IDM】Identity Developer Training Kit がうまくインストールできないときの対処