【问题标题】:Why doesn't LogonUser(...) work for domain accounts?为什么 LogonUser(...) 不适用于域帐户?
【发布时间】:2011-11-21 06:33:36
【问题描述】:

我一直在尝试使用LogonUser(...) 来获取用户帐户的访问令牌,如this MSDN sample

// Call LogonUser to obtain a handle to an access token.
bool returnValue = LogonUser(userName, domainName, Console.ReadLine(),
    LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT,
    out safeTokenHandle);

当我运行示例(具有管理员权限)时,如果给定域 . 和本地用户帐户名和密码,它可以正常工作,但无论我做什么,我都会收到错误代码 1326(登录失败: 未知用户名或密码错误)如果我尝试使用域帐户。如果我为域输入垃圾,我会得到相同的结果,这让我怀疑它是否真的在联系 DC。

是什么阻止了它的工作?

【问题讨论】:

  • 不幸的是,这可能是由于很多事情造成的。机器是否连接到域?是否允许域用户登录该计算机? DNS 设置是否正确配置? (我确实看到一篇 Citrix 文章暗示这可能是一个问题。)。以下文章提供了一些有关当您为域输入垃圾时发生的情况的信息 - groups.google.com/group/…
  • 您是否验证了这在没有 Console.ReadLine() 调用的情况下也可以工作(例如,直接提供密码作为字符串)?
  • 密码的来源没有区别——当它被传递给LogonUser时是一个字符串。
  • 要检查与域的连接是否正常,请尝试以域用户的身份交互登录。您是否仔细检查过您传递的域名是否正确?你试过全限定域名吗?
  • 我猜这可能是由于缺少 SE_TCB_NAME 权限。您可以通过在“本地安全策略”-“本地策略”-“用户权限”中添加域帐户以“作为操作系统的一部分”来测试(如果域策略允许)。跨度>

标签: windows security winapi active-directory impersonation


【解决方案1】:

在我的情况下,与提问者类似的问题是,我尝试对其进行身份验证的帐户位于我当前计算机不属于的域中。与原始海报不同,我的机器不应该也不能成为这个其他域的一部分。不过,我希望登录对此域上的资源执行操作。

答案如下

bool success = LogonUser(
                userName,
                domain,
                password,
                (int)LOGON32_LOGON_NEW_CREDENTIALS, //9
                (int)LOGON32_PROVIDER_DEFAULT, //0
                out userToken);

定义了以下常量:

public const int LOGON32_LOGON_NEW_CREDENTIALS = 9;
public const int LOGON32_PROVIDER_DEFAULT = 0;

希望这能帮助其他在类似情况下迷路的人。

编辑:如下面的 cmets 所述,此登录类型允许调用者克隆其当前令牌并为出站连接指定新凭据。新的登录会话具有相同的本地标识符,但对其他网络连接使用不同的凭据。因此,即使密码错误,“成功”也会返回 true。除了“成功”之外,您还需要进行额外检查,以确认凭据确实有效。

这在我最初的用例中不是一个问题,因为我们在另一个函数中使用了当前网络用户的凭据从安全存储中提取明文密码。因此,除非该系统和活动目录之间存在不一致,否则它永远不会出错,在这种情况下我们会遇到更大的问题。

【讨论】:

  • 即使密码无效也会返回success = 1
  • 根据此问题的答案 (stackoverflow.com/questions/35338656/…),“您提供的凭据仅用于出站连接。当您尝试此类连接时,将在此时检查凭据,您可以那么期待失败。”。这是预期的行为,您需要进行额外检查以查看凭据是否有用。
【解决方案2】:

在我的情况下,尽管我作为域用户登录到我的计算机,但我的计算机本身并不是域的一部分。一旦添加到域中,示例就开始工作了。

【讨论】:

  • 未加入域时如何以域用户身份登录计算机?
【解决方案3】:

在这种情况下使用带有空域名的DOMAIN\LOGIN...

【讨论】:

  • DOMAIN\USERNAMEUSERNAME@DOMAIN 都收到相同的错误,并将空域名传递给 LogonUser
猜你喜欢
  • 2010-11-02
  • 1970-01-01
  • 2012-12-02
  • 1970-01-01
  • 1970-01-01
  • 2021-02-23
  • 2020-04-19
  • 1970-01-01
  • 2011-02-24
相关资源
最近更新 更多