【发布时间】:2014-07-30 04:19:12
【问题描述】:
Windows 任务计划程序可以创建使用特定用户帐户运行的任务,而无需存储用户密码。他们称之为“S4U”,为用户服务。这应该像调度程序为当前用户创建这样的令牌并可以使用它在该用户帐户下运行调度进程一样工作。他们声称它无法使用该系统访问网络或加密资源。调度程序本身使用 SYSTEM 帐户运行以使其工作。这是article that describes it。相关引述:
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 搜索似乎提供了您需要的所有信息:social.msdn.microsoft.com/Search/…;特别是,LsaLogonUser API 函数完成了所有繁重的工作。
-
@HarryJohnston:这对我没有帮助。我不知道如何使用这个 API,没有工作示例。此外,我没有使用 WCF 或 ASP.NET,计算机可能加入也可能不加入域。我试过简单的
WindowsIdentity构造函数,但它说没有什么可以验证这个信息,或者什么。听起来它需要一个域控制器。但任务计划程序可以不用。 -
好吧,你试过什么?有没有看示例代码in the first article?
-
编辑了我关于什么不起作用的问题。虽然第一篇文章看起来像仅域控制器和服务器,并且代码完全不可读,但我会在家里尝试一下(在非域机器上)。
-
进程是否具有“作为操作系统的一部分”的权限?代码在哪里失败,出现什么错误代码或异常?