WinAPI NetUserGetInfo()在Active Directory域上失败,错误码为NERR_UserNo

WinAPI NetUserGetInfo() fails with NERR_UserNotFound error code on Active Directory domain

本文关键字:误码 错误 NERR UserNo 失败 NetUserGetInfo Active Directory WinAPI      更新时间:2023-10-16

我正在本地服务应用程序中运行以下代码段。目的是在调用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()在特定机器上失败,以及如何修复此代码?

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

如果我阅读NetUserGetInfo的文档,对于您编码的数据的信息级别为4。返回关于用户帐户的详细信息和附加属性。该级别仅在服务器上有效。据我所知,这不是你的案子。是否验证WTSQuerySessionInformation返回的pUserName的值

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

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

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

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