[Office365] New-MsolLicenseOptionsでハマる


C#からPowerShellに対して、-DisabledPlansオプションを渡そうとしたのだが、うまく渡せないで少々ハマった。
例えば、'aaaa,bbbb'という文字列を渡すと、文字列の配列として認識されているようだが、うまくセットできない。
ライセンス オプションが無効であるため、このライセンスを割り当てることができません。
どうやら正解は'aaaa",'bbbb'であるらしい。すこし考えればわかることではある。

[.NET 4.0] ネットワーク上の場所からアセンブリを読み込もうとしました。


.NET Framework 4.0 からセキュリティ・モデルが変更された。
.NET Framework 3.5 が入っている環境では OK でも、.NET Framework 4.0 のみインストールされている環境ではエラーが発生するケースがある。例えば、動的にアセンブリを読み込んでいる箇所などに影響が出る。

System.NotSupportedException: ネットワーク上の場所からアセンブリを読み込もうとしました。これにより、以前のバージョンの .NET Framework で、アセンブリがサンドボックス化された可能性があります。このリリースの .NET Framework では、CAS ポリシーが既定で有効になっていないため、この読み込みは危険な場合があります。この読み込みがアセンブリのサンドボックス化を目的としない場合は、loadFromRemoteSources スイッチを有効にしてください。詳細については、http://go.microsoft.com/fwlink/?LinkId=155569 を参照してください。

参照してください、といいつつ最新の日本語サイトはこっちだったりする。
http://msdn.microsoft.com/ja-jp/library/vstudio/dd409252.aspx

動作をさせたいだけであれば、
Config ファイルに loadFromRemoteSources 要素を追加すれば回避できるようになる。
しかし、セキュリティとの兼ね合いがあるので、その意味をよく考えてから設定したほうが良いだろう。

参考 : CASが廃止。.NET 4のセキュリティはどうなるのか? [@IT]
http://www.atmarkit.co.jp/fdotnet/special/dotnet4security_01/dotnet4security_01_01.html

[C#] DataGridView の行をすべて削除する。

Windows フォームでよく使用される DataGridView だが、行を初期化したくて DataSource に null を入れてみたが初期化されなかった (笑)。どうやら以下のようにクリアするらしい。
DataGridView .Rows.Clear();

[Windows Azure SQL] 存在しないデータを読み取ろうとしました

ふと、こんなエラーが出た。
System.AggregateException: 1 つ以上のエラーが発生しました。 ---> System.InvalidOperationException: 存在しないデータを読み取ろうとしました。
Azure 上の SQL Server で思ったのは、接続に関して Azure から切断されるような作りをしていないかというところだと思う。
長時間接続すると切断されるし、セッション数が超えていても切断される。
その結果として上記のようなエラーがログに残されるわけだが、これは問題の切り分けをするときに間違えやすい。

例えばこのソースは、Azure 環境でなければ普通に動くだろう。
using (var db = new DBEntities()) 
{ 
    var users = (from u in db.Users where u.PK == userid select u).ToList();
    if (users.Any()) 
    { 
        var selectedUser = users.Single(); 
        if (selectedUser.Password.Equals(passwordHash)) 
        { 
            var settings = (from s in db.Settings where s.User == selectedUser.PK select s).ToList(); 
        } 
    } 
} 
しかし、DBEntities の中でひたすらにループを回し続けると、Azure から切断されてしまうことがある。Azure 上では、常に短い時間でデータベースアクセスを行い、かつ、切断をするような作りになっていないとならない。

何も考えていないで作ってきたのだが、そういう部分もしっかりと基本に忠実に作らないといけないのだ。

参考:http://stackoverflow.com/questions/5310764/entity-framework-invalid-attempt-to-read-when-no-data-is-present-with-large

[PowerShell] Office 365 へのユーザー登録時に複数ライセンスを付与する

Office365 のライセンスが複数ある場合、コマンドから複数のライセンスを付与させたいということがある。 複数のライセンスを付与させるのは簡単だ。-LicenseAssignment に対して、ライセンスをカンマで連結してあげればいい。
New-MsolUser -LicenseAssignment テスト:ENTERPRISEPACK,テスト:STANDARDPACK
大抵の場合はこれでよろしいと思われるのだが、サービスプランによっては競合が発生する。
というのも、ライセンス付与を行うと、デフォルトではすべてのサービスプランが有効化されるからだ。
このユーザーのライセンスを更新できません。ライセンス セットに、同時に割り当てることができない 2 つ以上のサービス プランが含まれています。競合するサービス プラン: SHAREPOINTSTANDARD, SHAREPOINTENTERPRISE
これを回避するためには、ライセンスオプションを設定する必要がある。
New-MsolUser を実行する時でも良いし、後からライセンスを付与するときでも良い。
$licenceOption = New-MsolLicenseOptions -AccountSkuId テスト:STANDARDPACK -DisabledPlans SHAREPOINTSTANDARD
$userObject = Set-MsolUserLicense -userprincipalname hoge@hoge.com -AddLicenses テスト:ENTERPRISEPACK,テスト:STANDARDPACK -LicenseOptions $licenceOption
環境によってどのサービスプランが競合するのか異なるので、なかなか難しい話ではあるが、複数のライセンスを付与する可能性がある場合はこのような考慮をしないとユーザー登録ができない。