2014-03-13 529 views
2

我有一个小应用程序,它试图获取Windows 7 64位上给定用户的SID。该应用程序被编译为64位。LookupAccountName失败,Windows 7 64位上的1332

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格式传递用户名。对于GetLastError计算机上存在的每个用户,API都会返回1332 - “帐户名称和安全ID之间没有映射已完成”。请帮忙。

+0

格式错误,它不是电子邮件地址。请改用'domain \ username'。 –

+0

谢谢。机器不在域中。我试过机器名\用户但也失败了。 – Shashi

+0

使用'。\ username'来避免机器名称错误。不要忘记在C程序中使用两个反斜杠。 –

回答

1

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

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

enter image description here

希望这将是有益的。