Исполняемый файл, запущенный службой Windows с использованием учетной записи локальной системы, не может получить доступ к общим сетевым ресурсам

StackOverflow https://stackoverflow.com/questions/249928

Вопрос

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

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

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

Однако, когда программное обеспечение пытается подключиться к общему ресурсу Windows (UNC-имя), оно не может подключиться.Принимая во внимание, что если исполняемый файл был запущен вручную, он подключается нормально.

Предложения, которые я обычно видел для решения подобных проблем, похоже, все говорят об использовании учетной записи пользователя, поскольку системная учетная запись не может получить доступ к общим сетевым ресурсам, но в нашем случае это невозможно.Есть ли какой-нибудь другой способ заставить это сработать?

Редактировать:Я забыл упомянуть, что это приложение может (и чаще всего будет) запускаться на Win2K, а не на XP, и я думаю, я прав, говоря, что учетная запись локальной сети недоступна до XP?

Это было полезно?

Решение

Если вы сможете изменить свою службу Windows таким образом, чтобы она запускалась под учетной записью сетевой службы, то ваш исполняемый файл сможет получать доступ к общим сетевым ресурсам (это одна из причин, по которой была создана учетная запись сетевой службы).

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

Редактировать: IIRC, учетная запись сетевой службы была введена в Server 2003 и добавлена в один из пакетов обновления XP.

Если вы не можете полагаться на доступность учетной записи сетевой службы, то вы могли бы рассмотреть возможность создания выделенной учетной записи домена, хранения где-нибудь учетных данных учетной записи, считывания их изнутри вашей службы, затем входа в систему и олицетворения этого пользователя перед доступом к общему сетевому ресурсу.В качестве альтернативы, служба Windows может запускаться непосредственно от имени выделенной учетной записи, и в этом случае для нее потребуется привилегия "вход в систему как служба".

Другие советы

Если у вас есть служба, работающая под управлением NT AUTHORITY\LOCALSYSTEM (это имя учетной записи службы), для остальной сети она отображается как учетная запись DOMAINNAME \COMPUTERNAME$ (обратите внимание на знак $).То есть он отображается как учетная запись КОМПЬЮТЕРА в Active Directory.Просто предоставьте права доступа к своему файлу и общему ресурсу для DOMAINNAME\COMPUTERNAME $, и все будет в порядке.

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

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

Если доступ на запись к папке с exe-файлом не отключен, пользователь может заменить этот exe-файл на (например) cmd.exe.В следующий раз, когда служба попытается запустить ваш exe-файл, вуаля:Командная оболочка с системными правами!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top