Добрый день!
Есть служба, выполняющая следующий код:
void InformWatchdog(char* s)
{
HANDLE alive; // inform watchdog about my state
alive=OpenEvent(EVENT_MODIFY_STATE,FALSE,s);
SetEvent(alive);
CloseHandle(alive);
}
И есть программа-сторож, который делает
ResetEvent()
Если и сторож и служба запущены как службы, то все в порядке
Если и сторож и "служба" запущены как приложения, то все в порядке
Если сторож запущен как приложение, то в Windows 7 и 2008 Server служба не может сделать OpenEvent (GetLastError()=ERROR_FILE_NOT_FOUND)
В Win2000,2003,XP все работает нормально
Не подскажете:
— почему так ?
— как бороться ?
Заранее благодарен
Здравствуйте, kovbas, Вы писали:
K>Добрый день!
K>Есть служба, выполняющая следующий код:
K>K>void InformWatchdog(char* s)
K>{
K> HANDLE alive; // inform watchdog about my state
K> alive=OpenEvent(EVENT_MODIFY_STATE,FALSE,s);
K> SetEvent(alive);
K> CloseHandle(alive);
K>}
K>
K>И есть программа-сторож, который делает
K>K>ResetEvent()
K>
K>Если и сторож и служба запущены как службы, то все в порядке
K>Если и сторож и "служба" запущены как приложения, то все в порядке
K>Если сторож запущен как приложение, то в Windows 7 и 2008 Server служба не может сделать OpenEvent (GetLastError()=ERROR_FILE_NOT_FOUND)
K>В Win2000,2003,XP все работает нормально
K>Не подскажете:
K>- почему так ?
K>- как бороться ?
K>Заранее благодарен
Потому что служба и приложение в Windows запускаются с разными учетными записями.
Соответственно, объекты, которые ими создаются, имеют разных владельцев и разные
права доступа. Кроме того, начиная с Windows Vista, службы запускаются в нулевой сессии, а
обычные пользовательские приложения — в других, и далеко не все объекты можно
передавать между этими сессиями. Например, имена глобальных объектов для этого должны,
как минимум, префиксироваться токеном "Global\".
Ищите информацию о безопасности объектов в Win32.