タイマージョブの作成に関する問題
-
10-07-2019 - |
質問
ユーザーAをサイトコレクション管理者としてWebアプリケーション内にサイトコレクションを作成しました。サイトの機能ページにリンクを追加しました。そのリンクをクリックすると、タイマージョブを作成しようとしています。以下は、リンクをクリックしたときに実行されるコードです
//Allow unsafe updates.
SPContext.Current.Web.AllowUnsafeUpdates = true;
//Get current web application.
SPWebApplication webApp = SPContext.Current.Site.WebApplication;
// Create new job.
ArchiveJob automaticArchiveJob = new ArchiveJob(scheduleDetails.scheduleName, webApp);
SPHourlySchedule hourlySchedule = new SPHourlySchedule();
hourlySchedule.BeginMinute = 0;
hourlySchedule.EndMinute = 1;
automaticArchiveJob.Schedule = hourlySchedule;
//Finally update archival job.
automaticArchiveJob.Update();
ユーザーAでログインし、「サイトの設定」ページでそのリンクをクリックすると、「アクセスが拒否されました」というメッセージが表示されてセキュリティ例外が発生します。行 automaticArchiveJob.Update()
で。
ただし、管理者ユーザー(このユーザーを使用してマシンにログインしている)でログインし、リンクをクリックすると、ジョブが正常に作成されます。
また、ユーザーAを WSS_ADMIN_WPG
グループのメンバーにしましたが、それでも同じ問題が発生します。問題を解決するために他にやらなければならないことはありますか。
解決
「アクセス拒否」あなたがやろうとしていることを考えると、予想される動作です。説明させてください。
タイマージョブインスタンスが作成されると、ファーム構成データベースに保持されます。書き込み目的でこのデータベースにアクセスすることは特権的な操作です。経験則として、ファームサービスアカウント(つまり、OWSTIMER.EXEが実行されるアカウント)、または構成データベースでこのような操作を実行するために必要な権限を明示的に持っているアカウント(通常は管理者)のみが成功します。
既定では、サイトコレクションコンテキスト内からタイマージョブをインスタンス化しようとすると失敗します。昇格された特権ブロックで(SPSecurity.RunWithElevatedPrivilegesを介して)操作を試行すると、現在のユーザーコンテキストではなくWebアプリケーションのアプリケーションプールアカウントコンテキストが使用されるだけです。これは、アプリプールアカウントにファーム構成データベースへの書き込み権限がある場合にのみ成功します。これが発生する場合、通常は、(a)ファームサービスアカウントが(たとえば、コンテンツWebアプリを実行するために)あるべきでないロールで使用されているか、(b)アプリケーションプールに追加のアクセス許可が付与されているためですアカウント。どちらの場合も、ベストプラクティスの運用モデルからの逸脱を表しています。
タイマージョブインスタンスは通常、FarmまたはWebApplicationレベルのいずれかでスコープされた機能の機能のアクティブ化時に作成されます。どうして?これらの機能は通常、コマンドライン(管理者がファーム構成データベースの権限も持っていることを前提とする)またはサーバーの全体管理(アクティベーションがファームサービスアカウントを通じて行われる場合)から管理者によってアクティブ化されるため、構成データベースに対する権限が保証されます)。機能がアクティブになり、SPFeatureReceiverのFeatureActivatedメソッドが呼び出されると、タイマージョブをセットアップしても安全です(セキュリティの観点から)。
特定の問題を適切に解決するためには、問題を少しだけ頭に入れなければなりません。オンデマンドでサイトコレクション内からタイマージョブをインスタンス化する代わりに、「スイープ」に相当するものを設定することをお勧めします。機能がアクティブになったときのタイマージョブ。確かに、これはあなたがやろうとしていることよりも多くの計画と努力を必要としますが、現在のパスはセキュリティが何らかの形で調整されている場合にのみ機能します-それは推奨されません。
BLOBキャッシュファームフラッシュ機能をまとめていたとき( http://blobcachefarmflush.codeplex.com ) 、私はほとんど同じことを自分でしなければなりませんでした。 FeatureReceiverクラス(BlobCacheFarmFlushSweepJobFeatureReceiver)でタイマージョブの作成の詳細を確認できます。残りのコードと関連ドキュメントは、今後発生する他の課題の一部にも役立つ場合があります。
見つけたものを自由に使用してください。それがそこにある理由です!
お役に立てば幸いです。フォローアップの質問がある場合は、消してください。できる限り最善を尽くします:-)
他のヒント
SPPersistedObject.HasAdditionalUpdateAccess()メソッドをオーバーライドして、trueを返します。
protected override bool HasAdditionalUpdateAccess()
{
trueを返します。
}
RunWithElevatedPrivilegesを使用しました
SPSecurity.RunWithElevatedPrivileges(delegate() { });
それは私のために働く.....誰か他の解決策がありますか?その場合はお知らせください。