我有一种不寻常的情况,我需要一个SharePoint计时器作业才能既具有本地管理员Windows特权又具有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帐户下运行计时器服务,并通过将管理员凭据存储在某处并将其通过StarInfo的用户名传递给System.Diagnostics.Process.Run()来以本地管理员身份运行stsadm。 ,域和密码。
似乎现在一切都应该可以正常工作,但是这是我目前仍然遇到的另一个问题。 Stsamd失败,并显示以下错误弹出窗口(!)(在这种情况下,Winternals filemon显示stsadm在管理员下运行):The application failed to initialize properly (0x0c0000142).
Click OK to terminate the application.
事件查看器不注册任何内容,但弹出窗口除外。
本地管理员用户是我的帐户,当我在该帐户下以交互方式运行stsadm
时,一切正常。当我将计时器服务配置为在此帐户下运行时,它也可以正常工作。
任何建议表示赞赏:)
最佳答案
我不在工作,所以这不是我的首要任务,但是:如果您获得对站点的引用,是否可以尝试使用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
}
关于共享点:从计时器作业+ SHAREPOINT\系统权限执行stsadm,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3739/