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

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


person VoidPointer    schedule 08.10.2008    source источник
comment
См. Ответ ForcePush, его обходной путь работает.   -  person Ubikuity    schedule 26.08.2011


Ответы (12)


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

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

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

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

person mdb    schedule 08.10.2008
comment
Очень информативно ... Правильно ли я предполагаю, что сценарии входа в систему также запускаются только для интерактивных сеансов входа в систему, а не для сеансов обслуживания? - person VoidPointer; 08.10.2008

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

person ForcePush    schedule 21.01.2011
comment
Я пытался использовать это решение и столкнулся с этой проблемой: подключенный диск отображается как отключенный для пользователей (даже для администраторов). Какие-либо предложения? - person Constantin Baciu; 14.02.2011
comment
Работает как шарм! Спасибо! Какое-то время боролся с этим - person Tommy; 04.08.2011
comment
У меня та же проблема, что и у Константина - есть идеи, как поделиться как для системы, так и для пользователей? - person Nik; 04.10.2011
comment
После перезагрузки подключенный диск пропал. Есть идеи? Сопоставление сохраняется, но состояние недоступно, поэтому оно не отображается - person Tommy; 17.10.2011
comment
Я также вижу, что сопоставление недоступно после перезагрузки. - person Dave Patterson; 20.10.2011
comment
Чтобы он заработал после перезагрузки, создайте сценарий, содержащий только net use z: \\servername\sharedfolder, и настройте его на запуск при запуске компьютера согласно technet.microsoft.com/en-us/library/cc770556.aspx Это будет запускаться как системная учетная запись, поэтому в psexec нет необходимости. - person TRS-80; 20.04.2012
comment
Почему решение ForcePush не работает для IIS? В IIS я сопоставил / VirtualDirectory с Z:, который сопоставляется с другой машиной. Но когда я попытался просмотреть веб-сайт / VirtualDirectory, я не смог добраться до карты. Если я использую командную строку или проводник, я могу видеть Z: и копировать туда файлы. - person chuacw; 06.03.2013
comment
@ TRS-80 Сценарии запуска запускаются до входа пользователя в систему, чтобы создать подключенный диск, вы должны войти в систему. Я пробовал ваше решение, но подключенный диск недоступен после перезагрузки. Я что-то упускаю? - person Shrage Smilowitz; 03.04.2013
comment
Вы должны обновить свой ответ, чтобы решить эту проблему на новых хостах Windows (сервер 2008+). Вам нужно добавить /user:username или он отказывается монтировать диск как системную учетную запись - person dlamotte; 10.07.2013
comment
В Windows 7 /persistent:yes, по-видимому, не действует, и диск недоступен после перезагрузки. В итоге я включил net use z: /delete и net use z: \\servername\sharedfolder /user:username password прямо в пакетный скрипт. - person Calimo; 24.09.2013
comment
Вы также можете запустить этот сценарий, который вы создали как часть политики группы запуска для вашего компьютера, technet.microsoft.com/en-us/library/cc770556.aspx. Это настроит диск для любого пользователя в системе при каждом запуске компьютера. - person James Eby; 12.01.2015
comment
Я хочу добавить, что важно, чтобы все использовали предложение /USER:[remotecomp]\[remoteusername] [password] (команда иногда не работает должным образом, если перед именем удаленного пользователя не указано имя удаленного компьютера и обратная косая черта. Кроме того, если общий ресурс защищен паролем и отображается для других как отключенный диск, он НЕ доступен для всех. Любой пользователь в этой системе, где SYSTEM устанавливает общий ресурс, должен знать пароль к этому общему ресурсу. (проверено на XPx64) - person Kitet; 18.01.2016
comment
Это работает, я бы также рекомендовал использовать / savecred, чтобы сохранить учетные данные. Это отлично сработало для меня, сопоставив диски NAS с сервером apache. - person mberna; 18.11.2016
comment
Как я могу удалить учетные данные для этого или указать другие учетные данные, если я указал savecred в первый раз? Системные учетные данные не отображаются в control keymgr.dll - person mberna; 18.11.2016
comment
По причинам, которые я не уверен, это НЕ сработало для меня. Вместо этого он испортил мой процесс загрузки и выключения до такой степени, что я больше не мог войти в систему. Мне потребовались некоторые усилия, чтобы отменить то, что предлагается здесь, потому что предлагаемый инструмент не работает в безопасном режиме. К счастью, я смог применить изменения возврата без использования инструмента (psexec). - person AudioDroid; 30.11.2016
comment
Знаете ли вы техническую причину, по которой подключенный диск виден всем пользователям? Или это просто баг? - person iPath ツ; 14.02.2017
comment
/ persistent: yes не влияет ни на Windows 10. - person Tomasz Plonka; 20.03.2019

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

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

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

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

person larry    schedule 23.10.2011
comment
что начинается первым? служба Windows или это запланированное задание? наша служба умирает при запуске, если путь недоступен. Нам придется перестроить это, если служба запускается последней. - person Thomas; 20.12.2011
comment
Я пробовал это на 2008 R2, он создает отключенный подключенный диск, и когда я пытаюсь открыть его, он говорит, что z: \ недоступен. Ошибка входа в систему: неизвестное имя пользователя или неверный пароль. Но я смог успешно создать подключенный диск, запустив тот же файл bat вручную. Ny Insights? - person Gopi; 18.07.2013
comment
@Thomas не имеет значения, что запускается первым, если задача была запущена хотя бы один раз из-за /persistent:yes - person Edd; 25.09.2013
comment
Это единственный метод, который работал у меня в Windows 8.1. Мне пришлось сделать это для резервного копирования моего NAS в Crashplan, и триггер должен был срабатывать, когда любой пользователь входил в систему. - person Jim Hunziker; 27.10.2013
comment
@TechJerk ты решил свою проблему? У меня такая же проблема, и я не могу заставить ее работать - person spankmaster79; 20.06.2014
comment
Почему это должно быть запланированное задание? Это / настойчиво: да, разве этого не достаточно, чтобы сохранить его? - person Scott Stafford; 05.02.2015
comment
@TechJerk Вы когда-нибудь находили исправление ошибки входа в систему? - person NMC; 02.05.2016
comment
Это хорошо работало на ноутбуке с Windows с виртуальной машиной Windows. Vm отображает диск на часть дискового пространства хоста, а также хочет использовать символическую ссылку на диске C: виртуальной машины, чтобы указать на общий диск и, следовательно, указать правильное место на дисковом пространстве хоста. Виртуальной машине необходимо получить доступ к этому месту на диске из службы Windows, поэтому мне потребовался этот обходной путь с запланированным заданием, выполняемым как System. Спасибо - person davidfrancis; 04.09.2017
comment
@ScottStafford Нет / постоянный: да, этого недостаточно для Win7 и более поздних версий. Сопоставление удаляется после перезагрузки независимо от этого переключателя. - person Eternal21; 10.10.2017

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

person Hal    schedule 26.10.2011
comment
Так просто и хорошо работает. Поскольку это часть файловой системы, ссылка доступна для всех учетных записей. Просто убедитесь, что служба работает как учетная запись, имеющая доступ к сетевому ресурсу (что может не относиться к системе и т. Д.). - person Jeremy Frank; 24.02.2012
comment
Это ОПРЕДЕЛЕННО лучший ответ на вопрос, большое вам спасибо! - person Sten Petrov; 06.06.2014
comment
К сожалению, если символьная ссылка обращается к общему сетевому ресурсу, вы вернетесь на круги своя. - person davidfrancis; 04.09.2017
comment
Это решение, которое я выбрал, поскольку символическая ссылка является общим ресурсом netwerk. Мне пришлось позаботиться о том, чтобы служба начала использовать (сетевого) пользователя, которому разрешено следовать символическим ссылкам. Как только это будет покрыто, это будет идеальное решение. - person ruud; 17.07.2020
comment
Не могли бы вы поподробнее описать, чем именно вы занимались? - person dBlaze; 25.04.2021

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

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

mklink /D C:\myLink \\127.0.0.1\c$
person philu    schedule 03.06.2016
comment
Что делать, если после попытки создать каталог из службы вы получите ошибку разрешения? - person tyoc213; 09.12.2016
comment
Вы должны перевести это в чат-комнату в автономном режиме, а затем подробно описать сообщение об ошибке. Вероятно, вам нужно запускать команды с повышенными разрешениями. - person philu; 02.01.2017
comment
@ tyoc213 Ты получил ответ? - person Lsakurifaisu; 25.07.2019

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

person Treb    schedule 08.10.2008
comment
я думаю, что с этой настройкой картографической службы сопоставление дисков, установленное картографической службой, не будет доступно в контексте исходной службы, не так ли? - person VoidPointer; 10.10.2008
comment
Я думаю, что ‹disclaim› следует ‹/disclaim› - для каждого сеанса Winlogon существует только одна среда. - person Treb; 10.10.2008
comment
Ваш код ДЕЙСТВИТЕЛЬНО работает в сервисе. Я пришел сюда с той же проблемой, что и OP, но я являюсь автором службы. Ваш ответ решил мою проблему. - person Joe Gayetty; 07.03.2017

ForcePush,

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

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

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

person lk7777    schedule 22.01.2014

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

person Val    schedule 20.01.2016

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

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

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

  2. Есть еще один подход, которому можно следовать. Если вы откроете диспетчер служб, набрав 'services.msc', вы можете перейти к своей службе, а в свойствах вашей службы есть вкладка входа в систему, где вы можете указать учетную запись как любую другую учетную запись, кроме 'System', вы можете либо запустить службу из вашей собственной учетной записи пользователя или через «Сетевую службу». Когда вы это сделаете ... служба может получить доступ к любому сетевому компоненту и диску, даже если они не являются постоянными. Чтобы добиться этого программно, вы можете изучить функцию 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 не поддерживают эту функцию.

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

person Kushagra    schedule 29.09.2010

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

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

У меня это работает.

person jeff    schedule 26.01.2018

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

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

person Torbjörn Gyllebring    schedule 08.10.2008
comment
служба не работает как система. Он настроен для работы под определенной локальной учетной записью. Даже если я вхожу в систему с этой учетной записью, создаю постоянное сетевое сопоставление, выхожу из системы и перезапускаю службу, сопоставление не будет доступно для службы. - person VoidPointer; 08.10.2008

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

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

    \\servername\share  

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

    \\123.456.789.012\share 

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

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

person CanadaDave    schedule 06.06.2016