Сбой Delphi 2009 при CreateServiceW (только в Windows 2008 R2)

#delphi #delphi-2009 #windows-server-2008-r2

#delphi #delphi-2009 #windows-server-2008-r2

Вопрос:

У меня есть следующий код, который отлично работает во всех операционных системах (32 и 64 разрядных), за исключением Windows 2008 R2 (SP0 и SP1)

 fSvcMgr := OpenSCManagerW(PwideChar(FOptions.ComputerName), nil,
      SC_MANAGER_ALL_ACCESS);
    if fSvcMgr = 0 then
    begin
      iserror := true;
      RaiseLastWin32Error;
    end;
...
fSvc := OpenServiceW(fSvcMgr, pwidechar(Service_name),SERVICE_ALL_ACCESS);
if fSvc = 0 then
begin
  fSvc := CreateServiceW(fSvcMgr,
          pwidechar(Service_name),
          pwidechar(Service_name),
          SERVICE_ALL_ACCESS, 
          SERVICE_WIN32_OWN_PROCESS,
          SERVICE_DEMAND_START,
          SERVICE_ERROR_IGNORE,
          pwidechar(fServiceName), nil, nil, nil, nil, nil);
  if fSvc = 0 then
  begin
     iserror := true;
     RaiseLastWin32Error;
  end;
end;
  

Это происходит при подключении к удаленному 32-разрядному компьютеру:

При отладке происходит сбой delphi в строке CreateserviceW с сообщением «Определяемое приложением исключение (код 0x000006d1) при … процесс остановлен. попытка / исключение вокруг createserviceW не имеет никакого значения.

При подключении к удаленной 64-разрядной машине все работает нормально!

Комментарии:

1. Вы уверены, что ваш дескриптор scm действителен? Пожалуйста, покажите больше кода…

2. Дескриптор действителен, добавлен дополнительный код

3. Я обнаружил проблему: где-то еще в коде я использовал «ADsEnumerateNext» без использования «ADsFreeEnumerator», это никогда не вызывало никаких проблем, за исключением этого конкретного случая (только в Win2008R2) (обнаружил проблему случайно)

Ответ №1:

Ошибка также очевидна на Microsoft SBS Server 2011.

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

Пытались ли вы добавить манифест в свое приложение, чтобы убедиться, что оно правильно повышено, кроме того, в целях тестирования вы можете скомпилировать приложение (вызывающее) и запустить с учетными данными администратора.

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

Таким образом, если у вас есть права доступа, попробуйте без.

Комментарии:

1. Спасибо, но я пробовал с включенным и отключенным UAC, с requireAdministrator uac.manifest и без (проблема та же)

2. @WilfriendVS — Можем ли мы получить еще немного кода, пожалуйста, поскольку я не могу воспроизвести эту проблему, как только будут приняты во внимание соображения UAC.

Ответ №2:

Вызов CreateService генерирует RPC-вызов либо RCreateServiceW, либо RCreateServiceWOW64. Вызов RPC возвращает вам 0x000006d1, что означает RPC_S_PROCNUM_OUT_OF_RANGE, и это означает, что базовый уровень RPC завершается с ошибкой (запрошенный opnum не существует). Это может быть ошибка…

Комментарии:

1. Я попытался внедрить advapi32.dll файл из Windows 7 — 32-разрядный и запуск CreateService из этой библиотеки DLL, ошибка та же. Это может быть связано с функцией безопасности, как предполагает Reallyethical.