Windows任务计划程序可以创build与特定用户帐户一起运行的任务,而无需存储用户密码。 他们称之为“S4U”,为用户服务。 这应该像调度程序为当前用户创build一个令牌一样工作,并可以使用它来运行该用户帐户下的预定过程。 他们声称,它不能使用这个系统访问networking或encryption的资源。 调度程序本身使用SYSTEM帐户运行。 这是一篇描述它的文章 。 相关报价:
TASK_LOGON_S4U是另一个选项,提供了一个更安全的select。 它利用用户(S4U)login服务代表指定用户运行任务,而不必存储密码。 由于任务计划程序在本地系统帐户中运行,因此它可以创build一个S4Ulogin会话并接收一个令牌,该令牌不仅可用于识别,还可用于本地计算机上的模拟。 通常S4U令牌只能用于识别。
我需要在我的应用程序中使用这种身份validationscheme,但不能让任务计划程序执行此操作,但需要自己执行此操作,因为我需要它来执行任意数量的帐户。 每当用户使用我的应用程序注册任务时,任何后续任务都必须在同一个用户下运行。 但是由于它们不能重叠,所以我需要自己做序列化。
我找不到任何关于这个“S4U”的信息。 我怎么能在我的应用程序中执行它? C#首选,但WINAPI和C是好的。
更新:这是我已经尝试过,而且不起作用。
// The WindowsIdentity(string) constructor uses the new // Kerberos S4U extension to get a logon for the user // without a password. WindowsIdentity wi = new WindowsIdentity(identity); WindowsImpersonationContext wic = null; try { wic = wi.Impersonate(); // Code to access network resources goes here. } catch() { // Ensure that an exception is not propagated higher in the call stack. } finally { // Make sure to remove the impersonation token if( wic != null) wic.Undo(); }
但我现在有这样的印象,你不能只说你想成为一个特定的用户。 甚至不是系统。 您需要以该用户身份login,并且可以生成一些令牌,以便以后再次成为该用户,而不需要密码。 所以这必须是两步走的事情,首先我需要获取令牌并将其存储在磁盘上; 以后我可以用这个标记来模仿。 没有一个例子解释这一点。
“计算机可能不会加入到域”
S4U需要访问KDC。 S4U实际上是两个协议。 S4U2Self和S4U2Proxy。 它正在做的是使用Kerberos的附加功能来获取用户的服务票据,但该票据和获得票证必须启用一个特殊的委托。 看这里设置。
但是除非你真的让这个过程死亡,为什么不只是获得用户服务票或TGT? 您的应用程序是本地还是远程运行的服务?
任务调度程序需要去获得一个新的,因为服务票证是永远无效的。 或者在一些委托方案中,用户没有将服务票据传递给应用服务器,然后AS通过S4U2Self去请求和服务票据,然后使用该服务票据通过S4U2Proxy请求到第二个服务的票证。