Подключите сетевой диск для использования службой - PullRequest
201 голосов
/ 08 октября 2008

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

Ответы [ 12 ]

210 голосов
/ 21 января 2011

Используйте это на свой страх и риск. (Я проверил это на XP и Server 2008 x64 R2)

Для этого взлома вам понадобится SysinternalsSuite от Марка Руссиновича :

Шаг первый: Откройте окно с повышенными привилегиями cmd.exe (запуск от имени администратора)

Шаг второй: Поднимитесь снова, чтобы получить root права, используя PSExec.exe: Перейдите в папку, содержащую SysinternalsSuite, и выполните следующую команду psexec -i -s cmd.exe теперь вы находитесь внутри приглашения nt authority\system, и вы можете доказать это, набрав whoami. -i необходим, потому что сопоставления дисков должны взаимодействовать с пользователем

Шаг третий: Создайте постоянный подключенный диск в качестве учетной записи SYSTEM с помощью следующей команды net use z: \\servername\sharedfolder /persistent:yes

Это так просто!

ПРЕДУПРЕЖДЕНИЕ : Вы можете удалить это сопоставление только таким же способом, каким вы его создали, из учетной записи SYSTEM. Если вам нужно удалить его, выполните шаги 1 и 2, но измените команду на шаге 3 на net use z: /delete.

ПРИМЕЧАНИЕ : Вновь созданный подключенный диск теперь будет отображаться для ВСЕХ пользователей этой системы, но они будут отображаться как «Отключенный сетевой диск (Z :)». Не позволяйте имени обмануть вас. Он может претендовать на отключение, но это будет работать для всех. Вот как вы можете сказать, что этот взлом не поддерживается M $.

57 голосов
/ 23 октября 2011

Я нашел решение, которое похоже на решение с psexec, но работает без дополнительных инструментов и выживает после перезагрузки .

Просто добавьте запланированное задание, вставьте «system» в поле «run as» и укажите задачу на командный файл с помощью простой команды

net use z: \servername\sharedfolder /persistent:yes

Затем выберите «запускать при запуске системы» (или аналогичный, у меня нет английской версии), и все готово.

39 голосов
/ 08 октября 2008

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

Подход вспомогательного процесса может быть довольно простым: просто создайте новый сервис, который сопоставит диск и запустит «реальный» сервис. Единственные вещи, которые не совсем тривиальны по этому поводу:

  • Вспомогательной службе необходимо будет передать все соответствующие команды SCM (запуск / останов и т. Д.) Реальной службе. Если реальный сервис принимает пользовательские команды SCM, не забудьте также передать их (я не ожидаю, что сервис, который считает пути UNC экзотическими, использует такие команды ...)

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

38 голосов
/ 26 октября 2011

Лучшим способом было бы использовать символическую ссылку, используя mklink.exe. Вы можете просто создать ссылку в файловой системе, которую может использовать любое приложение. Смотри http://en.wikipedia.org/wiki/NTFS_symbolic_link.

18 голосов
/ 03 июня 2016

Здесь есть хороший ответ: https://superuser.com/a/651015/299678

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

mklink /D C:\myLink \\127.0.0.1\c$
9 голосов
/ 08 октября 2008

Вы можете использовать команду net use:

var p = System.Diagnostics.Process.Start("net.exe", "use K: \\\\Server\\path");
var isCompleted = p.WaitForExit(5000);

Если это не работает в службе, попробуйте Winapi и PInvoke WNetAddConnection2

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

5 голосов
/ 22 января 2014

ForcePush,

ПРИМЕЧАНИЕ : Недавно созданный подключенный диск будет отображаться для ВСЕХ пользователей этой системы, но они будут отображаться как «Отключенный сетевой диск (Z :)». Не позволяйте имени обмануть вас. Он может претендовать на отключение, но это будет работать для всех. Вот как вы можете сказать, что этот взлом не поддерживается M $ ...

Все зависит от разрешений общего ресурса. Если у вас есть права доступа Все в общем ресурсе, этот подключенный диск будет доступен другим пользователям. Но если у вас есть только какой-то конкретный пользователь, чьи учетные данные вы использовали в своем пакетном сценарии и этот пакетный сценарий был добавлен в сценарии запуска, доступ к этой общей папке будет иметь только системная учетная запись, даже не администратор. Поэтому, если вы используете, например, запланированное задание ntbackuo, системная учетная запись должна использоваться в «Запуск от имени». Если ваша служба «Войти как: локальная системная учетная запись», она должна работать.

