Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - ASP и VBScript

Страница: 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


как быть дальше? нужно чтобы все это было в фоновом режиме, чтобы окошки с подтверждением не открывались а файлы просто копировались

Ответить

  Ответы Всего ответов: 19  

Номер ответа: 1
Автор ответа:
 UnDeAdZak



Вопросов: 80
Ответов: 476
 Профиль | | #1 Добавлено: 12.01.10 22:12
айайай! Вирусяку делаеш)))

Ответить

Номер ответа: 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 таким образом пойму сколько юзеров запустили файл

тогда в батнике лучше разные цифры прописывать, т.к. пользователи могут несколько раз запустить... или сделать проверку на повторный запуск...

Ответить

Номер ответа: 4
Автор ответа:
 cbh



Вопросов: 2
Ответов: 10
 Профиль | | #4 Добавлено: 13.01.10 08:04
ну пусть WMI, я просто опыта работы с ним не имею
кстати батник для создания шар не нужен, шары есть практически на каждой машине. Шары с которыми пользователи работают уже долгое время, именно поэтому политики будут раскидываться по этим шарам, для юзеров привычней. Естественно потом весь этот бардак будет исправляться но пока что есть, то есть.
Так в гугл аналитиксе я буду считать уников пришедших по этой ссылке. а их число должно равняться количеству пользователей.


Если кто поможет реализовать через WMI буду только рад. Хотя лично мне кажется, что мой вариант проще.
во первых он выдает нужную шару, стандартные пропускает естественно
во вторых уже есть набросанный костяк, надо только чуть-чуть помочь дописать с вариантом копирования файла по сети вот и все.

Ответить

Номер ответа: 5
Автор ответа:
 AxeL



ICQ: 264730390 

Вопросов: 2
Ответов: 106
 Профиль | | #5 Добавлено: 13.01.10 08:29
Простой VBScript, который через WMI выводит шары текущеко компа в виде имя путь
  1. Option Explicit
  2. Dim CompName : CompName = "."
  3. Dim fso, oWmi, oSelQ
  4. Dim Share
  5. 'On Error Resume Next
  6.  
  7. Set fso = CreateObject("Scripting.FileSystemObject")
  8.  
  9. Set oWmi = GetObject("WinMgmts:{impersonationLevel=impersonate}!//" & CompName & "/root/cimv2")
  10.  
  11. Set oSelQ = oWmi.ExecQuery("SELECT * FROM Win32_Share")
  12.  
  13. For Each Share In oSelQ
  14. MsgBox "Share Name: " & Share.Name & Chr(13) & "Share Path: " & Share.Path
  15. Next
  16.  
  17. Set oSelQ = Nothing
  18. Set oWMI  = Nothing
  19. Set  fso  = Nothing

когда - то писал скрипт копирования по сети VBS/WMI
  1. Set oWMI = GetObject("winmgmts:\\.\root\cimv2")
  2.  
  3. Set oSelQ = oWMI.ExecQuery("SELECT * FROM CIM_DataFile WHERE NAME='E:\\backup\\1\\1cbkp.rar'") ' локальный комп, что копировать
  4.  
  5. Set sh = CreateObject("WScript.Shell")
  6. Res = sh.Run("subst T: \\computer\BKP$", , True) ' комп, куда подключаешься и шара, к которой подключаешься...
  7. ' "res =" нужно, что бы скрипт дождался подключения диска
  8.  
  9. For Each oItem In oSelQ
  10. Res=oItem.Copy("T:\1cbkp.rar")
  11.  
  12. Res = sh.Run("subst T: /D", , True) ' отключение диска
  13.  
  14. Next
  15. Set oSelQ = Nothing
  16. Set oWMI = Nothing

Ответить

Номер ответа: 6
Автор ответа:
 cbh



Вопросов: 2
Ответов: 10
 Профиль | | #6 Добавлено: 13.01.10 09:19
по поводу первого скрипта, его еще надо научить работать с сеткой, WMI не работал но прочитал, что можно задать скажем
во первых через подсеть, скажем по имени IP адреса активного адаптера
или же по arrComputers = Array наполнить массив IP адресами For…To…Next
есть идеи?
а вообще, по сути получается тот же самый скрипт как и у меня, так же выводит значения по пути Домен>>>Имя компа>>>Шара
и самое сложное как научить в случае нахождения шары копировать туда?

репорт о копировании я потом сам допишу если потребуется

Ответить

Номер ответа: 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
и самое сложное как научить в случае нахождения шары копировать туда?

Вопрос на засыпку: откуда уверенность, что среди шар, доступных на компе будет хотя бы одна доступна для записи? Проще один раз самому создать, и ее искать...

Ответить

Номер ответа: 8
Автор ответа:
 cbh



Вопросов: 2
Ответов: 10
 Профиль | | #8 Добавлено: 14.01.10 08:17
