SharePoint:如何在定时任务中执行stsadm + SHAREPOINT\System权限

8
我有一个不寻常的情况,需要SharePoint计时作业既具有本地管理员Windows权限,又具有SHAREPOINT \ System SharePoint权限。
我可以通过将计时服务配置为使用属于本地管理员的帐户来获得Windows权限。我理解这不是一个好的解决方案,因为它给予SharePoint计时服务比它应该拥有的更多的权利。但至少它允许我的SharePoint计时作业运行stsadm。
在以本地管理员身份运行计时服务时的另一个问题是,此用户不一定具有我还需要的SHAREPOINT \ System SharePoint权限。事实证明,在这种情况下,SPSecurity.RunWithElevatedPrivileges无法工作。反射器显示RunWithElevatedPrivileges检查当前进程是否为owstimer(运行SharePoint作业的服务进程),并且如果是,则不执行升级(这里的合理性是计时器服务应该在NT AUTHORITY \ NetworkService Windows帐户下运行,该帐户具有SHAREPOINT \ System SharePoint权限,因此不需要为计时作业提升特权)。
这里唯一可能的解决方案似乎是在其通常的NetworkService Windows帐户下运行计时服务,并通过将管理员凭据存储在某个地方并通过StarInfo的用户名、域和密码传递给System.Diagnostics.Process.Run()来以本地管理员身份运行stsadm。
现在似乎一切都应该正常工作,但是我现在遇到的另一个问题是卡住了。在这种情况下,Stsamd失败,并显示以下错误弹出窗口(!)(Winternals filemon显示stsadm在此情况下正在管理员下运行):
“应用程序无法正确初始化(0x0c0000142)。” “单击确定以终止应用程序。”
事件查看器什么也没有注册,除了弹出窗口。
本地管理员用户是我的帐户,当我只是以此帐户交互式运行stsadm时,一切正常。当我将计时服务配置为在此帐户下运行时,它也可以正常工作。
欢迎提出任何建议 :)
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
}

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基本上与上面的片段相同,但没有用户名和密码


0

SharePoint计时作业使用SharePoint Firm管理员凭据运行,因为信息存储在SharePoint配置数据库中。因此,应用程序池将无法访问。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接