Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> LogonUser в Windows7/Server2008R2 
:(
    Опции темы
xaxaTyH
  Дата 9.1.2011, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 26.6.2006

Репутация: нет
Всего: нет



Добрый день.

Есть задача: есть некое средство развертывания приложений, которое доставляет пакет на конечную машину и запускает его из-под учетки localsystem. В этом пакете(в коде) нужно залогиниться под учеткой сетевого админа и запустить на установку патч.

Пытаюсь залогиниться следующим образом:
Код

#include <Windows.h>
#include <Userenv.h>
#include <tchar.h>
#include <string>

FILE *fp = NULL;

int main(int argc, TCHAR *argv[])
{
    HANDLE hToken;
    PROFILEINFO prInfo;

    DWORD dwSize;
    WCHAR szUserProfile[256] = L"";

    LPVOID lpvEnv;

    STARTUPINFO si_setup;
    PROCESS_INFORMATION pi_setup;

    //Кодировка по умолчанию
    _tsetlocale(LC_ALL, L"");

    //Создание и открытите файла лога
    _tfopen_s(&fp, L"C:\\Logon.log", L"w");

    if(!::LogonUser(L"user", L"domain", L"pass", LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &hToken))
    {
        _ftprintf(fp, L"LogonUser() FAILED with error code: %d\n", ::GetLastError());
        fclose(fp);
        ::CloseHandle(hToken);
        return 0;
    }
    else
    {
        _tprintf_s(L"LogonUser() successful!\n");
        _ftprintf(fp, L"LogonUser() SUCCESS with error code: %d\n", ::GetLastError());
    }

    ::ZeroMemory(&prInfo, sizeof(PROFILEINFO));
    prInfo.dwSize = sizeof(PROFILEINFO);
    prInfo.lpUserName = L"test";
    prInfo.dwFlags = PI_NOUI;

    if(!::LoadUserProfile(hToken, &prInfo))
    {
        _ftprintf(fp, L"LoadUserProfile() FAILED with error code: %d\n", ::GetLastError());
        fclose(fp);
        ::CloseHandle(hToken);
        return 0;
    }
    else
    {
        _tprintf_s(L"LoadUserProfile() successful!\n");
        _ftprintf(fp, L"LoadUserProfile() SUCCESS with error code: %d\n", ::GetLastError());
    }

    if(!::ImpersonateLoggedOnUser(hToken))
    {
        _ftprintf(fp, L"ImpersonateLoggedOnUser() FAILED with error code: %d\n", ::GetLastError());
        fclose(fp);
        ::CloseHandle(hToken);
        return 0;
    }
    else
    {
        _tprintf_s(L"ImpersonateLoggedOnUser() successful!\n");
        _ftprintf(fp, L"ImpersonateLoggedOnUser() SUCCESS with error code: %d\n", ::GetLastError());
    }

    dwSize = sizeof(szUserProfile)/sizeof(WCHAR);

    if(!::GetUserProfileDirectory(hToken, szUserProfile, &dwSize))
    {
        _ftprintf(fp, L"GetUserProfileDirectory() FAILED with error code: %d\n", ::GetLastError());
        fclose(fp);
        ::CloseHandle(hToken);
        return 0;
    }
    else
    {
        _tprintf_s(L"GetUserProfileDirectory() successful!\n");
        _ftprintf(fp, L"GetUserProfileDirectory() SUCCESS with error code: %d\n", ::GetLastError());
    }

    if(!::CreateEnvironmentBlock(&lpvEnv, hToken, TRUE))
    {
        _ftprintf(fp, L"CreateEnvironmentBlock() FAILED with error code: %d\n", ::GetLastError());
        fclose(fp);
        ::CloseHandle(hToken);
        return 0;
    }
    else
    {
        _tprintf_s(L"CreateEnvironmentBlock() successful!\n");
        _ftprintf(fp, L"CreateEnvironmentBlock() SUCCESS with error code: %d\n", ::GetLastError());
    }

    ::ZeroMemory(&si_setup, sizeof(STARTUPINFO));
    si_setup.cb = sizeof(STARTUPINFO);
    si_setup.lpDesktop = L"Winsta0\Default";
    ::ZeroMemory(&pi_setup, sizeof(PROCESS_INFORMATION));

    if(!::CreateProcessAsUser(hToken, L"Setup.exe", NULL, NULL, NULL, NULL, CREATE_DEFAULT_ERROR_MODE | CREATE_UNICODE_ENVIRONMENT, lpvEnv, szUserProfile, &si_setup, &pi_setup))
    {
        _ftprintf(fp, L"CreateProcessAsUser() FAILED with error code: %d\n", ::GetLastError());
        fclose(fp);
        ::CloseHandle(hToken);
        return 0;
    }
    else
    {
        _tprintf_s(L"CreateProcessAsUser() successful!\n");
        _ftprintf(fp, L"CreateProcessAsUser() SUCCESS with error code: %d\n", ::GetLastError());
    }


    if(!DestroyEnvironmentBlock(lpvEnv))
    {
        _ftprintf(fp, L"DestroyEnvironmentBlock() FAILED with error code: %d\n", ::GetLastError());
        fclose(fp);
        ::CloseHandle(hToken);
        return 0;
    }
    else
    {
        _tprintf_s(L"DestroyEnvironmentBlock() successful!\n");
        _ftprintf(fp, L"DestroyEnvironmentBlock() SUCCESS with error code: %d\n", ::GetLastError());
    }

    if(!::UnloadUserProfile(hToken, prInfo.hProfile))
    {
        _ftprintf(fp, L"UnloadUserProfile() FAILED with error code: %d\n", ::GetLastError());
        fclose(fp);
        ::CloseHandle(hToken);
        return 0;
    }
    else
    {
        _tprintf_s(L"UnloadUserProfile() successful!\n");
        _ftprintf(fp, L"UnloadUserProfile() SUCCESS with error code: %d\n", ::GetLastError());
    }

    fclose(fp);

    ::CloseHandle(hToken);
    ::CloseHandle(pi_setup.hProcess);
    ::CloseHandle(pi_setup.hThread);

    return 1;
}


Получаю ошибки:

LogonUser() SUCCESS with error code: 0
LoadUserProfile() SUCCESS with error code: 1008
ImpersonateLoggedOnUser() SUCCESS with error code: 1008
GetUserProfileDirectory() SUCCESS with error code: 0
CreateEnvironmentBlock() SUCCESS with error code: 203
CreateProcessAsUser() FAILED with error code: 5

Возможно, что-то не так в корне делаю. Буду признателен за помощь/советы.
PM MAIL   Вверх
xvr
Дата 10.1.2011, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Читаем в MSDN в CreateProcessAsUser:
Цитата

By default, CreateProcessAsUser creates the new process on a noninteractive window station with a desktop that is not visible and cannot receive user input. To enable user interaction with the new process, you must specify the name of the default interactive window station and desktop, "winsta0\default", in the lpDesktop member of the STARTUPINFO structure. In addition, before calling CreateProcessAsUser, you must change the discretionary access control list (DACL) of both the default interactive window station and the default desktop. The DACLs for the window station and desktop must grant access to the user or the logon session represented by the hToken parameter.
Это сделано?

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0439 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.