Показать полную графическую версию : Удалённое монтирование сетевых дисков посредством скрипта
Elusive87
12-12-2012, 18:51
Доброго времени суток, ув. форумчане
Помогите разобраться новичку-скриптописателю.
Поставил перед собой задачу написать скрипт, выполняющий рутинную работу, причём, удалённо. Застрял на задаче монтирования сетевого диска на удалённом компьютере.
Суть следующая. Я выполняю скрипт на компьютере А, он подсоединяется к компьютеру Б, совершает там много всякой всячины, в числе которой и монтирование сетевого диска - шары компьютера В.
Вот такой участочек кода.
strComputer = ""
UserName = ""
Password = ""
Set SWBemlocator = CreateObject("WbemScripting.SWbemLocator")
Set objWMIService = SWBemlocator.ConnectServer(strComputer,"root\CIMV2",UserName,Password)
Set objProcess = objWMIService.Get("Win32_Process")
errReturn = objProcess.Create("net use * \\10.40.*.*\shara_name password /user:domain\username", Null, Null, intProcessID)
WScript.Echo errReturn
Как видите, я решил заставить WMI выполнить команду чтобы примапить шару, поскольку я не нашёл у WMI специального "инструмента" для этих целей. Этот код отрабатывает на ура на компьютере А - шара мапится. На компьютере Б он тоже отрабатывается, объект objProcess возвращает 0, что означает что ему ничто не помешало отправить команду (ясень пень, что сама утилита net нам ничего таким образом не вернёт). :( А вот результате на компьютере Б диск мапится, но его не видно в проводнике, в списке примапленых дисков он висит как не доступный.
Думал что дело в настройках имперсонации и аутентификации WMI. Экспериментировал с ними.
'SWBemlocator.Security_.ImpersonationLevel = 3
'SWBemlocator.Security_.AuthenticationLevel = 6
'SWBemlocator.Security_.Privileges.AddAsString "SeCreateTokenPrivilege"
Ничего не добился - диск как мапился так и мапится не правильно.
Все 3 компьютера - члены домена. На компьютере А я авторизирован под доменной учёткой, на компьютере Б скрипт авторизируется под локальной учёткой с правами админа (потому, что моя учётка там не имеет админ. полномочий), шару В на компьютере Б мапит от имени доменной учётки (я экспериментировал со своей).
Буду рад выслушать ваши советы, ув. коллеги. А также буду благодарен если кто подскажет как ещё можно монтировать сетевые диски удалённо (logon скрипты в данном случае мне не нужны).
объект objProcess возвращает 0, что означает что ему ничто не помешало отправить команду (ясень пень, что сама утилита net нам ничего таким образом не вернёт). »
Не «объект objProcess», а метод «.Create()» возвращает «0», если ему удалось запустить процесс. Ничего более это не означает. Никакой связи с ErrorLevel созданного процесса этот «0» не несёт.
Для кого, для какой учётной записи должен быть смонтирован сетевой ресурс на удалённой машине?
Elusive87
12-12-2012, 21:52
Не «объект objProcess», а метод «.Create()» возвращает «0», если ему удалось запустить процесс. Ничего более это не означает. Никакой связи с ErrorLevel созданного процесса этот «0» не несёт. »
Да, не объект, а метод. А по поводу остального я то же самое говорил.
Для кого, для какой учётной записи должен быть смонтирован сетевой ресурс на удалённой машине? »
Скрипт авотризируется на машине Б под учётной записью локального администратора (не доменной, поэтому я к net use добавляю доменные credentials, чтобы шара смонтировалась), и для этой же учётной записи будет монтироваться диск, разумеется.
Да, не объект, а метод. А по поводу остального я то же самое говорил. »
Elusive87, ясно. Разобрались.
Скрипт авотризируется на машине Б под учётной записью локального администратора (не доменной, поэтому я к net use добавляю доменные credentials, чтобы шара смонтировалась), и для этой же учётной записи будет монтироваться диск, разумеется. »
Ничего не понятно. Приведите здесь:
strComputer = ""
UserName = ""
Password = ""
Set SWBemlocator = CreateObject("WbemScripting.SWbemLocator")
Set objWMIService = SWBemlocator.ConnectServer(strComputer,"root\CIMV2",UserName,Password)
Set objProcess = objWMIService.Get("Win32_Process")
errReturn = objProcess.Create("net use * \\10.40.*.*\shara_name password /user:domain\username", Null, Null, intProcessID)
WScript.Echo errReturn
такие данные, по которым было бы понятно, где какие имена используются.
Elusive87
13-12-2012, 00:37
strComputer = "192.168.1.14"
UserName = "192.168.1.14\administrator"
Password = "password"
Set SWBemlocator = CreateObject("WbemScripting.SWbemLocator")
Set objWMIService = SWBemlocator.ConnectServer(strComputer,"root\CIMV2",UserName,Password)
Set objProcess = objWMIService.Get("Win32_Process")
errReturn = objProcess.Create("net use * \\192.168.1.20\shara_name password /user:domain\username", Null, Null, intProcessID)
WScript.Echo errReturn
Я со своего компьютера запускаю скрипт и авторизируюсь на компьютере 192.168.1.14 под учётной записью administrator, эта учётная запись хранится локально на 192.168.1.14 и имеет права админа. Общий ресурс хранится на 192.168.1.20, его нужно примонтировать, однако, поскольку компьютер 192.168.1.20 является членом домена и политикой запрещён гостевой доступ (авторизация на 192.168.1.14 прошла не под доменной учёткой, а под локальной), он будет монтироваться от имени доменной учётной записи - domain\username password.
Elusive87, вот диск смонтирован на разделённый ресурс. Что дальше?
А дальше будет именно это:
А вот результате на компьютере Б диск мапится, но его не видно в проводнике, в списке примапленых дисков он висит как не доступный. »
«localhost(192.168.1.14)\administrator» у Вас ведь не имеет доступа к «192.168.1.20».
Elusive87
16-12-2012, 17:57
Iska, посмотрите внимательно на код. Я утилите NET передаю те учтёные данные, что имеют доступ на 192.168.1.20
net use * \\192.168.1.20\shara_name password /user:domain\username »
Если я этого не сделаю, что диск не примонтируется вообще и в списке примонтированных дисков его видно не будет, проверено. Здесь же он монтируется, но он не доступен. Ещё раз уточню.
В проводнике его не видно среди перечня логических дисков. Но видно в перечне примонтированных дисков как недоступный (просмотриваем либо утилитой net либо с помощью "отключить сетевой диск").
У меня такое впечатление, что сам процесс, порождаемый методом Create имеет какие-то ограничения.
Кстати, я далеко не первый кто столкнулся с этими граблями, долго рылся в инете, но никто из этих ребят, что также столкнулись с этой проблемой, ответа не получил.
Пробовал "перехитрить" ограничение - запускал команду через cmd /c start, чтобы таким образом породить новый процесс. Но результат тот же (как такое может быть - ума не приложу). Причём, если сделать то же самое руками на целевом компьютере - всё прекрасно монтируется. Экспериментировал на разных компьютерах. Вот у меня и закрались подозрения насчёт подводных камней самой конструкции класса и метода.
Сразу уточню по поводу "делал руками" чтобы не было лишних вопросов: на удалённых компьютерах я авторизировался под localhost\administartor и выполнял команду net use оттуда. И вообще всякую команду, что я передавал методу Create я сначала проверял на целевом компьютере "вручную".
Как вариант создать задачу через schtasks.
Petya V4sechkin
16-12-2012, 18:21
На компьютере А я авторизирован под доменной учёткой, на компьютере Б скрипт авторизируется под локальной учёткой с правами админа (потому, что моя учётка там не имеет админ. полномочий), шару В на компьютере Б мапит от имени доменной учётки
[решено] Copy отличия в работе при запуске от администратора (http://forum.oszone.net/thread-244762.html)
Elusive87
16-12-2012, 22:21
Petya V4sechkin, все рабочие станции работают на XP. Но всё же спасибо за любопытный нюанс, он мне пригодится, поскольку в сл. году мы все перейдём на "семёрку".
Iska, посмотрите внимательно на код. »
Elusive87, я сталкивался с подобным когда-то. Не аналогичным вопросом, но подобным: 91475. Вопрос там в итоге остался открытым.
Elusive87
17-12-2012, 20:00
Как вариант создать задачу через schtasks »
Насколько я понял в Win32_ScheduledJob мгновенное задание создать не получится. Никаких таких параметров я не нашёл. Можно лишь задать текущую минуту для времени запуска, если уж его использовать. Слышал я что у него всё равно какая-то задержка есть, это правда? А то собственноручно проверять пока что не приходилось
Elusive87, я сталкивался с подобным когда-то. Не аналогичным вопросом, но подобным: WshNetwork_RemoveNetworkDrive на удаленном компьютере не работает.7z. Вопрос там в итоге остался открытым. »
Судя по тому, что там пишет Русинович, получается, что создаваемый процесс не имеет сетевого доступа и это было спроектировано намеренно. Обидно получается. А что за инструмент(ы) оставили "мелкогмягкие" для доступа по сети? Ведь что выходит - даже если примонтированные диски и существуют заранее, забраться туда всё равно не сможешь - облом!
я использую psexec для этого.
@echo off
set /p "c=Введите имя компьютера: "
psexec.exe -i -s \\%c% net use l: \\server001\common
pause
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.