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

我遇到了一种不寻常的情况,我需要一个SharePoint计时器作业,使其具有本地管理员的Windows特权并具有 SHAREPOINT \ System SharePoint特权。

我可以通过简单配置计时器服务来使用本地管理员的帐户来获得Windows权限。我知道这不是一个好的解决方案,因为它给SharePoint定时器服务更多的权利,然后它应该有。但它至少允许我的SharePoint计时器作业运行 stsadm

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

这里唯一可能的解决方案似乎是在其通常的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 时,一切正常。当我将计时器服务配置为在此帐户下运行时,它也可以正常工作。

任何建议都赞赏:)

0
额外 编辑
意见: 1

3 答案

我不在工作,所以这是我的头顶,但:如果你得到一个网站的参考,你可以尝试创建一个新的SPSite与SYSTEM-UserToken?

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计时器作业使用SharePoint Firm Admin凭据运行。因此应用程序池将不具有访问权限。

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

0
额外