WinAPI NetUserGetInfo()失败,Active Directory域上出现NERR_UserNotFound错误代码

时间:2011-11-16 09:58:53

标签: c++ active-directory network-programming winapi

我正在从本地服务应用程序运行以下代码。目的是在调用LoadUserProfile()以在调用CreateProcessAsUser()以代表该用户运行用户模式进程之前加载该用户的配置文件之前获取用户配置文件的路径。

请注意,此问题与LoadUserProfile()或CreateProcessAsUser()无关。

这是怎么回事。当以下代码在作为Active Directory域的一部分的Windows XP上运行时,如果单个用户通过本地控制台登录(下面使用该用户的会话ID),则NetUserGetInfo()API将失败。另请注意,它在任何其他情况下都能正常工作:

//'dwSessID' = session ID of the user to retrieve a user profile path for
LPTSTR pUserName = NULL;
DWORD dwcbSzUserName = 0;
if(!WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, dwSessID, WTSUserName, &pUserName, &dwcbSzUserName))
{
    //Error
    return false;
}

USER_INFO_4* pUI4 = NULL;
DWORD dwNetStatus;
if((dwNetStatus = NetUserGetInfo(NULL, pUserName, 4, (BYTE**)&pUI4)) == NERR_Success)
{
    PROFILEINFO pfi = {0};
    pfi.dwSize = sizeof(pfi);
    pfi.lpUserName = pUserName;
    pfi.dwFlags = PI_NOUI;
    pfi.lpProfilePath = pUI4->usri4_profile;

    LoadUserProfile(hToken, &pfi);

    //And so on
}
else
{
    //On that specific machine I get here with 'dwNetStatus' = 2221, 
    //or NERR_UserNotFound, that according to MSDN is 
    //"The user name could not be found."
    //Also note that GetLastError is not used for this API.
}

有人可以说明为什么NetUserGetInfo()会在该特定计算机上失败,以及如何修复此代码?

PS。我知道NetUserGetInfo的MSDN声明在Active Directory域上可能存在ACL问题,但它没有指定如何设置一个...

3 个答案:

答案 0 :(得分:1)

如果我阅读NetUserGetInfo的文档,请参阅您编码的数据的信息级别4。它写成第4级返回有关用户帐户的详细信息和其他属性。 此级别仅在服务器上有效。据我所知,这不是你的情况。您是否验证pUserName返回的WTSQuerySessionInformation的值。

答案 1 :(得分:0)

正如JPBlanc所述,NetUserGetInfo的级别4仅在服务器上有效。

另一个问题是您检索登录用户的名称,但不检索用户所属的域名。

答案 2 :(得分:0)

注意到您正在使用pUserName调用NetUserGetInfo,类型为LPTSTR。 有时它不起作用(如果您将编译项目以默认使用ANSII字符串)。

考虑将字符串类型更改为LPWSTR。