2014-03-13 579 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

希望這將是有益的。