Что я сделал , я не отображал букву диска в своем скрипте запуска, просто использовал net use \\\server\share ... и использовал путь UNC в моих запланированных заданиях. Добавлен сценарий входа в систему (или просто добавление пакетного файла в папку автозагрузки) с отображением в тот же общий ресурс с некоторой буквой диска: net use Z: \\\... с теми же учетными данными. Теперь зарегистрированный пользователь может увидеть и получить доступ к этому подключенному диску. Есть 2 подключения к одному ресурсу. В этом случае пользователь не видит этот раздражающий «Отключенный сетевой диск ...». Но если вам действительно нужен доступ к этому общему ресурсу с помощью буквы диска, а не только UNC, сопоставьте этот общий ресурс с различными буквами диска, например, Y для System и Z для пользователей.

4 голосов
/ 20 января 2016

Найден способ предоставления доступа службы Windows к сетевому диску.

Например, Windows Server 2012 с диском NFS:

Шаг 1. Запишите пакетный файл для монтирования.

Написать командный файл, например: C: \ mount_nfs.bat

echo %time% >> c:\mount_nfs_log.txt
net use Z: \\{your ip}\{netdisk folder}\ >> C:\mount_nfs_log.txt 2>&1

Шаг 2. Смонтируйте диск как NT AUTHORITY / SYSTEM.

Откройте «Планировщик заданий», создайте новое задание:

  1. Запустить как «СИСТЕМА», в «Запуск системы».
  2. Создать действие: запустить «C: \ mount_nfs.bat».

После этих двух простых шагов моя служба Windows ActiveMQ, работающая с привилегией «Локальная система», будет работать без регистрации

3 голосов
/ 29 сентября 2010

Причина, по которой вы можете получить доступ к диску при обычном запуске исполняемого файла из командной строки, заключается в том, что когда вы выполняете его как обычный exe-файл, вы запускаете это приложение в учетной записи пользователя, с которой вы вошли в систему. И этот пользователь имеет права доступа к сети. Но когда вы устанавливаете исполняемый файл как службу, по умолчанию, если вы видите в задаче управление, он запускается под учетной записью «SYSTEM». Возможно, вы знаете, что «СИСТЕМА» не имеет прав доступа к сетевым ресурсам.

Может быть два решения этой проблемы.

  1. Чтобы преобразовать накопитель в постоянное состояние, указанное выше.

  2. Существует еще один подход, которому можно следовать. Если вы откроете диспетчер сервисов, введя «services.msc», вы можете перейти к своему сервису, а в свойствах вашего сервиса есть вкладка входа в систему, где вы можете указать учетную запись как любую другую учетную запись, отличную от «Системной», вы можете либо Запустите службу из своей учетной записи, зарегистрированной в системе, или через «Сетевую службу». Когда вы сделаете это .. служба может получить доступ к любому сетевому компоненту и диску, даже если они не являются постоянными. Чтобы достичь этого программно, вы можете посмотреть в функцию «CreateService» на http://msdn.microsoft.com/en-us/library/ms682450(v=vs.85).aspx и может установить для параметра «lpServiceStartName» значение «NT AUTHORITY \ NetworkService». Это запустит ваш сервис под учетной записью «Сетевой сервис», и тогда вы закончите.

  3. Вы также можете попробовать сделать службу интерактивной, указав SERVICE_INTERACTIVE_PROCESS в флаге параметра servicetype вашей функции CreateService (), но это будет ограничено только до XP, поскольку Vista и 7 не поддерживают эту функцию.

Надеюсь, что решения помогут вам .. Дайте мне знать, если это сработало для вас.

1 голос
/ 26 января 2018

Вместо того, чтобы полагаться на постоянный диск, вы можете настроить скрипт для отображения / отмены отображения диска при каждом его использовании:

net use Q: \\share.domain.com\share 
forfiles /p Q:\myfolder /s /m *.txt /d -0 /c "cmd /c del @path"
net use Q: /delete

Это работает для меня.

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