Delphi 2009 падает на CreateServiceW (только в Windows 2008 R2) - PullRequest
4 голосов
/ 15 апреля 2011

У меня есть следующий код, который отлично работает во всех операционных системах (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-битной машине все работает отлично!

Ответы [ 2 ]

0 голосов
/ 17 апреля 2011

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

0 голосов
/ 16 апреля 2011

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

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

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

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

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

...