【问题标题】:LookupAccountName fails with 1332 on Windows 7 64 bitLookupAccountName 在 Windows 7 64 位上失败并显示 1332
【发布时间】:2016-03-09 19:08:58
【问题描述】:

我有一个小型应用程序,它尝试在 Windows 7 64 位上获取给定用户的 SID。应用程序编译为 64 位。

  PSID         Sid;
  DWORD        cbReferencedDomainName, cbSid;
  LPTSTR       ReferencedDomainName;
  SID_NAME_USE eUse;
  DWORD dwRc = 0;

  printf("Lookup %s\n",lpszAccountName);
  cbReferencedDomainName = cbSid = 0;
  if (LookupAccountName(NULL, lpszAccountName, 0, &cbSid, 
                        0, &cbReferencedDomainName, &eUse)) {
    printf("LookupAccountName passed\n");

    return 0;
  }

  dwRc = GetLastError();
  printf("LookupAccountName RC (%d)\n",dwRc);

我以 uid@hostname 格式传递用户名。对于机器上存在的每个用户,该 API 都会失败,GetLastError 返回 1332 -“未完成帐户名称和安全 ID 之间的映射。”。请帮忙。

【问题讨论】:

  • 格式错误,不是电子邮件地址。请改用domain\username
  • 谢谢。机器不在域中。我试过 machinename\user 但也失败了。
  • 使用.\username 避免机器名称错误。不要忘记在 C 程序中使用两个反斜杠。
  • MSDN (msdn.microsoft.com/en-us/library/windows/desktop/…) 表示 API 也支持someone@example.com 格式。也试过 .\username 也失败了。
  • 我发现对于机器本地的用户帐户,指定 '.\username' 不起作用(导致错误 1332),但只有 'username' 起作用。当尝试以 DOMAIN\user 形式添加域帐户时,由于我的机器不是我试图定位的用户域的一部分,导致错误 1332。将我的机器添加到域中解决了这个问题。

标签: windows-7-x64


【解决方案1】:

我和一位同事重新审视了这个问题。我们发现问题出在 Visual Studio 项目设置中使用的字符集。默认情况下,Visual Studio 将字符集设置为 Use Unicode Character Set。然而,我们的应用程序需要使用 ASCII 字符集,因为我们的应用程序需要从命令行读取输入。因此,从命令行读取的输入是 ASCII,但我们将该输入传递给 LookupAccountName API 的宽字符版本,即 LookupAccountNameW。这导致 API 返回 1332 错误代码。

所以我们将字符集更改为“未设置”并重新编译应用程序。这确保了使用正确形式的 API,LookupAccountNamA。这解决了问题。我相信将字符集设置为“”也可以解决问题。

希望这会有用。

【讨论】:

    猜你喜欢
    • 2011-12-03
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-05
    • 2017-01-30
    • 1970-01-01
    • 2012-09-03
    相关资源
    最近更新 更多