Office 365 ライセンスをユーザーに割り当てるプロジェクトがあります。管理者が使用可能なライセンスを表示し、ユーザーのライセンスを選択できる Web プロジェクトがあります。バックグラウンドでは、15 分ごとに実際のライセンス割り当て (およびその他の多くのタスク) を実行するサービスがあります。ライセンスを直接割り当てない理由は、ユーザーがまだ Office 365 に同期されていない可能性があるためです。DirSync がまだ実行されていない場合、サービスは後で自動的に再試行します。
私の問題に戻る: Office 365 への接続は、PowerShell モジュール "MSOnline" を使用しています。問題は、このモジュールをサービスがロードできないことです。私はいつも標準的なエラーメッセージを受け取ります:
どのモジュール ディレクトリにも有効なモジュール ファイルが見つからなかったため、指定されたモジュール 'MSOnline' は読み込まれませんでした。
Web アプリケーションにはこの問題はありません。たとえば、接続して利用可能なライセンスを取得できます。サービス アプリケーションのコードを LINQPad または小さなスタンドアロン実行可能ファイルとして使用すると、すべて正常に動作します。サービスのみがモジュールをロードできません。誰でも私を助けることができますか?
次のコード スニペットは、Web アプリケーションとサービスの両方で Office 365 に接続するために使用されます (コードは読みやすくするために簡略化されています)。
var iss = InitialSessionState.CreateDefault();
iss.ThrowOnRunspaceOpenError = true;
iss.AuthorizationManager = new AuthorizationManager("MyPowerShellInvoker");
iss.ImportPSModule("MSOnline");
_runspace = RunspaceFactory.CreateRunspace(iss);
_runspace.Open();
_invoker = new RunspaceInvoke(_runspace);
using (Pipeline pipeline = _runspace.CreatePipeline())
{
var cmd = new Command("Connect-MsolService");
cmd.Parameters.Add("Credential", /* PSCredential object */);
pipeline.Commands.Add(cmd);
pipeline.Invoke();
}
PS:サービスは「ローカル システム」アカウントで実行されています。