Подключите сетевой диск для использования службой

213

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

VoidPointer
источник
6
Смотрите ответ ForcePush, его обходной путь работает.
Ubikuity

Ответы:

44

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

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

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

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

MDB
источник
2
Очень информативно ... Правильно ли я считаю, что сценарии входа в систему также запускаются только для интерактивных сеансов входа в систему, а не для сервисных сеансов?
VoidPointer
220

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

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

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

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

ForcePush
источник
3
Я пытался использовать это решение и столкнулся с этой проблемой: подключенный диск выглядит как отключенный для пользователей (даже администраторов). Какие-либо предложения?
Константин Бачу
7
После перезагрузки подключенный диск исчез. Любые идеи? Сопоставление сохраняется, но статус «Недоступен», поэтому он не отображается
Томми
4
Я также вижу сопоставление как недоступное после перезагрузки.
Дейв Паттерсон,
33
Чтобы заставить его работать после перезагрузки, создайте скрипт, содержащий только что, net use z: \\servername\sharedfolderи настройте его для запуска при запуске компьютера, согласно technet.microsoft.com/en-us/library/cc770556.aspx. Он будет работать как учетная запись SYSTEM, поэтому нет необходимости PsExec.
TRS-80
2
Я хочу добавить, что важно, чтобы все использовали это предложение /USER:[remotecomp]\[remoteusername] [password](иногда команда не работает должным образом, когда имени удаленного пользователя не предшествуют имя удаленного компьютера и обратная косая черта. Кроме того, если общий ресурс защищен паролем и отображается для других как отключенный диск, это не доступно для всех. Любой пользователь в этой системе, где SYSTEM монтирует общий ресурс, должен знать пароль для этого общего ресурса. (протестировано на XPx64)
Kitet
65

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

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

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

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

Larry
источник
что начинается первым? служба windows или это запланированное задание? наш сервис умирает при запуске, если путь недоступен. Мы должны были бы восстановить это, если служба запускается последней.
Томас
1
Я пробовал это на 2008 R2, он создает отключенный подключенный диск, и когда я пытаюсь открыть его, он говорит: «z: \ недоступен. Ошибка входа: неизвестное имя пользователя или неверный пароль». Но я смог успешно создать подключенный диск, запустив тот же файл bat вручную. Ny идеи?
Гопи
1
@Thomas не имеет значения, что начинается первым, если задание было выполнено хотя бы один раз из-за/persistent:yes
Edd
4
Почему это должно быть запланированным заданием? Это / настойчиво: да, этого не достаточно, чтобы держать это вокруг?
Скотт Стаффорд
2
@ScottStafford Нет / постоянный: да недостаточно на Win7 и позже. Сопоставление удаляется после перезагрузки независимо от этого переключателя.
Eternal21
44

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

Хэл
источник
Так просто и хорошо работает. Поскольку это часть файловой системы, ссылка доступна для всех учетных записей. Просто убедитесь, что служба работает как учетная запись, которая имеет доступ к сетевому ресурсу (что может не относиться к Системе и т. Д.).
Джереми Франк
1
Это, безусловно, лучший ответ на вопрос, большое спасибо!
Стен Петров
3
К сожалению, если сим-ссылка обращается к
общему
23

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

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

mklink /D C:\myLink \\127.0.0.1\c$
philu
источник
1
Что делать, если после попытки создать каталог из службы вы получите ошибку разрешения?
tyoc213
Вы должны перевести это в автономный режим в чат, а затем сообщить подробности сообщения об ошибке. Вам, вероятно, нужно запускать команды с повышенными правами доступа.
Фил
@ tyoc213 Ты получил ответ?
Лсакурифайсу
9

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

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

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

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

треб
источник
с этой настройкой службы сопоставления, я думаю, что сопоставление дисков, установленное службой сопоставления, не будет доступно в контексте исходной службы, не так ли?
VoidPointer
Я думаю, это <disclaim> следует </ disclaim> - для каждой сессии winlogon существует только одна среда.
Треб
Ваш код работает в сервисе. Я пришел сюда с той же проблемой, что и ОП, но я являюсь автором Службы. Ваш ответ решил мою проблему.
Джо Гайетти
5

ForcePush,

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

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

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

lk7777
источник
4

Найден способ предоставления доступа службы 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 работает с привилегией «Локальная система» и работает без входа в систему.

Val
источник
3

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

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

Kushagra
источник
1

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

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

Torbjörn Gyllebring
источник
служба не работает как "Система". Он настроен для работы под определенной локальной учетной записью. Даже если я войду в систему с этой учетной записью, создаю постоянное сетевое сопоставление, выйду из системы и перезапущу службу, сопоставление не будет доступно для службы.
VoidPointer
1

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

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

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

Джефф
источник
0

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

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

    \\servername\share  

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

    \\123.456.789.012\share 

это может полностью избежать проблемы.

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

CanadaDave
источник