![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| ng_softman |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 9.5.2003 Репутация: нет Всего: нет |
Как, зная имя и пароль другого пользователя, запустить процесс, чтобы тот имел все
привелегии данного пользователя, или хотябы как получить токен контекста безопасности и/или ACE (Access Control Entry). функции - LoginUser & CreateProcesssAsUser - CreateProcessWithLogonW выдают ошибку: "A required privilege is not held by the client." |
|||
|
||||
| man2002ua |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 943 Регистрация: 12.11.2002 Где: Киев Репутация: нет Всего: 2 |
для выполнения этих ф-й надо иметь привилегию SE_TCB_NAME. Проверь установлена ли она для пользователя, к-й вызывает LogonUser и если нет - установи.
-------------------- "Нет ничего более постоянного, чем временное" |
|||
|
||||
| ng_softman |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 9.5.2003 Репутация: нет Всего: нет |
Вот код, который сначала устанавливает SE_TCB_NAME, потом пытается выполнить LogonUser результат один и тот же.
А вот CreateProcessWithLogonW работает на ура, но только под w2k и выше. #ifndef UNICODE #define UNICODE #endif #include "windows.h" #include "stdio.h" #include "ntsecapi.h" int SetPrivilege(HANDLE hToken, LPCTSTR lpszPrivilege, BOOL bEnablePrivilege); int DisplayError(WCHAR* szAPI); /* argv[1] - domain argv[2] - user name argv[3] - password argv[4] - path to executable file */ int wmain(int argc, wchar_t *argv[]) { // all parameters are required // if (argc != 5) { fwprintf(stderr, L"Usage: %s \\\\Domain UserName Password Path\n", argv[0]); return 1; } HANDLE hToken = NULL; PROCESS_INFORMATION pi; STARTUPINFOW si; ZeroMemory(&pi, sizeof(pi)); ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); int lResult = 0; __try { // Retrieve a handle to the process token with the proper access. if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES | TOKEN_ADJUST_DEFAULT | TOKEN_ASSIGN_PRIMARY, &hToken)) { lResult = DisplayError(L"OpenProcessToken"); __leave; } if (!SetPrivilege(hToken, SE_TCB_NAME, TRUE)) { lResult = DisplayError(L"SetPrivilege"); __leave; } // Try to logon as other user CloseHandle(hToken); // Close the opened handle hToken = NULL; if (!LogonUserW( argv[2], // username argv[1], // domain argv[3], // password LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &hToken)) { lResult = DisplayError(L"LogonUser"); __leave; } if (!CreateProcessAsUserW( hToken, NULL, argv[4], NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi)) { lResult = DisplayError(L"CreateProcessAsUser"); __leave; } } __finally { // Close the opened handles. if (hToken) CloseHandle(hToken); if (pi.hProcess) CloseHandle(pi.hProcess); if (pi.hThread) CloseHandle(pi.hThread); } return lResult; } BOOL SetPrivilege( HANDLE hToken, // access token handle LPCTSTR lpszPrivilege, // name of privilege to enable/disable BOOL bEnablePrivilege // to enable or disable privilege ) { TOKEN_PRIVILEGES tp; ZeroMemory(&tp, sizeof(tp)); if (bEnablePrivilege) tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; else tp.Privileges[0].Attributes = 0; // Look up the LUID for privilege. if (!LookupPrivilegeValue(NULL, lpszPrivilege, &tp.Privileges[0].Luid)) { return FALSE; } // Enable privilege in the process token. tp.PrivilegeCount = 1; tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; if (!AdjustTokenPrivileges(hToken, FALSE, &tp, 0, NULL, 0)) { return FALSE; } return TRUE; } int DisplayError(WCHAR* szAPI) { LPWSTR szErrorMsg; DWORD dwErrorCode = GetLastError(); // Format the error message. FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, dwErrorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPWSTR) &szErrorMsg, 0, NULL); // Display the error message. wprintf(L"%s failed:\n\t%s\n", szAPI, szErrorMsg); // Free the buffer. LocalFree( szErrorMsg ); return dwErrorCode; } |
|||
|
||||
| man2002ua |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 943 Регистрация: 12.11.2002 Где: Киев Репутация: нет Всего: 2 |
значится так. Насколько мне известно, привилегии SE_TCB_NAME и т.п. либо есть, либо нет и добавить их нельзя, можно только разрешить. Раз добавить нельзя смотрим у кого они есть. О! У системных процессов они есть - замечательно! Значит, чтобы выполнить процедуры LogonUser и CreateProcessAsUser нам надо воспользоваться одним из кучи системных процессов - например spoolsv.exe - никто, кроме принтера, на это не обидится, а если мы будем работать аккуратно, то он даже не заметит
Собственно и все - достаточно написать DLL, В к-й выполняются LogonUser и CreateProcessAsUser и внедрить ее в spoolsv.exe. Должно работать даже для NT. Удачи - у меня пример заработал -------------------- "Нет ничего более постоянного, чем временное" |
|||
|
||||
| Doc_d0s |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 206 Регистрация: 15.12.2004 Где: в кресле Репутация: 2 Всего: 3 |
тем не менее у меня на XP sp2 не работает( --------------------
Админ- это вождь Apache'й :) |
|||
|
||||
| NextAlex |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 10.8.2005 Где: Украина, г. Одесс а Репутация: 2 Всего: 3 |
завтра выложу рабочий
Добавлено @ 20:02 код в аттаче кстати для того чтобы всё работало в системе должна быть запущена служба "Вторичный вход в систему". Присоединённый файл ( Кол-во скачиваний: 9 )
runAs.zip 33,61 Kb--------------------
Говорила мама: "Учись играть на скрипке". Не хотел носить ноты - будешь носить пианино ... |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |