【问题标题】:Sharepoint: executing stsadm from a timer job + SHAREPOINT\System rightsSharepoint:从计时器作业执行 stsadm + SHAREPOINT\System 权限
【发布时间】:2010-09-05 10:44:37
【问题描述】:

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

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

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

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

现在看来一切都应该正常了,但这是我目前遇到的另一个问题。 Stsamd 失败并出现以下错误弹出窗口 (!)(Winternals filemon 显示在这种情况下 stsadm 正在管理员下运行):

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

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

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

任何建议表示赞赏:)

【问题讨论】:

    标签: sharepoint timer privileges stsadm event-viewer


    【解决方案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
    }
    

    【讨论】:

      【解决方案2】:

      SharePoint 计时器作业使用 SharePoint 公司管理员凭据运行,因为信息会进入 SharePoint 配置数据库。因此应用程序池将无权访问。

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

      【讨论】:

        【解决方案3】:

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

        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 基本上和上面的片段一样,只是没有用户名和密码

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-31
          • 2010-09-08
          相关资源
          最近更新 更多