Сейчас на форуме: UniSoft, bartolomeo (+6 невидимых)

 eXeL@B —› Программирование —› Проблема с семафором в сервисе под Windows 7
Посл.ответ Сообщение


Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 20 января 2011 17:28
· Личное сообщение · #1

Использую сервис в интерактивном режиме с установкой семафора. Под XP всё работало исключительно, на Windows 7 приложение не видит созданный в сервисе семафор. Для ЕХЕ файл сервиса пытался устанавливать запуск от админа и совместимость с XP. Толку ноль. Вот пример, код создания семафора с установкой SecurityAttributes и SecurityDescriptor одинаков для сервиса и приложения.
В чём моя ошибка?

Code:
  1. Var xx:THandle;
  2.   sa: TSecurityAttributes;
  3.   sd: TSecurityDescriptor;
  4. begin
  5. sa.nLength:= sizeof(sa);
  6. sa.bInheritHandle:= false;
  7. sa.lpSecurityDescriptor:= @sd;
  8.  
  9. if not InitializeSecurityDescriptor(@sd,SECURITY_DESCRIPTOR_REVISION) then
  10.    raise Exception.Create('InitializeSecurityDescriptor'#13#10+SysErrorMessage( GetLastError));
  11.  
  12. if not SetSecurityDescriptorDacl(@sd,True,nil,False) then
  13.    raise Exception.Create('SetSecurityDescriptorDacl'#13#10+SysErrorMessage(Get LastError));
  14.  
  15. xx:=CreateSemaphore(@sa,1,1,'TEST');
  16. if GetLastError=ERROR_ALREADY_EXISTS then Showmessage('PRESENT!') else Showmessage('NOT PRESENT!');
  17. end;




Ранг: 10.0 (новичок), 44thx
Активность: 0.010
Статус: Участник

Создано: 20 января 2011 21:53 · Поправил: A V
· Личное сообщение · #2

AFAIR имя должно начинаться с 'Global\'




Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 20 января 2011 23:56
· Личное сообщение · #3

A V пишет:
AFAIR имя должно начинаться с 'Global'


Чего?



Ранг: 23.5 (новичок), 5thx
Активность: 0.020
Статус: Участник

Создано: 21 января 2011 00:19
· Личное сообщение · #4

в сервисе SetSecurityDescriptorDacl должен правильно указывать на права доступа
здесь - что и как support.microsoft.com/kb/106387



Ранг: 5.3 (гость)
Активность: 0=0
Статус: Участник

Создано: 21 января 2011 15:00
· Личное сообщение · #5

A V прав, "Global\TEST" + права админа для приложения - должно работать.




Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 21 января 2011 16:38 · Поправил: ToBad
· Личное сообщение · #6

japan пишет:
A V прав, "Global\TEST" + права админа для приложения - должно работать.


А, понял, имя...

В общем получается если просто сменить имя в том коде который у меня был - не работает.
Нашёл код который устанавливает права как посоветовал tino, в этом случае + смена имени как посоветовал A V - работает, но вместо ERROR_ALREADY_EXISTS выдаёт ERROR_ACCESS_DENIED в случае если семафор уже создан... Разумеется устанавливал админа...
Вот код установки прав, может там собака порылась?....
Code:
  1. const
  2.   SECURITY_NT_AUTHORITY: TSIDIdentifierAuthority = (Value: (0, 0, 0, 0, 0, 5));
  3.   SECURITY_AUTHENTICATED_USER_RID = 11;
  4.   ACL_REVISION  = 2;
  5.  
  6. type
  7.   ACE_HEADER = record
  8.     AceType,
  9.     AceFlags: BYTE;
  10.     AceSize: WORD;
  11.   end;
  12.  
  13.   PACE_HEADER = ^ACE_HEADER;
  14.  
  15.   ACCESS_ALLOWED_ACE = record
  16.     Header: ACE_HEADER;
  17.     Mask: ACCESS_MASK;
  18.     SidStart: DWORD;
  19.   end;
  20.  
  21. function BuildRestrictedSD(pSD: PSECURITY_DESCRIPTOR): Pointer;
  22. var
  23.   dwAclLength: DWORD;
  24.   pAuthenticatedUsersSID: PSID;
  25.   pDACL: PACL;
  26.   bResult: BOOL;
  27.   siaNT: SID_IDENTIFIER_AUTHORITY;
  28. begin
  29.   pAuthenticatedUsersSID:= nil;
  30.   pDACL:= nil;
  31.   bResult:= FALSE;
  32.   siaNT:= SECURITY_NT_AUTHORITY;
  33.   if InitializeSecurityDescriptor(pSD,SECURITY_DESCRIPTOR_REVISION) then
  34.     if AllocateAndInitializeSid(siaNT, 1, SECURITY_AUTHENTICATED_USER_RID,
  35.       0, 0, 0, 0, 0, 0, 0,pAuthenticatedUsersSID) then
  36.     begin
  37.       dwAclLength:= Sizeof(ACL)
  38.             + Sizeof(ACCESS_ALLOWED_ACE) - Sizeof(DWORD)
  39.             + GetLengthSid(pAuthenticatedUsersSID);
  40.       GetMem(pDACL,dwAclLength);
  41.       if InitializeAcl(pDACL^, dwAclLength, ACL_REVISION) then
  42.         if AddAccessAllowedAce(pDACL^, ACL_REVISION,
  43.           GENERIC_READ or GENERIC_WRITE or GENERIC_EXECUTE,
  44.           pAuthenticatedUsersSID) then
  45.           if SetSecurityDescriptorDacl(pSD, TRUE, pDACL, FALSE) then
  46.             bResult:= TRUE;
  47.       if pAuthenticatedUsersSID <> nil then
  48.         FreeSid(pAuthenticatedUsersSID);
  49.       if not bResult then
  50.         if pDACL <> nil then
  51.         begin
  52.           FreeMem(pDACL);
  53.           pDACL:= nil;
  54.         end;
  55.     end;
  56.   Result:= pDACL;
  57. end;
  58.  
  59. procedure TForm53.Button1Click(Sender: TObject);
  60. var
  61.   sa: SECURITY_ATTRIBUTES;
  62.   sd: SECURITY_DESCRIPTOR;
  63.   ptr: Pointer;
  64. begin
  65. ptr:= BuildRestrictedSD(@sd);
  66.   if ptr <> nil then
  67.   try
  68.     sa.nLength:= Sizeof(sa);
  69.     sa.lpSecurityDescriptor:= @sd;
  70.     sa.bInheritHandle:= FALSE;
  71.     CreateSemaphore(@sa,1,1,'Global\TEST');
  72.     if GetLastError=ERROR_ALREADY_EXISTS then Showmessage('PRESENT!') else Showmessage('NOT PRESENT! '+inttostr(GetLastError));
  73.   finally
  74.     FreeMem(ptr);
  75.   end;
  76. end;


p.s. Права одинаково устанавливаю и в сервисе и в приложении.



Ранг: 23.5 (новичок), 5thx
Активность: 0.020
Статус: Участник

Создано: 21 января 2011 23:29
· Личное сообщение · #7

сервис работает под учетной записью "System Account", а приложение под учетной записью юзера или админа. соответственно нужны правильные права доступа.

support.microsoft.com/kb/193073


 eXeL@B —› Программирование —› Проблема с семафором в сервисе под Windows 7
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати