Delphi 2009 аварийно завершает работу при CreateServiceW (только в Windows 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) в… процесс остановлен. try/except вокруг createserviceW не имеет никакого значения.

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


person WilfriedVS    schedule 15.04.2011    source источник
comment
Вы уверены, что ваш дескриптор scm действителен? Пожалуйста, покажите больше кода...   -  person Remko    schedule 17.04.2011
comment
Дескриптор действителен, добавлен дополнительный код   -  person WilfriedVS    schedule 17.04.2011
comment
Я нашел проблему: где-то еще в коде я использовал ADsEnumerateNext без использования ADsFreeEnumerator, это никогда не вызывало никаких проблем, кроме этого конкретного случая (только в win2008R2) (проблема обнаружена случайно)   -  person WilfriedVS    schedule 27.04.2011


Ответы (2)


Ошибка также проявляется на Microsoft SBS Server 2011.

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

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

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

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

person Reallyethical    schedule 16.04.2011
comment
Спасибо, но пробовал с включенным и выключенным UAC, с requireAdministrator uac.manifest и без (проблема та же) - person WilfriedVS; 17.04.2011
comment
@WilfriendVS - Можем ли мы получить еще немного кода, так как я не могу воспроизвести эту проблему после того, как будут приняты во внимание соображения UAC. - person Reallyethical; 18.04.2011

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

person Remko    schedule 17.04.2011
comment
Пробовал встроить файл advapi32.dll из windows 7 - 32 бит и запустить CreateService из этой DLL, ошибка та же. Это может быть связано с функцией безопасности, как предполагает Reallyethical. - person WilfriedVS; 17.04.2011