#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.