Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

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

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

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

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

Ответ 4

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

Ответ 5

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

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

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

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

Ответ 6

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

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

mklink /D C:\myLink \\127.0.0.1\c$

Ответ 7

ForcePush,

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

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

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

Ответ 8

Найден способ предоставления Windows Service доступа к Network Drive.

Возьмите 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.

Откройте "Планировщик заданий", создайте новую задачу:

  • Запустите "SYSTEM" в "System Startup".
  • Создать действие: Запустить "C:\mount_nfs.bat".

После этих двух простых шагов моя служба Windows ActiveMQ работает под привилегией "Local System", отлично работает без входа.

Ответ 9

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

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

Ответ 10

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

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

Ответ 12

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

Решение этого - просто перейти к этой папке из зарегистрированной учетной записи, то есть:

    \\servername\share  

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

    \\123.456.789.012\share 

он может вообще избежать проблемы.

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

Ответ 13

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

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

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