HELP!!! Службы и доступ
От: Vitali861  
Дата: 25.02.05 15:36
Оценка:
Други мои посоветуйте как быть, наверняка с такой проблемой ктото уже сталкивался!

Пишу службу для win2k которая болжна обращаться к базе через ODBC
Обертка службы вроде работает, прога читающая базу работает как из ружъя.
Все вместе не работает, более того если пишу службу не как обертку а как средство запуска внешней програмы тоже не работает.
Все предполажения склоняются к нарушениям в правах доступа.

Причем служба маломальски работает только под правами SYSTEM (пишет в файл но не читает ODBC)
Под правами LocalSystem запускается но невыполняет даже простейшую запись в файл
Под Администратором не запускается вообще хотя локальная политика позволяет запуск служб под админом.
Возможно также что служба написана неправильно (однако в соответствии со статьей "Программирование служб: подробности" Автор: Сергей Холодилов The RSDN Group)
Вот код ServiceMain возможно в нем что не так???


void WINAPI ServiceMain (DWORD argc, LPTSTR argv[])
{
hSStat = RegisterServiceCtrlHandler( ServiceName, ServerCtrlHandler);

SetServiceStatus (hSStat, &hServStatus);

hServStatus.dwCheckPoint = 0;
hServStatus.dwWaitHint = 0;
hServStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP
| SERVICE_ACCEPT_SHUTDOWN
| SERVICE_ACCEPT_PAUSE_CONTINUE;
hServStatus.dwServiceType = SERVICE_WIN32_SHARE_PROCESS;
hServStatus.dwWin32ExitCode = NOERROR;
hServStatus.dwServiceSpecificExitCode = 0;

BeginSendPending(SERVICE_START_PENDING);

EndSendPending();

hServStatus.dwCurrentState = SERVICE_RUNNING;

SetServiceStatus(hSStat, &hServStatus);

// Тут я создаю дубликат потока в котором пытаюсь читать,писать
DuplicateHandle(
GetCurrentProcess(),
GetCurrentThread(),
GetCurrentProcess(),
&hServThread,
SYNCHRONIZE,
FALSE,
0);
// Полезный код:
//------------------------------------------>
// первый вариант запуска внешней проги
STARTUPINFO si;
PROCESS_INFORMATION pi;

GetStartupInfo(&si);
if(!CreateProcess(
NULL,
"c:\\db.exe",
NULL,
NULL,
FALSE,
CREATE_NEW_CONSOLE,
NULL,
NULL,
&si,
&pi))
{
MessageBox(NULL,"Error", NULL, 1);
}

// второй вариант
ShellExecute(NULL, NULL,"c:\\db.exe", NULL, NULL, SW_HIDE);
//------------------------------------------<

// закрываю поток
CloseHandle(hServThread);
}
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.