Страница: 1 | 2 |
|
Вопрос: Просканировать сеть и разослать файл по шарам
|
Добавлено: 12.01.10 21:54
|
|
Автор вопроса: cbh
|
Добрый день, задача в локальной сети просканировать все компы и их расшаренный папки. В каждую обнаруженную расшареную папку скопировать пару файлов.
Первая часть скрипта сканирует сеть и выводит шары но надо научить его что в случае обнаружения скопировать файлы в найденные папки
Set objNetwork = CreateObject("Shell.Application").NameSpace(&H12) ' получение объекта "Сетевое окружение"
Set objEntireNetwork = objNetwork.Items().Item("EntireNetwork").GetFolder ' получение объекта "Вся сеть"
For Each objNetItem In objEntireNetwork.Items()
If objNetItem.Name = "Microsoft Windows Network" Then
Set objMSWinNetwork = objNetItem.GetFolder ' получение объекта "Microsoft Windows Network"
Exit For
End If
Next
For Each objMSNetItem In objMSWinNetwork.Items()
WScript.Echo objMSNetItem.Name & ":"
Set objDomain = objMSNetItem.GetFolder ' получение объекта WORKGROUP или DOMAIN
For Each objDomainItem In objDomain.Items()
WScript.Echo vbTab & "\\" & objDomainItem.Name
Set objComputer = objDomainItem.GetFolder ' получение объекта Computer
For Each objCompItem In objComputer.Items()
If objCompItem.IsFileSystem Then
WScript.Echo vbTab & vbTab & objCompItem.Name
End If
Next
Next
Next
как быть дальше? нужно чтобы все это было в фоновом режиме, чтобы окошки с подтверждением не открывались а файлы просто копировались
Ответить
|
Номер ответа: 2 Автор ответа: cbh
Вопросов: 2 Ответов: 10
|
Профиль | | #2
|
Добавлено: 12.01.10 22:19
|
почти, но в мирных целях я так и так крутил по другому не получается,только если еще вируснее сделать)) в том что в мирных целях создается,достаточно убедится если запустить скрипт и посмотреть как долго он будет сканировать сеть потом копировать файлы, к тому же не забываем про антивирусы если сетка чужая...
задача
сетка достаточно большая
домена нет, одноранговая сеть
единого почтового сервера нет
у всех юзеров ИЕ 7 как предустановленные
все под админскими записями
на каждом компе шара
это то что есть как факт,но будет изменено в скором
заказчику нужно чтобы у каждой машины в сети был предустановлен в качестве домашней страницы новосозданный мною Интранет сайт, по сети раскинется батник, затем пользователям на собрании будет сказано запустить его
на интранет установил гугл аналитикс
в батнике в конце ссылки на интранет сайт поставил для примера ?comp=1 таким образом пойму сколько юзеров запустили файл
потом планируется при помощи этого же скрипта сделать как бы маленький аддон к интранет порталу, к пользователям автоматически будут падать корп политики относящиеся к соответствующим департаментам,выложенные на интранет портале
такой ответ удовлетворяет?)
Ответить
|
Номер ответа: 3 Автор ответа: AxeL
ICQ: 264730390
Вопросов: 2 Ответов: 106
|
Профиль | | #3
|
Добавлено: 13.01.10 06:03
|
Проще сделать это через WMI
Пингуешь комп, если жив - подключаешься к нему через WMI, используешь Win32_Share - получаешь список шар... только шары проверять надо, т.к. WMI выведет тебе и IPC$, и стандартные шары(диски[C$, D$...] плюс шара ADMIN$)и сетевые принтеры...
проще батник/скрипт написать, который будет создавать шару, и сказать чтобы юзеры запустили у себя один раз...
...а потом в эту конкретную шару копировать файл(ы)
в батнике в конце ссылки на интранет сайт поставил для примера ?comp=1 таким образом пойму сколько юзеров запустили файл
тогда в батнике лучше разные цифры прописывать, т.к. пользователи могут несколько раз запустить... или сделать проверку на повторный запуск...
Ответить
|
Номер ответа: 7 Автор ответа: AxeL
ICQ: 264730390
Вопросов: 2 Ответов: 106
|
Профиль | | #7
|
Добавлено: 14.01.10 03:41
|
по поводу первого скрипта, его еще надо научить работать с сеткой
Вместо "compname" подставляй через цикл For имена компов или их IP
Здесь http://forum.script-coding.info/viewtopic.php?id=2955 можно взять пример пинга компьютера через vbscript
во первых через подсеть, скажем по имени IP адреса активного адаптера
или же по arrComputers = Array наполнить массив IP адресами For…To…Next
есть идеи?
IP адреса или имена компов можно хранить в текстовом файле. Читаешь через fso весь файл (ReadAll), перебераешь через For Each
и самое сложное как научить в случае нахождения шары копировать туда?
Вопрос на засыпку: откуда уверенность, что среди шар, доступных на компе будет хотя бы одна доступна для записи? Проще один раз самому создать, и ее искать...
Ответить
|
Номер ответа: 9 Автор ответа: AxeL
ICQ: 264730390
Вопросов: 2 Ответов: 106
|
Профиль | | #9
|
Добавлено: 14.01.10 08:57
|
в сети полный бардак, никто никогда и не собирался кого либо ограничивать. Шара на фул аксесс- стандартный случай.
Действовать на удачу? Шара на полный доступ может быть а может и не быть... лучше действовать наверняка.
Рабочий скрипт копирования по сети... переделаешь цикл For под себя...
- Option Explicit
- Dim CompName
- Const Cname = "192.168.1."
- Dim fso, sh, oWMI, oSelQ, file
- Dim Share
- Dim i, Res
-
- Set fso = CreateObject("Scripting.FileSystemObject")
- Set sh = CreateObject("WScript.Shell")
-
- For i = 1 To 254
- CompName = CName & i
- If IsAlive(CompName) = True Then
- Set oWMI = GetObject("WinMgmts:{impersonationLevel=impersonate}!//" & CompName & "/root/cimv2")
-
- Res = sh.Run("subst T: \\" & CompName & "\open_share_for_write", , True)
- Set oSelQ = oWMI.ExecQuery("SELECT * FROM CIM_DataFile WHERE Drive = 'C:' And Path = '\\Folder_Of_Files_For_Copy\\'")
-
- For Each file In oSelQ
- Res=file.Copy(fso.BuildPath("T:", file.FileName & "." & file.Extension))
- Next
- Res = sh.Run("subst T: /D", , True)
- End If
- Next
-
- Set oSelQ = Nothing
- Set oWMI = Nothing
- Set fso = Nothing
- Set sh = Nothing
-
-
- Private Function IsAlive(host)
- Dim Status
- Dim WMI, oSelect
- Set WMI = GetObject("WinMgmts:{impersonationLevel=impersonate}!//" & "." & "/root/cimv2")
- Set oSelect = WMI.ExecQuery("SELECT * FROM Win32_PingStatus Where Address='" & host & "'")
- For Each Status In oSelect
- If IsNull(Status.StatusCode) Or Status.StatusCode <> 0 Then
- IsAlive = False
- Else
- IsAlive = True
- End If
- Next
- Set oSelect = Nothing
- Set WMI = Nothing
- End Function
Ответить
|
Номер ответа: 10 Автор ответа: cbh
Вопросов: 2 Ответов: 10
|
Профиль | | #10
|
Добавлено: 14.01.10 09:13
|
спасибо друг за помощь, но это немного не то...если бы такой вариант устроил бы заказчика я просто-напросто написал бы батник.Перебор по IP+заранее подготовить открытые шары, это не то.
Понимаешь конечная цель этой задачи, подготовить пользователя к автоматизации, а не автоматизировать. Поэтому файлы будут раскидываться по шарам, по которым привык ходить пользователь.
Я знаю, что все это бардак и жизнь тяжела, но задача такова. Нелегкая, но интересная))
Вариантов ее использования множество, представь что, после того как будет составлена карта сети, ты будешь мгновенно доставлять скопу юзеров нужные документы, независимо от того есть ли у них почта или интернет или нет. Независимо от того забудет он или нет, документ будет лежать у него.
Я знаю, что есть портальные решения SharePoint например, но здесь никто не даст на это денег.
Я так понимаю, что доработать скрипт, который я дал никак не получается? Он в принципе отлично выполняет первую часть нужного функционала, сканить сеть и выдает нужные и верные данные.
Надо подумать как этими данными/путями к шарам воспользоваться и копировать.
Ответить
|
Номер ответа: 11 Автор ответа: AxeL
ICQ: 264730390
Вопросов: 2 Ответов: 106
|
Профиль | | #11
|
Добавлено: 14.01.10 16:32
|
Я так понимаю, что доработать скрипт, который я дал никак не получается?
Получается... Лови свою доработанную версию...
- On Error Resume Next
-
- Set objNetwork = CreateObject("Shell.Application").NameSpace(&H12)
- Set objEntireNetwork = objNetwork.Items().Item("EntireNetwork").GetFolder
- For Each objNetItem In objEntireNetwork.Items()
- If objNetItem.Name = "Microsoft Windows Network" Then
- Set objMSWinNetwork = objNetItem.GetFolder
- Exit For
- End If
- Next
-
- For Each objMSNetItem In objMSWinNetwork.Items()
-
- Set objDomain = objMSNetItem.GetFolder
- For Each objDomainItem In objDomain.Items()
-
- Set objComputer = objDomainItem.GetFolder
- For Each objCompItem In objComputer.Items()
- If objCompItem.IsFileSystem Then
- Copy objDomainItem.Name, objCompItem.Name
-
- End If
- Next
- Next
- Next
-
- Sub Copy(host, share)
- Dim fso, sh, oWMI, oSelQ, file
- Dim Res
-
- On Error Resume Next
-
- Set fso = CreateObject("Scripting.FileSystemObject")
- Set sh = CreateObject("WScript.Shell")
- Set oWMI = GetObject("WinMgmts:{impersonationLevel=impersonate}!//./root/cimv2")
-
- Res = sh.Run("subst T: ""\\" & host & "\" & share & Chr(34), , True)
-
- Set oSelQ = oWMI.ExecQuery("SELECT * FROM CIM_DataFile WHERE Drive = 'C:' And Path = '\\Folder_Of_Files_For_Copy\\'")
-
- For Each file In oSelQ
- Res=file.Copy(fso.BuildPath("T:", file.FileName & "." & file.Extension))
- Next
-
- Res = sh.Run("subst T: /D", , True)
-
- Set oSelQ = Nothing
- Set oWmi = Nothing
- Set sh = Nothing
- Set fso = Nothing
-
- End Sub
Понимаешь конечная цель этой задачи, подготовить пользователя к автоматизации, а не автоматизировать. Поэтому файлы будут раскидываться по шарам, по которым привык ходить пользователь.
Значит этот скрипт - подготовка к автоматизации, а предыдущий автоматизация...
Я знаю, что все это бардак и жизнь тяжела, но задача такова. Нелегкая, но интересная))
юююнелегкая, но интересная жизнь садо-мазо...
Он в принципе отлично выполняет первую часть нужного функционала, сканить сеть и выдает нужные и верные данные.
получилось быстрее пинга даже (сравнивал)
Ответить
|
Номер ответа: 13 Автор ответа: AxeL
ICQ: 264730390
Вопросов: 2 Ответов: 106
|
Профиль | | #13
|
Добавлено: 15.01.10 08:07
|
Понимаешь конечная цель этой задачи, подготовить пользователя к автоматизации, а не автоматизировать. Поэтому файлы будут раскидываться по шарам, по которым привык ходить пользователь. Можно сделать следующее, чтобы несколько упорядочить бардак:
При первом проходе по шарам скопировать батник, в котором будет прописано создание шары например таким образом - net share share_name=c:\share_folder
C с помощью команды "net share" создается шара, всегда доступная для записи. После создания шары создать на рабочем столе и(или) в меню пуск ярлык к этой папке. Сказать об этом на собрании.- For Each file In oSelQ
- Res=file.Copy(fso.BuildPath("T:", file.FileName & "." & file.Extension))
- Next
переделать в - For Each file In oSelQ
- Res=file.Copy(fso.BuildPath("T:", file.FileName & "." & file.Extension))
- WriteLog(Res)
- Next
В процедуре WriteLog смотреть комп/шара/значение Res
1 - команда выполнена успешно, 2 - шара закрыта для записи или антивирь заблокировал конкретный файл(McAfee может блокировать inf и exe файлы ... хз что еще может быть
По результатам можно определить, на каких компах отсутствуют шары для записи...
Ответить
|
Страница: 1 | 2 |
Поиск по форуму