Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Служба Windows и общие папки


Автор: pushok 24.6.2014, 20:54
Доброго времени суток!

Вопрос следующий:

сделал самую простую службу ОС Windows: 1 стандартная процедура (ServiceController) и стандартная функция (GetServiceController) + 1 процедура (ServiceExecute) с небольшим кодом (ниже листинг)

Код

procedure TInternetControl1.ServiceExecute(Sender: TService);
var f: TextFile;
s,state,fs,SystemPath:string;
i,timer2:integer;
pr:array of string;
begin
While not terminated do
 begin
    SystemPath:='\\MICROSOF-84D575\_files\Soft\CheckInternet\States\';
fs:='1';//ParamStr(0);
AssignFile(f,SystemPath+'5.txt');
    ReWrite(f);
    WriteLn(f,fs);
    WriteLn(f,SystemPath);
    CloseFile(f);

...

    if (state = '0') then
      begin
      for i:=0 to high(pr) do
        WinExec(PANsiChar('TASKKILL /F /IM '+pr[i]), SW_HIDE);
      end;

    timer2:=timer2*1000;
    sleep(timer2);
 ServiceThread.ProcessRequests(False);
 end;
end;


Пояснение:
 - в ... (троеточии) спрятано многое (определение переменных и их использование),
 - каждые 30 (timer2) секунд должны убиваться проекты с названиями из массива pr[]
 - из файлов я считываю и туда записываю параметры (ну например значение таймера и имена процессов)


Вопрос такой:

если в процедуре AssignFile указан путь к локальной папке (например D:\000\) все работает прекрасно, но если указан путь к ПК в локальной сети (как в листинге например), то служба не работает (в файл запись не идет и служба останавливается сразу после запуска).

*папка на ПК в локальной сети с общим доступом.

При этом пробовал на обычном приложении - там и читается и записывается в файлы на ПК в локальной сети прекрасно.

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

Подскажите, что я упустил.
Почему так происходит?
Как добиться желаемого?

Заранее благодарен за предоставленную информацию.

Автор: Akella 25.6.2014, 07:15
Цитата(pushok @  24.6.2014,  20:54 Найти цитируемый пост)
если в процедуре AssignFile указан путь к локальной папке (например D:\000\) все работает прекрасно, но если указан путь к ПК в локальной сети (как в листинге например), то служба не работает (в файл запись не идет и служба останавливается сразу после запуска).

смотри журнал винды
поставь try-except
Используй getlasterror

неужели не знаешь, как выявить ошибку?

Автор: drkot 25.6.2014, 07:34
Цитата(Akella @  25.6.2014,  07:15 Найти цитируемый пост)
как выявить ошибку?
 ошибки там нет...
есть не понимание работы винды служб и шар...

pushok, как Вы думаете под каким пользователем служба пытается получить доступ к указанной "папке"?
Когда найдете ответ (например в логах безопасности MICROSOF-84D575) подумайте о том какие права данный пользователь имеет на MICROSOF-84D575.

Но выход очень простой... создаете "специального пользователя" настраиваете права и запускаете службу от имени этого пользователя. Это к стати стандартный механизм и им пользуется в том числе и MS. Для запуска службы под нужным пользователем достаточно указать данные авторизации при ее установке.

Автор: pushok 25.6.2014, 22:40
Большое спасибо за подсказки, все дело и правда в пользователях, а журнал помог отладить работу службы, теперь буду учится делать записи в журнал своими руками.

Еще раз спасибо  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)