Сопоставьте сетевой диск, который будет использоваться службой

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

13 ответов

Решение

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

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

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

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

Используйте это на свой страх и риск. (Я проверил это на 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$.

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

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

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

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

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

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

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

mklink /D C:\myLink \\127.0.0.1\c$

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

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

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

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

Я нахожу очень простой способ: используя команду «New-SmbGlobalMapping» powershell, которая глобально смонтирует диск:

      $User = "usernmae"
$PWord = ConvertTo-SecureString -String "password" -AsPlainText -Force
$creds = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User, $PWord
New-SmbGlobalMapping -RemotePath \\192.168.88.11\shares -Credential $creds -LocalPath S:

ForcePush,

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

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

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

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

Возьмите Windows Server 2012 с NFS Disk, например:

Шаг 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, работающая с привилегией "Локальная система", работает без входа в систему.

Причина, по которой вы можете получить доступ к диску при обычном запуске исполняемого файла из командной строки, заключается в том, что когда вы выполняете его как обычный 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 не поддержат эту функцию.

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

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

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

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

Вам не нужно ни менять пользователя, под которым запускается Служба, из "Системы", либо искать хитрый способ запустить ваше отображение как Система.

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

Я пока не могу комментировать (работаю над репутацией), но создал аккаунт только для того, чтобы отвечать на вопросы @Tech Jerk @spankmaster79 (славное имя lol) и @NMC, о которых они сообщили в ответ на "Я нашел решение, похожее на psexec, но работает без дополнительных инструментов и переживает перезагрузку." пост @Larry сделал.

Решение этой проблемы заключается в том, чтобы просто перейти к этой папке из зарегистрированной учетной записи, то есть:

    \\servername\share  

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

    \\123.456.789.012\share 

это может избежать проблемы в целом.

Если я когда-нибудь получу достаточно очков репутации, я добавлю это как ответ.

Другие вопросы по тегам