Предположим, какая-то служба Windows использует код, которому нужны подключенные сетевые диски, а не пути UNC. Как я могу сделать отображение диска доступным для сеанса службы при ее запуске? Вход в систему как пользователь службы и создание постоянного сопоставления не приведет к установлению сопоставления в контексте фактической службы.
Подключите сетевой диск, который будет использоваться службой
Ответы (12)
Вам нужно будет либо изменить службу, либо обернуть ее во вспомогательный процесс: помимо проблем с доступом к сеансу / диску, постоянные сопоставления дисков восстанавливаются только при интерактивном входе в систему, что службы обычно не выполняются.
Подход вспомогательного процесса может быть довольно простым: просто создайте новую службу, которая отображает диск и запускает «настоящую» службу. Единственное, что здесь не совсем тривиально:
Вспомогательная служба должна будет передать все соответствующие команды 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 $.
net use z: \\servername\sharedfolder
, и настройте его на запуск при запуске компьютера согласно technet.microsoft.com/en-us/library/cc770556.aspx Это будет запускаться как системная учетная запись, поэтому в psexec нет необходимости.
- person TRS-80; 20.04.2012
/user:username
или он отказывается монтировать диск как системную учетную запись
- person dlamotte; 10.07.2013
/persistent:yes
, по-видимому, не действует, и диск недоступен после перезагрузки. В итоге я включил net use z: /delete
и net use z: \\servername\sharedfolder /user:username password
прямо в пакетный скрипт.
- person Calimo; 24.09.2013
/USER:[remotecomp]\[remoteusername] [password]
(команда иногда не работает должным образом, если перед именем удаленного пользователя не указано имя удаленного компьютера и обратная косая черта. Кроме того, если общий ресурс защищен паролем и отображается для других как отключенный диск, он НЕ доступен для всех. Любой пользователь в этой системе, где SYSTEM устанавливает общий ресурс, должен знать пароль к этому общему ресурсу. (проверено на XPx64)
- person Kitet; 18.01.2016
Я нашел решение, похожее на решение с psexec, но работающее без дополнительных инструментов и выдерживающее перезагрузку.
Просто добавьте запланированную задачу, вставьте слово «система» в поле «Запуск от имени» и укажите задачу в пакетном файле с помощью простой команды.
net use z: \servername\sharedfolder /persistent:yes
Затем выберите «запускать при запуске системы» (или аналогичный, у меня нет английской версии) и все готово.
/persistent:yes
- person Edd; 25.09.2013
Лучше всего использовать символическую ссылку с помощью 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
Edit: Очевидно, я вас неправильно понял - вы не можете изменить исходный код сервиса, верно? В этом случае я бы последовал предложению mdb, но с небольшим поворотом: создайте свой собственный сервис (назовем его сопоставлением service), который сопоставляет диск и добавляет эту службу сопоставления к зависимостям для первой (фактически работающей) службы. Таким образом, рабочая служба не запустится до запуска службы сопоставления (и сопоставления диска).
ForcePush,
ПРИМЕЧАНИЕ: вновь созданный подключенный диск теперь будет отображаться для ВСЕХ пользователей этой системы, но они будут видеть его как «Отключенный сетевой диск (Z :)». Не позволяйте названию ввести вас в заблуждение. Он может заявить, что отключен, но он будет работать для всех. Вот как вы можете сказать, что этот хак не поддерживается M $ ...
Все зависит от прав доступа к общему ресурсу. Если у вас есть права доступа "Все", этот подключенный диск будет доступен другим пользователям. Но если у вас есть только какой-то конкретный пользователь, учетные данные которого вы использовали в своем пакетном сценарии, и этот пакетный сценарий был добавлен в сценарии запуска, только системная учетная запись будет иметь доступ к этому общему ресурсу, даже не администратор. Поэтому, если вы используете, например, запланированное задание ntbackuo, системная учетная запись должна использоваться в «Запуск от имени». Если ваша служба «Войти как: учетная запись локальной системы», она должна работать.
Что я сделал: я не сопоставил букву диска в моем сценарии запуска, просто использовал net use \\\server\share ...
и использовал UNC-путь в моих запланированных заданиях. Добавлен сценарий входа в систему (или просто добавьте пакетный файл в папку автозагрузки) с сопоставлением с той же общей папкой с некоторой буквой диска: net use Z: \\\...
с теми же учетными данными. Теперь зарегистрированный пользователь может видеть подключенный диск и получать к нему доступ. Есть 2 подключения к одной общей папке. В этом случае пользователь не видит раздражающего «Отключен сетевой диск ...». Но если вам действительно нужен доступ к этому общему ресурсу по букве диска, а не только по UNC, сопоставьте этот общий ресурс с разными буквами диска, например Y для системы и Z для пользователей.
Нашел способ предоставить службе 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.
Откройте «Планировщик заданий», создайте новую задачу:
- Запустите как «СИСТЕМА» в «Запуск системы».
- Создание действия: Запустите «C: \ mount_nfs.bat».
После этих двух простых шагов моя служба Windows ActiveMQ запускается с привилегией «Локальная система» и отлично работает без входа в систему.
Причина, по которой вы можете получить доступ к диску, когда вы обычно запускаете исполняемый файл из командной строки, заключается в том, что когда вы выполняете его как обычный exe, вы запускаете это приложение в учетной записи пользователя, из которой вы вошли в систему. И у этого пользователя есть права доступа к сети. Но когда вы устанавливаете исполняемый файл как службу, по умолчанию, если вы видите в управлении задачами, он запускается под учетной записью «СИСТЕМА». И вы могли знать, что «СИСТЕМА» не имеет прав на доступ к сетевым ресурсам.
У этой проблемы может быть два решения.
Чтобы сопоставить диск как постоянный, как уже указывалось выше.
Есть еще один подход, которому можно следовать. Если вы откроете диспетчер служб, набрав 'services.msc', вы можете перейти к своей службе, а в свойствах вашей службы есть вкладка входа в систему, где вы можете указать учетную запись как любую другую учетную запись, кроме 'System', вы можете либо запустить службу из вашей собственной учетной записи пользователя или через «Сетевую службу». Когда вы это сделаете ... служба может получить доступ к любому сетевому компоненту и диску, даже если они не являются постоянными. Чтобы добиться этого программно, вы можете изучить функцию 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 не поддерживают эту функцию.
Надеюсь, что решения помогут вам ... Сообщите мне, сработало ли это для вас.
Вместо того, чтобы полагаться на постоянный диск, вы можете настроить скрипт для сопоставления / отмены сопоставления диска каждый раз, когда вы его используете:
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 (красивое имя, смех) и проблемы @NMC, о которых они сообщили в ответ на сообщение «Я нашел решение, подобное тому с psexec, но работает без дополнительных инструментов и выдерживает перезагрузку. " сообщение, которое сделал @Larry.
Чтобы решить эту проблему, просто перейдите к этой папке из зарегистрированной учетной записи, то есть:
\\servername\share
и дайте ему запрос на вход и введите те же учетные данные, которые вы использовали для UNC в psexec. После этого он начинает работать. В моем случае, я думаю, это связано с тем, что сервер со службой не является членом того же домена, что и сервер, на который я сопоставляю. Я думаю, если UNC и запланированная задача относятся к IP вместо имени хоста
\\123.456.789.012\share
это может полностью избежать проблемы.
Если я когда-нибудь получу здесь достаточно очков репутации, я добавлю это в качестве ответа.