2014-06-09 51 views
2

Windows任务计划程序可以创建与特定用户的帐户一起运行但不存储用户密码的任务。他们称之为“S4U”,为用户服务。这应该像调度程序为当前用户创建一个令牌一样工作,并可以使用它来运行该用户帐户下的预定过程。他们声称,它无法使用此系统访问网络或加密资源。调度程序本身使用SYSTEM帐户运行以使其工作。这是一个article that describes it。从它的相关报价:为用户(S4U)令牌创建服务

TASK_LOGON_S4U是又提供了一个更安全的替代 另一种选择。它利用服务为用户(S4U)登录到 代表指定用户运行任务,但不必 存储密码。由于任务计划程序在本地 系统帐户内运行,因此它可以创建S4U登录会话并接收标记 ,该标记不仅可用于标识,还可用于在本地计算机上模拟 。通常,S4U令牌仅用于识别 。

我需要在我的应用程序中使用这种身份验证方案,但不能让任务计划程序执行它,但需要自己执行此操作,因为我需要它来执行任意数量的帐户。每当用户向我的应用程序注册任务时,任何后续任务都必须在同一用户下运行。但由于它们不能重叠,我需要自己做序列化。

我找不到任何关于这个“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(); 
} 

但是我现在得到的印象是,你不能只说你想成为某个用户。甚至不是系统。您需要以该用户身份登录,并且可以生成一些令牌,以便以后再次成为该用户,而不需要密码。所以这必须是两步走的事情,首先我需要获取令牌并将其存储在磁盘上;稍后我可以使用该标记来模拟。这些例子都没有解释这一点。

+0

MSDN搜索似乎提供了您需要的所有信息:http://social.msdn.microsoft.com/Search/zh-CN?query=S4U&emptyWatermark=true &ac=4 ;特别是,LsaLogonUser API函数完成所有重吊装。 –

+0

@哈里约翰斯顿:那对我没有帮助。我不知道如何使用这个API,没有工作的例子。此外,我不与WCF或ASP。NET,并且计算机可能会或可能不会加入域。我试过简单的'WindowsIdentity'构造函数,但它说没有什么可以验证这个信息,或者什么。听起来像它需要一个域控制器。但是任务计划程序可以没有。 – ygoe

+0

那么,你有什么尝试?您是否看过[第一篇文章]中的示例代码(http://msdn.microsoft.com/zh-cn/magazine/cc188757.aspx)? –

回答

0

“的计算机可以不被加入到域”

S4U需要访问KDC。 S4U实际上是两个协议。 S4U2Self和S4U2Proxy。它正在做的是使用Kerberos的附加功能来获取用户的服务票据,但该票据并获得票证必须启用特殊委派。 See here为此设置。

但是,除非你真的让这个过程死亡等等,为什么不只是获得用户服务票或TGT?您的应用程序是本地应用程序,还是远程运行的服务?

任务计划程序需要去获取一个新计划,因为服务票证永远无效。或者在一些委托方案中,用户没有将服务票证传递给应用程序服务器,然后AS通过S4U2Self进行请求并提供服务票证,然后使用该服务票证通过S4U2Proxy请求第二项服务的票证。

相关问题