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();
}
但是我现在得到的印象是,你不能只说你想成为某个用户。甚至不是系统。您需要以该用户身份登录,并且可以生成一些令牌,以便以后再次成为该用户,而不需要密码。所以这必须是两步走的事情,首先我需要获取令牌并将其存储在磁盘上;稍后我可以使用该标记来模拟。这些例子都没有解释这一点。
MSDN搜索似乎提供了您需要的所有信息:http://social.msdn.microsoft.com/Search/zh-CN?query=S4U&emptyWatermark=true &ac=4 ;特别是,LsaLogonUser API函数完成所有重吊装。 –
@哈里约翰斯顿:那对我没有帮助。我不知道如何使用这个API,没有工作的例子。此外,我不与WCF或ASP。NET,并且计算机可能会或可能不会加入域。我试过简单的'WindowsIdentity'构造函数,但它说没有什么可以验证这个信息,或者什么。听起来像它需要一个域控制器。但是任务计划程序可以没有。 – ygoe
那么,你有什么尝试?您是否看过[第一篇文章]中的示例代码(http://msdn.microsoft.com/zh-cn/magazine/cc188757.aspx)? –