Я запускаю следующий фрагмент кода из локального приложения-службы.Цель состоит в том, чтобы получить путь к профилю пользователя перед вызовом LoadUserProfile () для загрузки профиля этого пользователя перед вызовом CreateProcessAsUser () для запуска процесса пользовательского режима от имени этого пользователя.
Обратите внимание, что этот вопросне о LoadUserProfile () или CreateProcessAsUser ().
Что происходит, это так.Когда приведенный ниже код выполняется в Windows XP с пакетом обновления 3 (SP3), который является частью домена Active Directory, когда один пользователь вошел в систему через локальную консоль (идентификатор сеанса этого пользователя используется ниже), API-интерфейс NetUserGetInfo () завершается ошибкой.Также обратите внимание, что он отлично работает при любых других обстоятельствах:
//'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.Я знаю, что MSDN для NetUserGetInfo заявляет, что могут быть проблемы с ACL в домене Active Directory, но не указывает, как его установить ...