我有一个不寻常的情况,我需要一个 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在此帐户下交互运行时,一切正常。当我将计时器服务配置为在此帐户下运行时,它也可以正常工作。
任何建议表示赞赏:)