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

StackOverflow https://stackoverflow.com/questions/182750

Вопрос

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

Это было полезно?

Решение

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

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

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

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

Другие советы

Используйте это на свой страх и риск. (Я проверил это на XP и Server 2008 x64 R2)

Для этого взлома вам потребуется SysinternalsSuite Марка Руссиновича :

Шаг первый: Откройте окно с повышенными привилегиями cmd.exe (запуск от имени администратора)

Шаг второй: Поднимитесь снова, чтобы получить root права, используя PSExec.exe: Перейдите в папку, содержащую SysinternalsSuite, и выполните следующую команду psexec -i -s cmd.exe теперь вы находитесь в приглашении nt полномочия \ system , и вы можете доказать это, набрав whoami . -i необходим, потому что сопоставления дисков должны взаимодействовать с пользователем

Шаг третий. Создайте постоянный подключенный диск в качестве учетной записи SYSTEM с помощью следующей команды net use z: \\ имя_сервера \ общая папка / постоянная: да

Это так просто!

ПРЕДУПРЕЖДЕНИЕ . Вы можете удалить это сопоставление только так, как вы его создали, из учетной записи SYSTEM. Если вам нужно удалить его, выполните шаги 1 и 2, но измените команду на шаге 3 на net use z: / delete .

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

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

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

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

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

Лучшим способом было бы использовать символическую ссылку, используя 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

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

Форцепуш,

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

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

Что я сделал, я не сопоставлял ни одну букву диска в своем сценарии запуска, просто использовал net use \\\server\share ... и использовал UNC path в моих запланированных заданиях.Добавлен сценарий входа в систему (или просто добавьте пакетный файл в папку автозагрузки) с сопоставлением с тем же общим ресурсом с некоторой буквой диска: 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.

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

<Ол>
  • Запускать как " SYSTEM " ;, при " Запуск системы ".
  • Создать действие: Запустите " 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 не поддерживают эту функцию.

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

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

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

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

    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
    

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

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

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

        \\servername\share  
    

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

        \\123.456.789.012\share 
    

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

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top