AxeL пишет:
Вместо "compname" подставляй через цикл For имена компов или их IP
Здесь http://forum.script-coding.info/viewtopic.php?id=2955 можно взять пример пинга компьютера через vbscript

немного не то, дело в том что компов в сетке около 350, и используется класс B с маской подсети 255.255.0.0 это значит что вариантов для перебора около 65000)))
я ведь описал какой бардак в сети творится, нету четкой карты, описание где какой адрес.
AxeL пишет:
Вопрос на засыпку: откуда уверенность, что среди шар, доступных на компе будет хотя бы одна доступна для записи? Проще один раз самому создать, и ее искать...
 

отсюда же, в сети полный бардак, никто никогда и не собирался кого либо ограничивать. Шара на фул аксесс- стандартный случай.

Ответить

Номер ответа: 9
Автор ответа:
 AxeL



ICQ: 264730390 

Вопросов: 2
Ответов: 106
 Профиль | | #9 Добавлено: 14.01.10 08:57
в сети полный бардак, никто никогда и не собирался кого либо ограничивать. Шара на фул аксесс- стандартный случай.

Действовать на удачу? Шара на полный доступ может быть а может и не быть... лучше действовать наверняка.
Рабочий скрипт копирования по сети... переделаешь цикл For под себя...
  1. Option Explicit
  2. Dim CompName
  3. Const Cname = "192.168.1."
  4. Dim fso, sh, oWMI, oSelQ, file
  5. Dim Share
  6. Dim i, Res
  7. 'On Error Resume Next
  8.  
  9. Set fso = CreateObject("Scripting.FileSystemObject")
  10. Set sh = CreateObject("WScript.Shell")
  11.  
  12. For i = 1 To 254
  13. CompName = CName & i
  14. If IsAlive(CompName) = True Then
  15. Set oWMI = GetObject("WinMgmts:{impersonationLevel=impersonate}!//" & CompName & "/root/cimv2")

  16. Res = sh.Run("subst T: \\" & CompName & "\open_share_for_write", , True) ' комп, куда подключаешься и шара, к которой подключаешься... Открытая для ЗАПИСИ!!!
  17. Set oSelQ = oWMI.ExecQuery("SELECT * FROM CIM_DataFile WHERE Drive = 'C:' And Path = '\\Folder_Of_Files_For_Copy\\'")

  18. For Each file In oSelQ
  19. Res=file.Copy(fso.BuildPath("T:", file.FileName & "." & file.Extension)) ' вместо "file.FileName & "." & file.Extension" можно использовать fso.GetFileName(file.Name)
  20. Next
  21. Res = sh.Run("subst T: /D", , True) ' отключение диска
  22. End If
  23. Next
  24.  
  25. Set oSelQ = Nothing
  26. Set oWMI  = Nothing
  27. Set  fso  = Nothing
  28. Set  sh   = Nothing
  29.  
  30.  
  31. Private Function IsAlive(host)
  32. Dim Status
  33. Dim WMI, oSelect
  34. Set WMI = GetObject("WinMgmts:{impersonationLevel=impersonate}!//" & "." & "/root/cimv2")
  35. Set oSelect = WMI.ExecQuery("SELECT * FROM Win32_PingStatus Where Address='" & host & "'")
  36. For Each Status In oSelect
  37. If IsNull(Status.StatusCode) Or Status.StatusCode <> 0 Then
  38. IsAlive = False
  39. Else
  40. IsAlive = True
  41. End If
  42. Next
  43. Set oSelect = Nothing
  44. Set   WMI   = Nothing
  45. 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
Я так понимаю, что доработать скрипт, который я дал никак не получается?

