Привет, я совершенно новичок в программировании. И, пожалуйста, кто-нибудь, помогите мне.
Я пытаюсь запустить процесс из службы.
Мне нужно начать новый процесс, предложив пользователю ввести учетные данные администратора.
Я пытался использовать 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";
Но процесс так и не начался. Ребята, скажите, что я делаю не так?
И что мне нужно сделать, чтобы предложить пользователю ввести учетные данные администратора вместо жесткого кодирования.
Ни одна из функций CreateProcess * не предложит никаких подсказок. Они низкоуровневые API и ничего не знают о GUI.
Если вы хотите, чтобы пользователю было предложено, используйте ShellExecuteEx
с runas
команда. Windows сначала запросит разрешение на повышение, а затем запросит учетные данные.
Вы также можете корректно экранировать строку программы:
L"c:\myupdates\myapp.exe"
должно быть как минимум:
L"c:\\myupdates\\myapp.exe"
Честно говоря, в этом коде есть множество неправильных вещей, от неправильной настройки SI до параметров, передаваемых самому API. Я предлагаю вам прочитать больше.
Одной из проблем является передача строкового литерала в качестве аргумента командной строки, так как этот аргумент должен быть изменяемым. От CreateProcessWithLogon()
по отношению к аргументу командной строки:
Функция может изменять содержимое этой строки. Следовательно, этот параметр не может быть указателем на постоянную память (такую как переменная const или литеральная строка). Если этот параметр является константной строкой, функция может вызвать нарушение прав доступа.
Вы также должны избежать обратной косой черты. Изменить на:
WCHAR cmdLine[] = L"c:\\myupdates\\myapp.exe"; /* 'cmdLine' is a
copy of the string
literal. */
и передать cmdLine
вместо.
После проверки любого сбоя функции WINAPI GetLastError()
как он проинформирует вас о причине отказа.
Нарушение прав доступа связано с параметром lpCommandLine. Это предназначено для редактируемой памяти, LPWSTR и функция API действительно изменяют буфер. Но вы передаете указатель на неизменяемую память.
Но есть более фундаментальная проблема. Вы говорите, что хотите запросить учетные данные от службы. Службы не должны отображать пользовательский интерфейс, а в современных версиях Windows служба просто не может отображать пользовательский интерфейс. Ваш дизайн имеет недостатки, и вы должны пересмотреть его.
Может быть, слишком поздно, чтобы помочь вам. Но это может быть полезно для других, хотя. Если вы используете CreateProcessWithLogonW
функция, и вы используете Default
рабочий стол просто держать lpDesktop
как NULL.
Если lpDesktop
это не Null, вы должны ввести sid пользователя (получение с LookupAccountNamean
) как ACE
в настольных компьютерах и на winstation DACL
Итак, вот шаги, которые вы должны сделать, чтобы добавить ACE
для рабочего стола:
OpenDesktop
, используйте право dwDesiredAccessSecurity Descriptor
с GetSecurityInfo
а также DACL_SECURITY_INFORMATION
как securityinfoDACL
от твоего Security Descriptor
AddAccessAllowedAce
с sid sid вашего пользователяDACL
на дескриптор вашего рабочего столаТеперь повторите эти шаги для winsta0
winstation
Командир г-на Яростного в documantary очень помог мне решить эту проблему.