Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Обход ошибки `STATUS_DLL_INIT_FAILED` при запуске приложения от имени обычного пользователя в Windows: создание новой WindowStation и Desktop

Delphi , ОС и Железо , Windows

Обход ошибки STATUS_DLL_INIT_FAILED при запуске приложения от имени обычного пользователя в Windows

При работе с сервисами Windows, которые запускают приложения от имени обычных пользователей, может возникнуть проблема, связанная с инициализацией динамических библиотек. Это может привести к ошибке STATUS_DLL_INIT_FAILED, если сервис работает от имени пользователя, не являющегося частью группы администраторов. В данном случае, пользователю необходимо создать новую сессию и рабочий стол для запуска приложения.

Шаги для решения проблемы:

  1. Создание новой WindowStation с уникальным именем.
  2. Создание нового Desktop в этой WindowStation.
  3. Запуск процесса с указанием созданного 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Windows ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-07-29 04:26:53/0.0081000328063965/1