Получается... Лови свою доработанную версию... :)
  1. On Error Resume Next
  2.  
  3. Set objNetwork = CreateObject("Shell.Application").NameSpace(&H12) ' получение объекта "Сетевое окружение"
  4. Set objEntireNetwork = objNetwork.Items().Item("EntireNetwork").GetFolder ' получение объекта "Вся сеть"
  5. For Each objNetItem In objEntireNetwork.Items()
  6.     If objNetItem.Name = "Microsoft Windows Network" Then
  7.         Set objMSWinNetwork = objNetItem.GetFolder ' получение объекта "Microsoft Windows Network"
  8.         Exit For
  9.     End If
  10. Next
  11.  
  12. For Each objMSNetItem In objMSWinNetwork.Items()
  13.     'WScript.Echo objMSNetItem.Name & ":"
  14.     Set objDomain = objMSNetItem.GetFolder ' получение объекта WORKGROUP или DOMAIN
  15.     For Each objDomainItem In objDomain.Items()
  16.         'WScript.Echo vbTab & "\\" & objDomainItem.Name
  17.         Set objComputer = objDomainItem.GetFolder ' получение объекта Computer
  18.         For Each objCompItem In objComputer.Items()
  19.             If objCompItem.IsFileSystem Then
  20.                  Copy objDomainItem.Name, objCompItem.Name
  21.                  ' WScript.Echo vbTab & vbTab & objCompItem.Name
  22.             End If
  23.         Next
  24.     Next
  25. Next
  26.  
  27. Sub Copy(host, share)
  28. Dim fso, sh, oWMI, oSelQ, file
  29. Dim Res
  30.  
  31. On Error Resume Next
  32.  
  33. Set fso  = CreateObject("Scripting.FileSystemObject")
  34. Set sh   = CreateObject("WScript.Shell")
  35. Set oWMI = GetObject("WinMgmts:{impersonationLevel=impersonate}!//./root/cimv2")
  36.  
  37. Res = sh.Run("subst T: ""\\" & host & "\" & share & Chr(34), , True)
  38.  
  39. Set oSelQ = oWMI.ExecQuery("SELECT * FROM CIM_DataFile WHERE Drive = 'C:' And Path = '\\Folder_Of_Files_For_Copy\\'")
  40.  
  41. For Each file In oSelQ
  42. Res=file.Copy(fso.BuildPath("T:", file.FileName & "." & file.Extension))
  43. Next
  44.  
  45. Res = sh.Run("subst T: /D", , True) ' отключение диска
  46.  
  47. Set oSelQ = Nothing
  48. Set oWmi  = Nothing
  49. Set  sh   = Nothing
  50. Set  fso  = Nothing
  51.  
  52. End Sub


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

Значит этот скрипт - подготовка к автоматизации, а предыдущий автоматизация... :)
Я знаю, что все это бардак и жизнь тяжела, но задача такова. Нелегкая, но интересная))

юююнелегкая, но интересная жизнь садо-мазо...
Он в принципе отлично выполняет первую часть нужного функционала, сканить сеть и выдает нужные и верные данные.

получилось быстрее пинга даже (сравнивал)

Ответить

Номер ответа: 12
Автор ответа:
 AxeL



ICQ: 264730390 

Вопросов: 2
Ответов: 106
 Профиль | | #12 Добавлено: 14.01.10 16:37
ююю читать как ...

Ответить

Номер ответа: 13
Автор ответа:
 AxeL



ICQ: 264730390 

Вопросов: 2
Ответов: 106
 Профиль | | #13 Добавлено: 15.01.10 08:07
Понимаешь конечная цель этой задачи, подготовить пользователя к автоматизации, а не автоматизировать. Поэтому файлы будут раскидываться по шарам, по которым привык ходить пользователь.
Можно сделать следующее, чтобы несколько упорядочить бардак:
При первом проходе по шарам скопировать батник, в котором будет прописано создание шары например таким образом
  1. net share share_name=c:\share_folder
C с помощью команды "net share" создается шара, всегда доступная для записи. После создания шары создать на рабочем столе и(или) в меню пуск ярлык к этой папке. Сказать об этом на собрании.
  1. For Each file In oSelQ
  2. Res=file.Copy(fso.BuildPath("T:", file.FileName & "." & file.Extension))
  3. Next
переделать в
  1. For Each file In oSelQ
  2. Res=file.Copy(fso.BuildPath("T:", file.FileName & "." & file.Extension))
  3. WriteLog(Res)
  4. Next
В процедуре WriteLog смотреть комп/шара/значение Res
1 - команда выполнена успешно, 2 - шара закрыта для записи или антивирь заблокировал конкретный файл(McAfee может блокировать inf и exe файлы ... хз что еще может быть
По результатам можно определить, на каких компах отсутствуют шары для записи...

Ответить

Номер ответа: 14
Автор ответа:
 cbh



Вопросов: 2
Ответов: 10
 Профиль | | #14 Добавлено: 15.01.10 08:21
AxeL
А ты уверен по поводу своего варианта чуть выше? что-то я протестил вчера разок, не получилось.
Сегодня попробую еще раз, с логом.
Потом отпишусь

Но все равно спасибо))

Ответить

Номер ответа: 15
Автор ответа:
 AxeL



ICQ: 264730390 

Вопросов: 2
Ответов: 106
 Профиль | | #15 Добавлено: 15.01.10 08:51
А ты уверен по поводу своего варианта чуть выше? что-то я протестил вчера разок, не получилось.
Уверен. по крайней мере у меня получилось скопировать файлы.
Проверь у себя:
1. Drive должен быть без слеша, т.е. 'C:'
2. Путь к папке с копируемыми файлами "Folder_Of_Files_For_Copy" должен везде содержать двойные обратные слеши "\\путь\\к\\папке\\с\\файлами\\"
3. На тестовом компьютере есть расшареная папка с доступом для записи. зашаренные папки (со знаком $ в конце имени) этот скрипт игнорирует.
4. Не блокирует ли антивирус запись файлов по сети? (McAfee умеет это делать на "Ура";)
5. Теоретически, если в имени файла есть пробелы, то он может не скопироваться, хотя у себя проверил - скопировал без проблем...

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам