5

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

Войдя в систему как администратор, я могу вручную скопировать файлы из сети в определенную папку в разделе « Program Files , но существует служба с исключением PermissionDenied, чтобы ЗАПИСАТЬ файл. Я также уверен, что файлы не блокируются до записи.

Ошибка заключается в следующем:

Доступ к тропе ".../SomeAssembly.dll "отказано.

Почему служба выдает такую ошибку и как я могу ее исправить? (Я также разработал сервис, поэтому изменения в сборке могут быть на столе).


Обновить

Я также попытался запустить его в System но он не может читать файлы в сети (не знаю, почему). У учетных записей LocalService и NetworkService AFAIK недостаточно прав для внесения изменений в ProgramFiles ... не так ли?


Обновление 2

Причина, по которой я не могу использовать System заключается в том, что эта учетная запись не имеет доступа к сетевым ресурсам по своей конструкции, то же самое происходит с NETWORK SERVICE которая не имеет доступа к локальным ресурсам. Проблема с учетной записью администратора заключается в том, что Windows блокирует операцию копирования файла, когда она выполняется службой.

Есть идеи????

3 ответа3

1

Ну, во-первых, я проверю, помечены ли какие-либо файлы как «Только для чтения», так как я видел, что этот атрибут иногда заменяет разрешения NTFS. Я видел случаи, когда вы можете скопировать файл в графическом интерфейсе, после нажатия «Да» на «Вы уверены? msgstr "приглашение, но любые попытки использовать программу для записи данных в нее сразу же проваливаются, подсказка не выдается.

Также я бы позаботился о том, чтобы служба и связанные с ней службы действительно работали под той учетной записью, о которой вы думаете. Я видел несколько случаев, когда служба A будет вызывать службу B для выполнения некоторой задачи, а затем передавать результаты обратно в службу A, чтобы завершить задачу. И если только Служба An использует учетную запись с надлежащими разрешениями, то попытка не удастся (поскольку, хотя An вызывает B, она не заставляет ее работать так, как использует тот же пользователь An, поэтому, если B не настроен на используйте правильного пользователя, он будет использовать пользователя по умолчанию, который может не иметь доступа к нужному месту)

Также, если возможно, убедитесь, что путь, который он использует в качестве пути, например c:\program files\SomeAssembly.dll\somefile.txt или что-то вроде C:/users/don/app/SomeAssembly.dll также может выдавать ошибки.

0

В конце я сделал, чтобы приложение скопировало файлы с удаленного ресурса в папку с низким ограничением (« Application Data если я правильно помню), а затем вызвало службу, работающую в System , чтобы скопировать их в Program Files .

Преимущество этого подхода заключается в том, что ему не нужны права администратора для копирования файлов по сети на локальный диск (если, конечно, у вас есть права на read сетевых файлов), а затем он также использует преимущества низкие ограничения, налагаемые на System для записи в Program Files.

-1

В зависимости от того, что работает другой компьютер, службы обычно работают под учетной записью сетевых служб или учетной записью локальных систем.

Я бы попробовал это первым.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .