【发布时间】:2015-06-11 04:41:47
【问题描述】:
我正在从本地服务应用程序运行以下代码。目的是在调用 LoadUserProfile() 以加载该用户的配置文件之前获取用户配置文件的路径,然后再调用 CreateProcessAsUser() 以代表该用户运行用户模式进程。
请注意,此问题与 LoadUserProfile() 或 CreateProcessAsUser() 无关。
发生的事情是这样的。当下面的代码在作为 Active Directory 域的一部分的 Windows XP w/SP3 上运行时,单个用户通过本地控制台登录(该用户的会话 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 可能存在问题,但它没有指定如何设置...
【问题讨论】:
-
只是一个想法 - 您是否在多台 XP/SP3 机器上使用不同的用户帐户尝试过它?可能想要消除俗气的构建或配置文件。
-
不,这不是特定的机器。我没有为 NetUserGetInfo() 工作设置 ACL 中的某些内容。我也欢迎任何绕过该 API 的想法?
-
可以使用 DirectoryServices 查询 AD 吗? forums.asp.net/t/1415018.aspx/1
-
这是针对原生 C/C++ 项目的。
-
抱歉 - 直接 LDAP 查询怎么样?目录服务只是 LDAP 的包装器。 ADSI 是接口。
标签: c++ active-directory network-programming winapi