Client OM を使って匿名アクセスをする場合、利用できるメソッドに制限があります。
例えば標準状態では、以下のコードは22行目を実行するとエラーとなります。
1 | <span class="lnum"> 1: </span>ClientContext ctx = <span class="kwrd">new</span> ClientContext(<span class="str">"http://hoge"</span>); |
1 | <span class="lnum"> 2: </span>ctx.AuthenticationMode = ClientAuthenticationMode.Anonymous; |
1 | <span class="lnum"> 3: </span>List list = ctx.Web.Lists.GetByTitle(<span class="str">"Sample"</span>); |
1 | <span class="lnum"> 4: </span>  |
1 | <span class="lnum"> 5: </span>CamlQuery query = <span class="kwrd">new</span> CamlQuery(); |
1 | <span class="lnum"> 6: </span>query.ViewXml = |
1 | <span class="lnum"> 7: </span> <span class="str">"<View>"</span> + |
1 | <span class="lnum"> 8: </span> <span class="str">"<Query>"</span> + |
1 | <span class="lnum"> 9: </span> <span class="str">"<Where>"</span> + |
1 | <span class="lnum"> 10: </span> <span class="str">"<Eq>"</span> + |
1 | <span class="lnum"> 11: </span> <span class="str">"<FieldRef Name='_ModerationStatus' />"</span> + |
1 | <span class="lnum"> 12: </span> <span class="str">"<Value Type='ModStat'>0</Value>"</span> + |
1 | <span class="lnum"> 13: </span> <span class="str">"</Eq>"</span> + |
1 | <span class="lnum"> 14: </span> <span class="str">"</Where>"</span> + |
1 | <span class="lnum"> 15: </span> <span class="str">"</Query>"</span> + |
1 | <span class="lnum"> 16: </span> <span class="str">"</View>"</span>; |
1 | <span class="lnum"> 17: </span>  |
1 | <span class="lnum"> 18: </span>ListItemCollection itemColl = list.GetItems(query); |
1 | <span class="lnum"> 19: </span>  |
1 | <span class="lnum"> 20: </span>ctx.Load(itemColl); |
1 | <span class="lnum"> 21: </span>ctx.Load(itemColl, items => items.Include(item => item[<span class="str">"Title"</span>])); |
1 | <span class="lnum"> 22: </span>ctx.ExecuteQuery(); |
エラーの内容は以下の通り。
Microsoft.SharePoint.Client.ServerException: 種類 "List"、ID "{d89f0b18-614e-4b4a-bac0-fd6142b55448}" のメソッド "GetItems" は、サーバーで管理者によってブロックされています。
GetItems メソッドの使用が管理者によりブロックされているとのこと。
このブロックを解除することで GetItems メソッドが使えるようになります。
では、どこでブロックの設定がされているのかというと、SPWebApplication.ClientCallableSettings プロパティになります。
このプロパティでは Client OM 利用時の制限事項がいくつか定義されており、その中で匿名アクセスに関するものが、ClientCallableSettings.AnonymousRestrictedTypes で設定されています。
まずは、ClientCallableSettings.AnonymousRestrictedTypes の初期状態を見てみます。
以下の PowerShell スクリプトを実行します。
1 | <span class="lnum"> 1: </span>$w = Get-SPWebApplication “http:<span class="rem">//hoge/”</span> |
1 | <span class="lnum"> 2: </span>$w.ClientCallableSettings.AnonymousRestrictedTypes |
実行結果は以下のようになります。
1 | <span class="lnum"> 1: </span>FullName : Microsoft.SharePoint.SPList |
1 | <span class="lnum"> 2: </span>MethodNames : {GetItems, GetChanges} |
1 | <span class="lnum"> 3: </span>GetPropertyNames : {} |
1 | <span class="lnum"> 4: </span>SetPropertyNames : {} |
1 | <span class="lnum"> 5: </span>UpgradedPersistedProperties : |
1 | <span class="lnum"> 6: </span>  |
1 | <span class="lnum"> 7: </span>FullName : Microsoft.SharePoint.SPWeb |
1 | <span class="lnum"> 8: </span>MethodNames : {GetChanges, GetSubwebsForCurrentUser} |
1 | <span class="lnum"> 9: </span>GetPropertyNames : {} |
1 | <span class="lnum"> 10: </span>SetPropertyNames : {} |
1 | <span class="lnum"> 11: </span>UpgradedPersistedProperties : |
1 | <span class="lnum"> 12: </span>  |
1 | <span class="lnum"> 13: </span>FullName : Microsoft.SharePoint.SPSite |
1 | <span class="lnum"> 14: </span>MethodNames : {GetChanges} |
1 | <span class="lnum"> 15: </span>GetPropertyNames : {} |
1 | <span class="lnum"> 16: </span>SetPropertyNames : {} |
1 | <span class="lnum"> 17: </span>UpgradedPersistedProperties : |
これを見ると、2行目で SPList.GetItems メソッドが制限されていることがわかります。
他にも、SPSite、SPWeb でも制限されているメソッドがあるようです。
では次に、制限の解除をしたいと思います。
先ほどのスクリプトの続きで、以下の PowerShell スクリプトを実行します。
1 | <span class="lnum"> 1: </span>$w.ClientCallableSettings.AnonymousRestrictedTypes.Remove([microsoft.sharepoint.splist], <span class="str">"GetItems"</span>) |
1 | <span class="lnum"> 2: </span>$w.Update() |
うんともすんとも言いませんが、上記スクリプト実行後にもう一度 ClientCallableSettings.AnonymousRestrictedTypes を出力してみると、 上記出力結果の2行目にあった GetItems がなくなっていることが確認できます。
1 | <span class="lnum"> 1: </span>FullName : Microsoft.SharePoint.SPList |
1 | <span class="lnum"> 2: </span>MethodNames : {GetChanges} |
1 | <span class="lnum"> 3: </span>GetPropertyNames : {} |
1 | <span class="lnum"> 4: </span>SetPropertyNames : {} |
1 | <span class="lnum"> 5: </span>UpgradedPersistedProperties : {} |
1 | <span class="lnum"> 6: </span>  |
1 | <span class="lnum"> 7: </span>FullName : Microsoft.SharePoint.SPWeb |
1 | <span class="lnum"> 8: </span>MethodNames : {GetChanges, GetSubwebsForCurrentUser} |
1 | <span class="lnum"> 9: </span>GetPropertyNames : {} |
1 | <span class="lnum"> 10: </span>SetPropertyNames : {} |
1 | <span class="lnum"> 11: </span>UpgradedPersistedProperties : {} |
1 | <span class="lnum"> 12: </span>  |
1 | <span class="lnum"> 13: </span>FullName : Microsoft.SharePoint.SPSite |
1 | <span class="lnum"> 14: </span>MethodNames : {GetChanges} |
1 | <span class="lnum"> 15: </span>GetPropertyNames : {} |
1 | <span class="lnum"> 16: </span>SetPropertyNames : {} |
1 | <span class="lnum"> 17: </span>UpgradedPersistedProperties : {} |
これで設定完了です。
一番最初に書いたプログラムを実行すると、今度はエラーは出ず無事アイテムを取得できるはずです。
参考情報:
MSDN Blog
http://blogs.msdn.com/b/bobgerman/archive/2012/01/10/anonymous-client-access-to-sharepoint-2010.aspx
Will Code for Nuts
http://www.codefornuts.com/2010/05/anonymously-accessing-list-items.html