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

C++ WinAPI NetUserGetInfo()失败,Active Directory域上出现NERR_UserNotFound错误代码,c++,active-directory,network-programming,winapi,C++,Active Directory,Network Programming,Winapi,我正在本地服务应用程序中运行以下代码。其目的是在调用LoadUserProfile()之前获取用户配置文件的路径,以便在调用CreateProcessAsUser()代表该用户运行用户模式进程之前加载该用户的配置文件 请注意,此问题与LoadUserProfile()或CreateProcessAsUser()无关 事情就是这样。当以下代码在Windows XP w/SP3(Active Directory域的一部分)上运行时,单个用户通过本地控制台登录(下面使用该用户的会话ID),NetUse

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

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

事情就是这样。当以下代码在Windows XP w/SP3(Active Directory域的一部分)上运行时,单个用户通过本地控制台登录(下面使用该用户的会话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()会在特定的机器上失败,以及如何修复此代码吗


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

如果我阅读了文档,您编码的数据的信息级别为4。第4级返回有关用户帐户的详细信息和附加属性此级别仅在服务器上有效。据我所知,这不是你的情况。您是否验证由
WTSQuerySessionInformation

返回的
pUserName
值,如JPBlanc所述,级别为4的NetUserGetInfo仅在服务器上有效


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

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


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

只是一个想法-您是否在多台XP/SP3计算机和不同的用户帐户上尝试过它?可能需要消除一个不可靠的构建或配置文件。不,它不是那个特定的机器。ACL中有一些东西我没有设置为NetUserGetInfo()工作。我也欢迎任何绕过API的想法?你能使用DirectoryServices查询广告吗?这是针对本机C/C++项目的。抱歉-改为直接LDAP查询如何?目录服务只是LDAP上的包装器。ADSI是接口。是的,WTSQuerySessionInformation返回的pUserName是一个用户名,类似于“user123”。不是空串。伙计们,你们一直指着我做得不对的地方。。。我知道。。。样本在所有情况下都不起作用。你能给我一个“正确”的方法来检索用户配置文件的路径吗?我给了你一个提示:它可能与用户登录的域有关。你检查过这是否是问题所在吗?您是否检查了问题是否只是您在这台计算机上与来自不同域的用户登录?关于第4级问题:尝试查询DC和该DC上的NetUserGetInfo。