Sharepoint:从计时器作业执行stsadm+;SHAREPOINT\系统权限

Sharepoint:从计时器作业执行stsadm+;SHAREPOINT\系统权限,sharepoint,timer,privileges,stsadm,event-viewer,Sharepoint,Timer,Privileges,Stsadm,Event Viewer,我遇到了一个不寻常的情况,即我需要SharePoint计时器作业来同时具有本地管理员windows权限和SharePoint\SystemSharePoint权限 我只需将计时器服务配置为使用作为本地管理员成员的帐户,即可获得windows权限。我知道这不是一个好的解决方案,因为它给了SharePoint timer service比它应该拥有的更多的权限。但它至少允许我的SharePoint计时器作业运行stsadm 在本地管理员下运行计时器服务的另一个问题是,此用户不一定具有此SHAREPO

我遇到了一个不寻常的情况,即我需要SharePoint计时器作业来同时具有本地管理员windows权限和
SharePoint\System
SharePoint权限

我只需将计时器服务配置为使用作为本地管理员成员的帐户,即可获得windows权限。我知道这不是一个好的解决方案,因为它给了SharePoint timer service比它应该拥有的更多的权限。但它至少允许我的SharePoint计时器作业运行
stsadm

在本地管理员下运行计时器服务的另一个问题是,此用户不一定具有此SHAREPOINT作业所需的
SHAREPOINT\System
SHAREPOINT权限。事实证明,
SPSecurity.RunWithElevatedPrivileges
在这种情况下不起作用。Reflector显示,
RunWithElevatedPrivileges
检查当前进程是否为
owstimer
(运行SharePoint作业的服务进程),并且不执行提升。情况就是这样(我猜,这里的理由是计时器服务应该在
NT AUTHORITY\NetworkService
windows帐户下运行,该帐户具有
SHAREPOINT\System
SHAREPOINT权限,因此不需要提升计时器作业的权限)

这里唯一可能的解决方案似乎是在其常用的NetworkService windows帐户下运行计时器服务,并通过将管理员凭据存储在某处并通过StarInfo的用户名、域和密码将其传递给System.Diagnostics.Process.run()以本地管理员身份运行stsadm

现在似乎一切都可以正常工作了,但我现在遇到了另一个问题。Stsamd失败,出现以下错误弹出(!)(Winternals filemon显示,在这种情况下,stsadm是在管理员下运行的):

应用程序未能正确初始化(0x0C00000142)。

单击“确定”终止应用程序。

事件查看器只注册弹出窗口

本地管理员用户是我的帐户,当我在该帐户下以交互方式运行stsadm时,一切正常。当我将计时器服务配置为在此帐户下运行时,它也可以正常工作


任何建议都非常感谢:)

我不在工作,所以这是我不知道的,但是:如果你得到了该网站的参考,你能尝试用系统UserToken创建一个新的SPSite吗

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

using (SPSite syssite = new SPSite(thisSite.Url,sut)
{
    // Do what you have to do
}

其他应用程序如果以这种方式运行(即从具有显式凭据的计时器作业运行),则会以与“应用程序未能正确初始化”相同的方式失败。我只是编写了一个简单的应用程序,它将另一个可执行文件的路径及其参数作为参数,当从计时器作业运行时,它也会以同样的方式失败

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基本上与上述片段相同,但没有用户名和密码,SharePoint计时器作业将使用SharePoint公司管理员凭据运行,因为信息会进入SharePoint配置数据库。因此,应用程序池将不具有访问权限

为了在dev环境中测试计时器作业,我们可以临时将应用程序池帐户更改为用于中央管理的应用程序池帐户