8

我有一个不寻常的情况,我需要一个 SharePoint 计时器作业来同时拥有本地管理员窗口权限和SHAREPOINT\SystemSharePoint 权限。

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

在本地管理员下运行计时器服务的另一个问题是,此用户不一定具有SHAREPOINT\SystemSharePoint 权限,而我也需要此 SharePoint 作业。事实证明,SPSecurity.RunWithElevatedPrivileges在这种情况下不起作用。Reflector 显示RunWithElevatedPrivileges检查当前进程是否是owstimer(运行 SharePoint 作业的服务进程)并且不执行提升是这种情况(我猜这里的原因是计时器服务应该在NT AUTHORITY\NetworkService具有SHAREPOINT\SystemSharePoint的 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在此帐户下交互运行时,一切正常。当我将计时器服务配置为在此帐户下运行时,它也可以正常工作。

任何建议表示赞赏:)

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 公司管理员凭据运行,因为信息会进入 SharePoint 配置数据库。因此应用程序池将无权访问。

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

于 2011-05-09T14:40:01.507 回答