我有一个不寻常的情况,我需要一个 SharePoint 计时器作业来同时拥有本地管理员 Windows 权限和 SHAREPOINT\System
SharePoint 权限。
我可以通过简单地将计时器服务配置为使用本地管理员成员的帐户来获得 Windows 权限。我知道这不是一个好的解决方案,因为它为 SharePoint 计时器服务提供了比它应该拥有的更多权限。但它至少允许我的 SharePoint 计时器作业运行 stsadm
.
在本地管理员下运行计时器服务的另一个问题是该用户不一定有 SHAREPOINT\System
我也需要此 SharePoint 工作的 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 正在管理员下运行):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 + SHAREPOINT\System 权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3739/