Drakesal Ответов: 1

Logonuser и вызовы createprocessasuser интерактивные службы


Всем Привет

Я пытаюсь этот сложный путь, я хотел бы запустить процесс из службы с REATEPROCESSASUSER API, с 2 простыми строками у меня есть процесс, загруженный в оперативную память с corrent User, но я ничего не вижу, потому что я понял, что процесс запускается в другом контексте, теперь я пытаюсь с двух недель, но я не могу понять, как это сделать.

Кэм, ты закончишь этот код вместе со мной ?

Заранее спасибо

Джованни

HANDLE		    hUserToken = INVALID_HANDLE_VALUE;
PROCESS_INFORMATION pi;
STARTUPINFO	    si;
BOOL		    bResult = FALSE;
DWORD		    dwCreationFlags = CREATE_NEW_CONSOLE;
LPVOID		    pEnv = NULL;

	ZeroMemory(&pi, sizeof(pi));

	ZeroMemory(&si, sizeof(STARTUPINFO));
	si.cb = sizeof(STARTUPINFO);
	si.lpDesktop = _T("winsta0\\default");

if (!LogonUser(Settings.szUserName, NULL, Settings.szPassword, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &hUserToken))
			goto Cleanup;

bResult = CreateProcessAsUser(hUserToken, NULL, Settings.szCommandLine, NULL, NULL, FALSE, dwCreationFlags, pEnv, NULL, &si, &pi);


Что я уже пробовал:

я пробовал DuplicateTokenEX и SetokenInformation, но всегда терпел неудачу, я не знаю, что делать, на самом деле :(

1 Ответов

Рейтинг:
2

Dave Kreskowiak

Короткий ответ: вы не можете этого сделать из соображений безопасности.

Более длинный ответ Читать это[^].


Drakesal

Я следил за этой статьей, к которой я могу получить доступ как к локальной системе, я читал много раз, но я не нашел решения. это очень трудно завершить мой код?

Dave Kreskowiak

Значит, вы не читали статью. Единственное решение - иметь приложение, которое выполняет фактический запуск приложения, работающего на рабочем столе пользователя. Служба должна была бы поговорить с этим приложением с помощью некоторого метода IPC, такого как именованные каналы, и сказать ему, чтобы он запустил целевое приложение.

СЛУЖБА НЕ МОЖЕТ ЗАПУСТИТЬ ПРИЛОЖЕНИЕ НА РАБОЧЕМ СТОЛЕ ПОЛЬЗОВАТЕЛЯ В КАЧЕСТВЕ ПОЛЬЗОВАТЕЛЯ. У него должно быть какое-то другое промежуточное приложение, чтобы сделать работу за него.

Теперь, что делать, если нет пользователя, вошедшего в систему? Приложение запуска не будет запущено, так что говорить не с кем.

Что делать, если в систему вошло несколько человек? Теперь у тебя проблема. Как вы собираетесь определить, какого пользователя запускать? Как определить канал связи для отправки команды "запуск"?

Эта ваша маленькая схема сложнее, чем просто "как мне сделать то, что не позволяет безопасность".

Drakesal

Хорошо, хорошо, я не объяснил хорошо ситуацию, я написал полное заявление, как Psexec.exe я перечисляю все ПК в сети Я посылаю службу с IPC я использую удаленный канал для связи и я выполняю команды с помощью службы, которая работает как локальная система все сделано, но мне нужна более простая вещь, мне нужно только выполнить процесс с loggoed пользователем только это

Dave Kreskowiak

Вы все еще не объяснили это достаточно подробно.

Я думаю, вы пытаетесь сказать, что хотите удаленно выполнить пользовательское интерактивное приложение на удаленной машине, чтобы удаленный пользователь видел приложение на своем рабочем столе, верно?

Это вообще невозможно. Windows больше не позволяет этому происходить.

Drakesal

вы можете увидеть это сейчас, если вы используете программу Psexec с этим синтаксисом, вы увидите:

psexec \ \ PCNAME-u User-p Password cmd.exe

в удаленном ПК yopu увидит окно cmd, если вы напишете в командной строке: whoami
он вернет пользователя из psexec, а не из текущего журнала, я хочу получить это :)

Dave Kreskowiak

Вам придется спросить Марка, как он это сделал, потому что нет зарегистрированный способ сделать это.

Я также должен задать вопрос, на каком O/S вы запустили интерактивный процесс.