WinAPI NetUserGetInfo () завершается ошибкой с кодом ошибки NERR_UserNotFound в домене Active Directory - PullRequest
0 голосов
/ 16 ноября 2011

Я запускаю следующий фрагмент кода из локального приложения-службы.Цель состоит в том, чтобы получить путь к профилю пользователя перед вызовом 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, но не указывает, как его установить ...

Ответы [ 3 ]

1 голос
/ 16 ноября 2011

Если я читаю документацию для NetUserGetInfo , для информационного уровня данных вы кодируете 4. Написано Уровень 4 Возвращает подробную информацию и дополнительные атрибуты об учетной записи пользователя. Этот уровень действителен только на серверах . Насколько я понимаю, это не ваш случай. Вы проверяете значение pUserName, возвращаемое WTSQuerySessionInformation.

0 голосов
/ 10 июня 2015

Заметил, что вы вызываете NetUserGetInfo с pUserName типа LPTSTR.Иногда это не сработает (если вы скомпилируете свой проект для использования строк ANSII по умолчанию).

Рассмотрите возможность изменения типов строк на LPWSTR.

0 голосов
/ 17 ноября 2011

Как заявил JPBlanc, NetUserGetInfo с уровнем 4 действителен только на серверах.

Другая проблема заключается в том, что вы получаете имя вошедшего в систему пользователя, но не домен, к которому принадлежит пользователь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...