2009-06-24 12 views
6

ユーザーAをサイトコレクション管理者としてWebアプリケーション内にサイトコレクションを作成しました。サイトの機能ページにリンクを追加しました。そのリンクのクリック時に私はjob.Belowは、私は、ユーザAでログインし、「サイトの設定]ページにそのリンクをクリックしたときリンク今タイマージョブを作成する際の問題

//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(); 

のクリック時に実行されるコードで、タイマーを作成しようとしています「automaticArchiveJob.Update()」というメッセージで「アクセスが拒否されました」というセキュリティ例外が発生します。 しかし、管理者ユーザー(このユーザーを使用してマシンにもログインしています)にログインしてリンクをクリックすると、ジョブが正常に作成されます。 また、ユーザAのメンバーをWSS_ADMIN_WPGグループにしましたが、同じ問題が発生しています。問題を解決するために必要なことは他にありますか?

答えて

23

"アクセスが拒否されました"というのは、実行しようとしていることが予想されます。私に説明させてください。

タイマージョブインスタンスが作成されると、タイマージョブインスタンスはファーム構成データベースに保持されます。書き込みのためにこのデータベースにアクセスするのは特権操作です。経験則として、ファームサービスアカウント(OWSTIMER.EXEが実行されるアカウント)または設定データベース(通常は管理者)でこのような操作を実行するために必要な権限を明示的に持つアカウントのみが成功します。

既定では、サイトコレクションコンテキスト内からタイマージョブをインスタンス化しようとすると失敗します。昇格特権ブロック(SPSecurity.RunWithElevatedPrivileges経由)で操作を試みると、現在のユーザーコンテキストの代わりにWebアプリケーションのアプリケーションプールアカウントコンテキストが使用されます。これは、アプリケーションプールアカウントにファーム構成データベースへの書き込み権限がある場合にのみ成功します。このような状況が発生した場合は、通常、(a)ファームサービスアカウントがロールすべきでないロールで使用されている(コンテンツWebアプリケーションを実行しているなど)、(b)アプリケーションプールに余分なアクセス許可が与えられているアカウント。どちらのケースも、ベストプラクティスの運用モデルからの逸脱を表しています。

通常、タイマージョブインスタンスは、機能起動時に、ファームまたはWebApplicationレベルのスコープのフィーチャーで作成されます。どうして?これらの機能は通常、コマンドライン(管理者にもファーム構成データベースでの権限があることを前提とします)またはサーバーの全体管理(ファームサービスアカウントを通じてアクティブ化が行われ、設定データベース)。機能がアクティブになり、SPFeatureReceiverのFeatureActivatedメソッドが呼び出されると、(セキュリティの観点から)タイマージョブを設定することは安全です。

問題を適切に解決するには、問題を頭に少しでも向けることが必要です。オンデマンドでサイトコレクション内からタイマージョブをインスタンス化しようとするのではなく、機能がアクティブになった時点で「スイープ」タイマージョブと同等の設定をお勧めします。確かに、これはあなたがしようとしているものよりも多くの計画と努力を必要としますが、セキュリティが何らかの形で調整されていれば、あなたの現在の道のりはうまくいくでしょう。

BLOBキャッシュファームの機能(http://blobcachefarmflush.codeplex.com)をまとめるとき、私は同じことを自分自身でやっていました。私は、FeatureReceiverクラス(BlobCacheFarmFlushSweepJobFeatureReceiver)でタイマージョブの作成をどのように処理したかの詳細を見ることができます。その他のコードと関連ドキュメントは、他にもいくつかの課題が発生するのを助けるかもしれません。

どのような方法でも見つけたものを自由に使用できます。それがそこにある理由です!

私は役立つことを願っています。フォローアップの質問がある場合は消して、できる限り私は答えます:-)

+0

Hey Sean あなたの返事のためにThanx .....私はそれが非常に便利だとわかりました。 私は確かに私が持っている場合はクエリを尋ねます....余りにも – Anoop

+0

このジョブを設定して実行するには? – Evgeny

+0

私は自分のPCの管理者です。 – Evgeny

-3

Iを使用しているRunWithElevatedPrivileges

SPSecurity.RunWithElevatedPrivileges(デリゲート() {})。

それは私のために働いています.....誰かが別の解決策を持っていますか?もしそうなら、私に知らせてください。

+0

あなたはこれが役立つことがあります。http://stackoverflow.com/questions/638314 –

+2

アヌープ、あなたはここで説明する方法を使用(することはできません)ん、なぜ上記のショーンからの説明を参照してください。ショーンはこれをはっきりと説明してくれました。 –

0

SPPersistedObject.HasAdditionalUpdateAccess()メソッドをオーバーライドしてtrueを返します。

protected override bool HasAdditionalUpdateAccess() { return true; }