Предположим, что некоторые службы Windows используют код, который требует подключенных сетевых дисков, а не UNC-путей. Как я могу сделать сопоставление дисков доступным для сеанса службы при запуске службы? Вход в систему в качестве пользователя службы и создание постоянного сопоставления не установит сопоставление в контексте фактической службы.
windows
windows-services
unc
system-administration
mapped-drive
VoidPointer
источник
источник
Ответы:
Вам нужно либо изменить службу, либо обернуть ее внутри вспомогательного процесса: кроме проблем с доступом к сеансу / диску, постоянные сопоставления дисков восстанавливаются только при интерактивном входе в систему, который службы обычно не выполняют.
Подход вспомогательного процесса может быть довольно простым: просто создайте новый сервис, который отображает диск и запускает «реальный» сервис. Единственные вещи, которые не совсем тривиальны в этом:
Вспомогательная служба должна будет передать все соответствующие команды SCM (запуск / останов и т. Д.) Реальной службе. Если реальный сервис принимает пользовательские команды SCM, не забудьте также передать их (я не ожидаю, что сервис, который считает пути UNC экзотическими для использования таких команд, хотя ...)
Вещи могут стать немного хитрыми с точки зрения полномочий. Если реальная служба работает под учетной записью обычного пользователя, вы также можете запустить вспомогательную службу под этой учетной записью, и все должно быть в порядке, если учетная запись имеет соответствующий доступ к общему сетевому ресурсу. Если реальный сервис будет работать только при запуске как LOCALSYSTEM или что-то подобное, все становится более интересным, так как он либо вообще не сможет «видеть» сетевой диск, либо требует некоторого манипулирования учетными данными, чтобы заставить его работать.
источник
Используйте это на свой страх и риск. (Я проверил это на 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 $.
источник
net use z: \\servername\sharedfolder
и настройте его для запуска при запуске компьютера, согласно technet.microsoft.com/en-us/library/cc770556.aspx. Он будет работать как учетная запись SYSTEM, поэтому нет необходимости PsExec./USER:[remotecomp]\[remoteusername] [password]
(иногда команда не работает должным образом, когда имени удаленного пользователя не предшествуют имя удаленного компьютера и обратная косая черта. Кроме того, если общий ресурс защищен паролем и отображается для других как отключенный диск, это не доступно для всех. Любой пользователь в этой системе, где SYSTEM монтирует общий ресурс, должен знать пароль для этого общего ресурса. (протестировано на XPx64)Я нашел решение, которое похоже на решение с psexec, но работает без дополнительных инструментов и переживает перезагрузку .
Просто добавьте запланированную задачу, вставьте «system» в поле «run as» и укажите задачу на командный файл с помощью простой команды
Затем выберите «запустить при запуске системы» (или аналогичный, у меня нет английской версии), и все готово.
источник
/persistent:yes
Лучшим способом было бы использовать символическую ссылку, используя mklink.exe. Вы можете просто создать ссылку в файловой системе, которую может использовать любое приложение. Смотрите http://en.wikipedia.org/wiki/NTFS_symbolic_link .
источник
Здесь есть хороший ответ: https://superuser.com/a/651015/299678
Т.е. можно использовать символическую ссылку, например
источник
Вы можете использовать команду «net use»:
Если это не работает в службе, попробуйте Winapi и PInvoke WNetAddConnection2
Изменить: Очевидно, я не понял вас - вы не можете изменить исходный код службы, верно? В этом случае я бы следовал предложению mdb , но с небольшим поворотом: создайте свой собственный сервис (назовем его сервисом отображения), который отображает диск и добавит этот сервис отображения в зависимости для первого (фактического работающего) сервиса. Таким образом, работающая служба не запустится до запуска службы сопоставления (и сопоставления диска).
источник
ForcePush,
НОТА . Недавно созданный подключенный диск будет отображаться для ВСЕХ пользователей этой системы, но они будут видеть его как «Отключенный сетевой диск (Z :)». Не позволяйте имени обмануть вас. Он может претендовать на отключение, но это будет работать для всех. Вот как вы можете сказать, что этот взлом не поддерживается M $ ...
Все зависит от общих прав доступа. Если у вас есть права доступа Все в общем ресурсе, этот подключенный диск будет доступен другим пользователям. Но если у вас есть только какой-то конкретный пользователь, учетные данные которого вы использовали в своем пакетном сценарии и этот пакетный сценарий был добавлен в сценарии запуска, доступ к этой общей папке будет иметь только системная учетная запись, даже не администратор. Поэтому, если вы используете, например, запланированное задание ntbackuo, системная учетная запись должна использоваться в «Запуск от имени». Если ваша служба «Войти как: локальная системная учетная запись», она должна работать.
Что я сделал , я не отображал букву диска в моем скрипте запуска, просто использовал
net use \\\server\share ...
и использовал UNC-путь в моих запланированных заданиях. Добавлен сценарий входа в систему (или просто добавление пакетного файла в папку автозагрузки) с отображением в тот же общий ресурс с некоторой буквой диска:net use Z: \\\...
с теми же учетными данными. Теперь зарегистрированный пользователь может увидеть и получить доступ к этому подключенному диску. Есть 2 подключения к одной и той же папке. В этом случае пользователь не видит этот раздражающий «Отключенный сетевой диск ...». Но если вам действительно нужен доступ к этому общему ресурсу с помощью буквы диска, а не только UNC, сопоставьте этот общий ресурс с различными буквами диска, например Y для System и Z для пользователей.источник
Найден способ предоставления доступа службы Windows к сетевому диску.
Возьмите Windows Server 2012 с NFS Disk, например:
Напишите пакетный файл, например: C: \ mount_nfs.bat
Откройте «Планировщик заданий», создайте новое задание:
После этих двух простых шагов моя служба Windows ActiveMQ работает с привилегией «Локальная система» и работает без входа в систему.
источник
Причина, по которой вы можете получить доступ к диску при обычном запуске исполняемого файла из командной строки, заключается в том, что когда вы выполняете его как обычный exe-файл, вы запускаете это приложение в учетной записи пользователя, с которой вы вошли в систему. И этот пользователь имеет права доступа к сети. Но когда вы устанавливаете исполняемый файл как службу, по умолчанию, если вы видите в задаче управление, он запускается под учетной записью «SYSTEM». Возможно, вы знаете, что «СИСТЕМА» не имеет прав доступа к сетевым ресурсам.
Там может быть два решения этой проблемы.
Для сопоставления диска как постоянного, как уже указано выше.
Есть еще один подход, которому можно следовать. Если вы откроете менеджер сервисов, введя «services.msc», вы можете перейти к своему сервису, а в свойствах вашего сервиса есть вкладка входа в систему, где вы можете указать учетную запись как любую другую учетную запись, отличную от «Системной», вы можете либо Запустите службу из своей учетной записи, зарегистрированной в системе, или через «Сетевую службу». Когда вы сделаете это .. служба может получить доступ к любому сетевому компоненту и диску, даже если они не являются постоянными. Чтобы достичь этого программно, вы можете обратиться к функции «CreateService» по адресу http://msdn.microsoft.com/en-us/library/ms682450(v=vs.85).aspx и установить для параметра «lpServiceStartName» значение «NT». AUTHORITY \ NetworkService. Это запустит ваш сервис в разделе «Сетевой сервис»
Вы также можете попробовать сделать сервис интерактивным, указав SERVICE_INTERACTIVE_PROCESS во флаге параметра servicetype вашей функции CreateService (), но это будет ограничено только до XP, так как Vista и 7 не поддерживают эту функцию.
Надеюсь, что решения помогут вам .. Дайте мне знать, если это сработало для вас.
источник
Вы не хотите ни менять пользователя, под которым запускается Служба, из «Системы», либо искать хитрый способ запустить ваше отображение как Система.
Самое смешное, что это возможно с помощью команды «at» , просто запланируйте сопоставление вашего диска на одну минуту в будущем, и он будет запущен под системной учетной записью, делая диск видимым для вашей службы.
источник
Вместо того, чтобы полагаться на постоянный диск, вы можете установить скрипт для отображения / отмены отображения диска каждый раз, когда вы его используете:
Это работает для меня.
источник
Я пока не могу комментировать (работаю над репутацией), но создал аккаунт только для того, чтобы отвечать на вопросы @Tech Jerk @ spankmaster79 (славное имя lol) и @NMC, о которых они сообщили в ответ на «Я нашел решение, похожее на psexec, но работает без дополнительных инструментов и переживает перезагрузку. " пост @Larry сделал.
Решение этой проблемы заключается в том, чтобы просто перейти к этой папке из зарегистрированной учетной записи, то есть:
и позвольте ему предложить войти в систему и ввести те же учетные данные, которые вы использовали для UNC в psexec. После этого он начинает работать. В моем случае, я думаю, это потому, что сервер со службой не входит в тот же домен, что и сервер, на который я выполняю привязку. Я думаю, если UNC и запланированная задача оба ссылаются на IP вместо имени хоста
это может полностью избежать проблемы.
Если я когда-нибудь получу достаточно очков репутации, я добавлю это как ответ.
источник