8

ローカル管理者のWindows権限とSharePoint権限の両方を取得するためにSharePointタイマージョブが必要になるという異常な状況がありSHAREPOINT\Systemます。

ローカル管理者のメンバーであるアカウントを使用するようにタイマーサービスを構成するだけで、Windowsの特権を取得できます。これは、SharePointタイマーサービスに想定よりも多くの権限を与えるため、適切なソリューションではないことを理解しています。ただし、少なくともSharePointタイマージョブを実行できますstsadm

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

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

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

The application failed to initialize properly (0x0c0000142).
Click OK to terminate the application.

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

ローカル管理者ユーザーが私のアカウントであり、stsadmこのアカウントでインタラクティブに実行するだけで、すべて問題ありません。このアカウントで実行するようにタイマーサービスを構成すると、正常に機能します。

任意の提案をいただければ幸いです:)

4

3 に答える 3

1

私は仕事をしていないので、これは頭から離れていますが、サイトへの参照を取得した場合、SYSTEM-UserTokenを使用して新しいSPSiteを作成してみてください。

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

using (SPSite syssite = new SPSite(thisSite.Url,sut)
{
    // Do what you have to do
}
于 2008-08-06T17:31:48.220 に答える
0

この方法で (つまり、明示的な資格情報を使用したタイマー ジョブから) 実行した場合、他のアプリケーションは、「アプリケーションを適切に初期化できませんでした」という同じ方法で失敗します。別の実行可能ファイルのパスとその引数をパラメーターとして受け取る単純なアプリを作成しただけで、そのタイマージョブから実行すると同じように失敗します。

internal class ExternalProcess
{
    public static void run(String executablePath, String workingDirectory, String programArguments, String domain, String userName,
                           String password, out Int32 exitCode, out String output)
    {
        Process process = new Process();

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

        StringBuilder outputString = new StringBuilder();
        Object synchObj = new object();

        DataReceivedEventHandler outputAppender =
            delegate(Object sender, DataReceivedEventArgs args)
                {
                    lock (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 (Char c in password)
        {
            passwordString.AppendChar(c);
        }

        process.StartInfo.Password = passwordString;

        process.Start();

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

        process.WaitForExit();

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

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

于 2008-08-07T10:25:33.090 に答える
0

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

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

于 2011-05-09T14:40:01.507 に答える