7


0

Sharepoint:タイマージョブからstsadmを実行するSHAREPOINT \ System rights

私は、ローカルの管理者ウィンドウ権限と SHAREPOINT \ System SharePoint権限の両方を持つためにSharePointタイマージョブを必要とするという異常な状況があります。

ローカル管理者のメンバーであるアカウントを使用するようにタイマーサービスを設定するだけで、Windows特権を取得できます。 これは、SharePointタイマーサービスに必要な権限よりも多くの権限を付与するため、これは良い解決策ではないことを理解しています。 しかし、それは少なくとも私のSharePointタイマージョブが `stsadm`を実行することを可能にします。

ローカル管理者の下でタイマーサービスを実行することに関するもう1つの問題は、このユーザーが必ずしもこのSharePointジョブに必要な SHAREPOINT \ System SharePoint特権を必ずしも持っていないことです。 この場合、 SPSecurity.RunWithElevatedPrivileges`は機能しません。 Reflectorは、 `RunWithElevatedPrivileges`が現在のプロセスが owstimer`(SharePointジョブを実行するサービスプロセス)であるかどうかをチェックし、昇格を実行しないことを示しています(ここでの合理的な理由は、タイマーサービスは`NT AUTHORITY \ NetworkService`ウィンドウアカウント。これは` SHAREPOINT \ System` SharePoint特権を持っているので、タイマージョブの特権を昇格する必要はありません。

ここで考えられる唯一の解決策は、通常のNetworkService windowsアカウントでtimerサービスを実行し、どこかに管理者の資格情報を保存し、それらをStarInfoのUsernameを通してSystem.Diagnostics.Process.Run()に渡すことによってローカル管理者として実行することです。 、ドメイン、パスワード

これですべてうまくいくはずですが、今ここで私が抱えているもう1つの問題があります。 Stsamdは、次のエラーポップアップ(!)で失敗します(Winternals filemonは、この場合stsadmが管理者の下で実行されていることを示しています)。

「アプリケーションを正しく初期化できませんでした(0x0c0000142)。」「OK」をクリックしてアプリケーションを終了します。

イベントビューアはポップアップ以外に何も登録しません。

ローカルの管理者ユーザーは私のアカウントです。このアカウントで対話的に `stsadm`を実行しただけでも大丈夫です。 このアカウントで実行するようにタイマーサービスを設定してもうまくいきます。

任意の提案は大歓迎です:)

3 Answer


1


私は仕事をしていないので、これは私の頭から離れていますが、あなたがサイトへの参照を得た場合、あなたはSYSTEM-UserTokenで新しいSPSiteを作成しようとすることができますか?

SPUserToken sut = thisSite.RootWeb.AllUsers ["SHAREPOINT \ SYSTEM"]。UserToken;

using(SPSite syssite = new SPSite(thisSite.Url、sut){//あなたがしなければならないことをしてください}


0


他のアプリケーションがこの方法で実行されている場合 明示的な資格情報を持つタイマージョブから)は、「アプリケーションは正しく初期化できませんでした」と同じように失敗します。 私はちょうど別の実行可能ファイルとその引数のパラメータとしてのパスを取り、そのタイマージョブから実行されたときにそれが同じように失敗する単純なアプリを開発しました。

内部クラスExternalProcess {public static void run(String executablePath、String workingDirectory、String programArguments、Stringドメイン、String userName、Stringパスワード、out Int32 exitCode、out文字列出力){プロセスprocess = new Process();

process.StartInfo.UseShellExecute = false; process.StartInfo.RedirectStandardError = true; process.StartInfo.RedirectStandardOutput = true;

StringBuilder outputString = new StringBuilder();オブジェクトsynchObj = new object();

DataReceivedEventHandler outputAppender =デリゲート(オブジェクトセンダ、DataReceivedEventArgs引数){ロック(synchObj){outputString.AppendLine(args.Data); ;}};

process.OutputDataReceived = outputAppender; process.ErrorDataReceived = outputAppender;

process.StartInfo.FileName = @ "C:\ AppRunner.exe"; process.StartInfo.WorkingDirectory = workingDirectory; process.StartInfo.Arguments = @ "" "" executablePath @ "" "programArguments;

process.StartInfo.UserName = userName; process.StartInfo.Domain = domain; SecureString passwordString = new SecureString();

foreach(パスワードの文字c){passwordString.AppendChar(c); }

process.StartInfo.Password = passwordString;

process.Start();

process.BeginOutputReadLine(); process.BeginErrorReadLine();

process.WaitForExit();

exitCode = process.ExitCode; output = outputString.ToString(); }}

AppRunnerは基本的に上記のフラグメントと同じですが、ユーザ名とパスワードがありません。


0


情報がSharePoint構成データベースに入るため、SharePoint TimerジョブはSharePoint Firm Admin資格情報を使用して実行されます。 そのため、アプリケーションプールはアクセスできません。

開発環境でタイマージョブをテストするために、アプリケーションプールアカウントをサーバーの全体管理に使用されているアプリケーションプールアカウントに一時的に変更することができます。