Предположим, что некоторые службы Windows используют код, который хочет подключить сетевые диски и UNC-пути. Как я могу сделать отображение диска доступным для сеанса службы при запуске службы? Вход в систему как пользователь службы и создание постоянного сопоставления не приведет к отображению в контексте фактического сервиса.Карта сетевого диска, который будет использоваться службой
ответ
Вам необходимо либо изменить сервис, либо обернуть его внутри вспомогательного процесса: помимо проблем доступа к сеансу/диску, постоянные сопоставления дисков восстанавливаются только при интерактивном входе в систему, которые обычно не выполняются.
Подход вспомогательного процесса может быть довольно простым: просто создайте новый сервис, который отображает диск и запускает «реальный» сервис. Единственные вещи, которые не совсем тривиальными об этом являются:
Помощник службе нужна будет пройти по всей соответствующей SCM команды (старт/стоп, и т.д.) в режиме реального обслуживания. Если реальная услуга принимает пользовательские команды SCM, не забудьте также передать их (я не ожидаю, что служба, которая считает UNC-пути экзотическими для использования таких команд, хотя ...)
Может быть немного сложно удостоверение-накрест. Если реальная служба работает под обычной учетной записью пользователя, вы также можете запустить вспомогательную службу под этой учетной записью, и все должно быть ОК, если у учетной записи есть соответствующий доступ к общему ресурсу сети. Если реальная служба будет работать только при запуске как LOCALSYSTEM или что-то более интересное, все станет более интересным, так как либо он вообще не сможет «видеть» сетевой диск, либо требует некоторого манипулирования учетными данными, чтобы заставить работу работать.
Очень информативно ... Правильно ли я полагаю, что сценарии входа в систему также выполняются только для интерактивных сеансов входа в систему, а не для сеансов обслуживания? – VoidPointer 2008-10-08 13:55:52
Вы не можете либо изменить пользователя, что Служба работает под «Системой», либо найти скрытый способ запуска вашего сопоставления как системы.
Самое смешное, что это возможно с помощью команды "at", просто запланировать отображение своего диска на одну минуту в будущем, и оно будет запущено под учетной записью системы, что сделает диск видимым для вашей службы.
Служба не работает как «Система». Он настроен для работы под определенной локальной учетной записью. Даже я вхожу в систему с этой учетной записью, создаю постоянное сетевое сопоставление, выхожу из системы и перезапускаю службу, сопоставление не будет доступно службе. – VoidPointer 2008-10-08 13:47:00
Вы могли бы нам инет использование "команда:
var p = System.Diagnostics.Process.Start("net.exe", "use K: \\\\Server\\path");
var isCompleted = p.WaitForExit(5000);
Если это не работает в службе, попробуйте WinAPI и PInvoke WNetAddConnection2
Edit: Очевидно, что я неправильно понял - ты не может изменить исходный код службы, не так ли? В этом случае я буду следовать предложению mdb, но с небольшим завихрением: создайте собственную услугу (позвоните в службу отображения), которая отображает диск и добавляет эту службу сопоставления в зависимости от первой (фактической рабочей) службы. Таким образом, рабочая служба не запустится до запуска службы сопоставления (и сопоставления диска).
с этой настройкой службы сопоставления, я думаю, что отображение диска, установленное службой сопоставления, не будет доступно в контексте исходной службы, не так ли? – VoidPointer 2008-10-10 08:51:25
Я думаю, что
Ваш код работает в службе. Я пришел сюда с тем же вопросом, что и OP, но я являюсь автором Службы. Ваш ответ решил мою проблему. – 2017-03-06 21:00:29
Причина, почему вы можете получить доступ к диску, когда вы обычно запустить исполняемый файл из командной строки, что, когда и выполняет его как обычный ех вы работаете, что применение в учетной записи пользователя, от которого у вас есть вошел . И у этого пользователя есть привилегии для доступа к сети. Но, когда вы устанавливаете исполняемый файл как услугу, по умолчанию, если вы видите в управлении задачами, она работает под учетной записью «SYSTEM». И вы можете знать, что «SYSTEM» не имеет прав на доступ к сетевым ресурсам.
Возможны два решения этой проблемы.
Чтобы отобразить диск как стойкий, как указано выше.
Существует еще один подход, который может быть применен. Если вы откроете диспетчер служб, введя «services.msc», вы можете перейти к своей службе, а в свойствах вашей службы есть вкладка logOn, где вы можете указать учетную запись как любую другую учетную запись, чем «Система», вы можете либо начать работу с вашей собственной учетной записи пользователя или через «Сетевая служба». Когда вы это сделаете, служба может получить доступ к любому сетевому компоненту и диску, даже если они не являются постоянными. Для этого программно вы можете посмотреть в функции «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 сторонников поддержки этой функции.
Надеюсь, что решения помогут вам. Дайте мне знать, если это сработало для вас.
Используйте это на свой страх и риск. (Я тестировал на XP и Server 2008 x64 R2)
Для этого взломать вам нужно SysinternalsSuite by Mark Russinovich:
Шаг один: Открыть поднятый cmd.exe подсказку (Запуск от имени администратора)
Шаг два: Elevate снова корня с помощью psExec.exe: Перейдите в папку, содержащую SysinternalsSuite и выполнить следующую команду psexec -i -s cmd.exe
вы сейчас я nside подсказки, которая равна nt authority\system
, и вы можете это доказать, набрав whoami
. -i
необходима, поскольку отображения дисков должны взаимодействовать с пользователем
Шаг третий: Создать постоянный подключенный диск в качестве учетной записи SYSTEM с помощью следующей команды net use z: \\servername\sharedfolder /persistent:yes
Это так просто!
ВНИМАНИЕ: Вы можете удалить это сопоставление так же, как вы его создали, из учетной записи SYSTEM. Если вам нужно удалить его, выполните шаги 1 и 2, но измените команду на шаге 3 на net use z: /delete
.
ПРИМЕЧАНИЕ: вновь созданный сопоставленный диск теперь появится для ВСЕХ пользователей этой системы, но они будут видеть его как «Отключенный сетевой диск (Z :)». Не позволяйте имени обмануть вас. Он может утверждать, что он отключен, но он будет работать для всех. Вот как вы можете сказать, что этот хак не поддерживается M $.
Я пытался использовать это решение и столкнулся с этой проблемой: подключенный диск выглядит как отключенный от пользователей (даже администраторов). Какие-либо предложения? – 2011-02-14 16:04:21
Работает как очарование! Благодаря! Некоторое время борется с этим – Tommy 2011-08-04 13:42:00
Я нашел решение, аналогичное решению с psexec, но работает без дополнительных инструментов и выживает перезагрузка.
Просто добавьте Запрограммированную задачу включить «систему» в «перспективе, как» поле и указать задачу пакетного файл с простой командой
net use z: \servername\sharedfolder /persistent:yes
Затем выберите «запустить при старте системы» (или похоже, у меня нет английской версии), и все готово.
Лучшим способом было бы использовать символическую ссылку, используя mklink.exe. Вы можете просто создать ссылку в файловой системе, которую может использовать любое приложение. См. http://en.wikipedia.org/wiki/NTFS_symbolic_link.
ForcePush,
ПРИМЕЧАНИЕ: Вновь созданный Подключенный диск теперь будет отображаться для всех пользователей этой системы, но они будут видеть, что это отображается как «Disconnected Network Drive (Z :)». Не позволяйте имени обмануть вас. Он может утверждать, что он отключен, но он будет работать для всех. Вот как вы можете сказать, что этот хак не поддерживается M $ ...
Все зависит от прав доступа. Если у вас есть права доступа к общим ресурсам, этот подключенный диск будет доступен другим пользователям. Но если у вас есть только какой-то конкретный пользователь, чьи учетные данные, которые вы использовали в вашем пакетном скрипте, и этот пакетный скрипт был добавлен в сценарии запуска, только системная учетная запись будет иметь доступ к этому ресурсу даже не администратору. Итак, если вы используете, например, запланированное задание ntbackuo, учетную запись системы следует использовать в «Запустить как». Если ваша служба «Зарегистрируйтесь как: Локальная системная учетная запись», она должна работать.
Что я сделал, я не отображал букву диска в моем сценарии запуска, просто использовал net use \\\server\share ...
и использовал путь UNC в моих запланированных заданиях. Добавлен сценарий входа в систему (или просто добавлен пакетный файл в папку автозагрузки) с отображением на тот же общий ресурс с буквой диска: net use Z: \\\...
с теми же учетными данными. Теперь зарегистрированный пользователь может видеть и получать доступ к этому подключенному диску. Есть две подключения к одной и той же доле. В этом случае пользователь не видит, что раздражает «Отключенный сетевой диск ...». Но если вам действительно нужен доступ к этому ресурсу буквой диска, а не только UNC, сопоставьте этот ресурс с разными буквами дисков, например. Y для системы и Z для пользователей.
Нашел способ предоставить Windows Service доступ к сетевому диску.
Возьмите Windows Server 2012 с NFS диска, например:
Шаг 1: Написать пакетный файл Mount.
Написать командный файл, например: 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.
Открыть "Планировщик заданий", создать новую задачу:
- Запуск "SYSTEM", в "Загрузка операционной системы".
- Создать действие: Запустить «C: \ mount_nfs.bat».
После этих двух простых шагов моя служба Windows ActiveMQ работает под привилегией «Локальная система», отлично работает без входа в систему.
Существует хороший ответ здесь: https://superuser.com/a/651015/299678
Т.е. Вы можете использовать символическую ссылку, например.
mklink /D C:\myLink \\127.0.0.1\c$
пока не могу комментировать (работает на репутацию), но создал счет только для ответа @Tech рывка @ spankmaster79 (хорошее название лол) и вопросы @NMC сообщили в ответ на «Я нашел решение это похоже на psexec, но работает без дополнительных инструментов и выживает перезагрузка ». сообщение @ Larry сделал.
Решение это просто перейдите в эту папку внутри зарегистрированного счета, то есть:
\\servername\share
и дайте ему приглашение войти в систему, и ввести те же учетные данные, используемые для UNC в PsExec , После этого он начинает работать. В моем случае, я думаю, это связано с тем, что сервер с сервисом не является членом того же домена, что и сервер, на который я сопоставляю. Я имею в виду, если UNC и запланированные задачи оба относятся к IP вместо имени хоста
\\123.456.789.012\share
может избежать этой проблемы в целом.
Если я когда-нибудь получу достаточное количество баллов, я добавлю это вместо ответа.
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
Это работает для меня.
См. Ответ ForcePush, его обходное решение работает. – Ubikuity 2011-08-26 11:44:58