CreateProcessWithLogonW: невозможно запустить процесс

Привет, я совершенно новичок в программировании. И, пожалуйста, кто-нибудь, помогите мне.

Я пытаюсь запустить процесс из службы.
Мне нужно начать новый процесс, предложив пользователю ввести учетные данные администратора.

Я пытался использовать CreateProcessWithLogonW(),

Я использую правильную функцию.
Я попытался ввести имя пользователя, пароль, домен как localhost. Я дал полный путь к файлу .exe, который мне нужно запустить.

Вот кусок кода.

CreateProcessWithLogonW(L"Administrator",
L"localhost",
L"password",
0,
NULL,
L"c:\myupdates\myapp.exe",
NORMAL_PRIORITY_CLASS | CREATE_CONSOLE,
NULL,
NULL,
&si,
&pi);

Si.cb = sizeof(si);
Si.lpDesktop = L"winsta0\\default";

Но процесс так и не начался. Ребята, скажите, что я делаю не так?
И что мне нужно сделать, чтобы предложить пользователю ввести учетные данные администратора вместо жесткого кодирования.

0

Решение

Ни одна из функций CreateProcess * не предложит никаких подсказок. Они низкоуровневые API и ничего не знают о GUI.

Если вы хотите, чтобы пользователю было предложено, используйте ShellExecuteEx с runas команда. Windows сначала запросит разрешение на повышение, а затем запросит учетные данные.

1

Другие решения

Вы также можете корректно экранировать строку программы:

L"c:\myupdates\myapp.exe"

должно быть как минимум:

L"c:\\myupdates\\myapp.exe"

Честно говоря, в этом коде есть множество неправильных вещей, от неправильной настройки SI до параметров, передаваемых самому API. Я предлагаю вам прочитать больше.

1

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

Функция может изменять содержимое этой строки. Следовательно, этот параметр не может быть указателем на постоянную память (такую ​​как переменная const или литеральная строка). Если этот параметр является константной строкой, функция может вызвать нарушение прав доступа.

Вы также должны избежать обратной косой черты. Изменить на:

WCHAR cmdLine[] = L"c:\\myupdates\\myapp.exe"; /* 'cmdLine' is a
copy of the string
literal. */

и передать cmdLine вместо.

После проверки любого сбоя функции WINAPI GetLastError() как он проинформирует вас о причине отказа.

1

Нарушение прав доступа связано с параметром lpCommandLine. Это предназначено для редактируемой памяти, LPWSTR и функция API действительно изменяют буфер. Но вы передаете указатель на неизменяемую память.

Но есть более фундаментальная проблема. Вы говорите, что хотите запросить учетные данные от службы. Службы не должны отображать пользовательский интерфейс, а в современных версиях Windows служба просто не может отображать пользовательский интерфейс. Ваш дизайн имеет недостатки, и вы должны пересмотреть его.

0

Может быть, слишком поздно, чтобы помочь вам. Но это может быть полезно для других, хотя. Если вы используете CreateProcessWithLogonW функция, и вы используете Default рабочий стол просто держать lpDesktop как NULL.

Если lpDesktop это не Null, вы должны ввести sid пользователя (получение с LookupAccountNamean) как ACE в настольных компьютерах и на winstation DACL

Итак, вот шаги, которые вы должны сделать, чтобы добавить ACE для рабочего стола:

  1. получить дескриптор рабочего стола с OpenDesktop, используйте право dwDesiredAccess
  2. получить Security Descriptor с GetSecurityInfo а также DACL_SECURITY_INFORMATIONкак securityinfo
  3. получить DACL от твоего Security Descriptor
  4. добавлять AddAccessAllowedAceс sid sid вашего пользователя
  5. Установить измененный DACL на дескриптор вашего рабочего стола

Теперь повторите эти шаги для winsta0 winstation

Командир г-на Яростного в documantary очень помог мне решить эту проблему.

0
По вопросам рекламы [email protected]