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

 eXeL@B —› Программирование —› Доступ к объектам синхронизации, созданным в контексте сервиса с системной учёткой
Посл.ответ Сообщение


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

Создано: 10 августа 2017 10:04 · Поправил: DenCoder
· Личное сообщение · #1

Всем доброго времени суток, уважаемые форумчане!

Писал писал, старался объяснить все аспекты, был залогинен... Жму кнопку <Создать тему> и бац - "У вас нет прав..." и меня разлогинивает. Поматюкался немного, но кому это адресовать - не знаю... Обычно привычка копировать в буфер написанное, знаю приколы этого форума. Но здесь почему-то подумалось, что этого не понадобится. И теперь приходится ещё раз писать. Второй раз напишу покороче.

2 программы: одна - сервис, другая - обычное приложение. Кода создания эвента в сервисе:
Code:
  1.          SECURITY_ATTRIBUTES sa;
  2.          sa.bInheritHandle = FALSE;
  3.          sa.nLength = sizeof(SECURITY_ATTRIBUTES);
  4.          char* szSD = "D:(A;NP;GA;;;BA)";
  5.          bRes = ConvertStringSecurityDescriptorToSecurityDescriptor(szSD, SDDL_REVISION_1, &sa.lpSecurityDescriptor, NULL);
  6.          if(!bRes)
  7.          {
  8.                  LogError(15, GetLastError());
  9.                  return 15;
  10.          }
  11.  
  12.          HANDLE hEvt = CreateEvent(&sa, FALSE, FALSE, "SomeEvent");
  13.          if(hEvt == NULL)
  14.          {
  15.                  LogError(12, GetLastError());
  16.                  LocalFree(sa.lpSecurityDescriptor);
  17.                  return 12;
  18.          }
  19.  
  20.          LocalFree(sa.lpSecurityDescriptor);
  21.  
  22.          DWORD dwRes = GetLastError();
  23.          if(dwRes == ERROR_ALREADY_EXISTS)
  24.          {
  25.                  Log("Event already exists\r\n");
  26.                  CloseHandle(hEvt);
  27.                  return 0;
  28.          }
  29.  
  30.          DWORD dwObj = WaitForSingleObject(hEvt, INFINITE);
  31.          if(dwObj != WAIT_OBJECT_0)
  32.          {
  33.                  LogError(13, GetLastError());
  34.                  CloseHandle(hEvt);
  35.                  return 13;
  36.          }


По логам вижу, что здесь всё ок и в Process Explorer администраторам полный доступ к объекту.

Код открытия эвента в приложении:
Code:
  1.                  HANDLE hEvt = CreateEvent(NULL, FALSE, FALSE, "SomeEvent");
  2.                  if(hEvt == NULL)
  3.                  {
  4.                         LogError(14, GetLastError());
  5.                         return 14;
  6.                  }
  7.  
  8.                  DWORD dwRes = GetLastError();
  9.                  if(dwRes == ERROR_ALREADY_EXISTS)
  10.                  {
  11.                         Log("Event already exists\r\n");
  12.                         SetEvent(hEvt);
  13.                         CloseHandle(hEvt);
  14.                         return 0;
  15.                  }
  16.                  else
  17.                  {
  18.                         CloseHandle(hEvt);
  19.                         Log("Event is not found\r\n");
  20.                         return 15;
  21.                  }

По логам вижу, что объект создаётся заново, а не открывается созданный в сервисе.

Почему эвент не виден? Непонятно, что я упустил и чего не учёл. В MSDN написано об этом так:
If an event is created from a service or a thread that is impersonating a different user, you can either apply a security descriptor to the event when you create it, or change the default security descriptor for the creating process by changing its default DACL.
Что было и сделано. Что же у меня не так?

-----
IZ.RU




Ранг: 158.4 (ветеран), 123thx
Активность: 0.140.49
Статус: Участник

Создано: 10 августа 2017 10:27 · Поправил: rmn
· Личное сообщение · #2

"Global\SomeEvent"

| Сообщение посчитали полезным: DenCoder, BlackCode


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

Создано: 10 августа 2017 10:43
· Личное сообщение · #3

Благодарю за оперативность!

Попробовал "Global\SomeEvent" и сдвиги появились - теперь объект виден, но недоступен - ERROR_ACCESS_DENIED.

Добавлено спустя 5 минут
Всё, разобрался - с правами администратора заработало. Тему пока не закрываю, может ещё возникнут вопросы...

-----
IZ.RU





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

Создано: 10 августа 2017 18:40
· Личное сообщение · #4

DenCoder

Ты наверное совсем тупой, раз не знаешь как обьекты именуются. И какая оперативность, на мсдн чётко написано:

The name can have a "Global" or "Local" prefix to explicitly create the object in the global or session namespace. The remainder of the name can contain any character..

Какая оперативность, гугл это находит куда быстрее чем ты написал вопрос. Это что то новое

-----
vx




Ранг: 158.4 (ветеран), 123thx
Активность: 0.140.49
Статус: Участник

Создано: 10 августа 2017 19:22
· Личное сообщение · #5

difexacaw
Не тебя поблагодарили, вот ты и бесишься




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

Создано: 10 августа 2017 19:53
· Личное сообщение · #6

rmn

Что мне делать с вашей благодарностью

тс просто обнаглел и даже не удосужился глянуть описание на сайте производителя.

-----
vx





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

Создано: 10 августа 2017 20:44
· Личное сообщение · #7

difexacaw
Свободен!

-----
IZ.RU



 eXeL@B —› Программирование —› Доступ к объектам синхронизации, созданным в контексте сервиса с системной учёткой
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати