Обход ошибки STATUS_DLL_INIT_FAILED при запуске приложения от имени обычного пользователя в Windows
При работе с сервисами Windows, которые запускают приложения от имени обычных пользователей, может возникнуть проблема, связанная с инициализацией динамических библиотек. Это может привести к ошибке STATUS_DLL_INIT_FAILED, если сервис работает от имени пользователя, не являющегося частью группы администраторов. В данном случае, пользователю необходимо создать новую сессию и рабочий стол для запуска приложения.
Шаги для решения проблемы:
Создание новой WindowStation с уникальным именем.
Создание нового Desktop в этой WindowStation.
Запуск процесса с указанием созданного Desktop.
Пример кода на Object Pascal (Delphi):
uses
Winapi.Windows,
System.SysUtils;
var
myWinStat: HWINDOWSTATION;
myDesk: HDDESKTOP;
startupInfo: TStartupInfo;
begin
// Инициализация структур
FillChar(startupInfo, SizeOf(startupInfo), 0);
startupInfo.cbSize := SizeOf(startupInfo);
startupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USEDESKTOP;
startupInfo.wShowWindow := SW_SHOW;
// Создание новой WindowStation
myWinStat := CreateWindowStation('myWinStat', 0, GENERIC_READ or GENERIC_WRITE, nil);
if myWinStat = 0 then
RaiseLastOSError;
try
// Создание нового Desktop в созданной WindowStation
myDesk := CreateDesktop('myDesktop', nil, nil, 0, GENERIC_READ or GENERIC_WRITE, myWinStat);
if myDesk = 0 then
RaiseLastOSError;
try
// Указание нового Desktop для запуска процесса
startupInfo.lpDesktop := 'myDesktop';
try
// Здесь должен быть код для запуска процесса, например, CreateProcessAsUser
// ...
finally
// Ожидание завершения процесса
// ...
end;
finally
// Закрытие десктопа
CloseDesktop(myDesk);
end;
finally
// Закрытие WindowStation
CloseWindowStation(myWinStat);
end;
end;
Объяснение:
Создание новой WindowStation и Desktop позволяет запустить процесс в изолированной сессии, что необходимо для корректной работы приложения, требующего взаимодействия с пользователем, даже если пользователь не залогинен на момент запуска сервиса.
Вывод:
Использование новой WindowStation и Desktop для запуска приложения от имени обычного пользователя позволяет обойти ошибку STATUS_DLL_INIT_FAILED, возникающую при попытке инициализации динамических библиотек в контексте, не соответствующем текущему сеансу пользователя.
Ошибка `STATUS_DLL_INIT_FAILED` при запуске приложения от имени обычного пользователя в Windows требует создания новой сессии и рабочего стола для корректной инициализации динамических библиотек.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.