2008-10-30 8 views
7

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

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

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

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

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

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

ответ

6

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

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

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

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

+0

Спасибо. Ваше последнее предложение похоже на способ сделать это в моем случае, я создал специальную учетную запись, и я могу запустить свой исполняемый файл с помощью этой учетной записи и CreateProcessAsUser(), тогда он, похоже, сможет получить доступ к сетевому ресурсу (если он находится в группе «Администраторы») ... – 2008-10-31 15:02:05

+0

Очевидно, что вы должны предоставить соответствующему аккаунту соответствующий доступ к ресурсу. – 2008-11-01 16:17:55

4

Если у вас есть служба, работающая под NT AUTHORITY \ LOCALSYSTEM (которая является именем учетной записи службы), она отображается как учетная запись DOMAINNAME \ COMPUTERNAME $ (обратите внимание на $ sign) в остальную часть сети. То есть он отображается как учетная запись COMPUTER в Active Directory. Просто предоставите свой файл и передайте разрешения DOMAINNAME \ COMPUTERNAME $, и вы должны быть хорошими.

0

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

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

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