Четверг, 20 Апрель 2006 | (10487)
После побликации на сайте двух материалов о VB скриптах , Удаляем файлы через vbScript - и Version 1 и Version 2 , я получил письмо с интересными VB Скриптами (VB Scripts). Вот, что написал сам автор о своём скрипте:
Скрипт разработан для поиска и удаления расшаренных ресурсов, исключая системные.
Во время работы скрипта создается файл с расширением .log - в котором и есть нужная информация.
Скрипт обрабатывает только пингующиеся хосты, остальные пропускает.
Скрипт работает с применением технологии WMI, поэтому может
обрабатывать только Windows машины c WMI (2000, 2003, ХР). Не Windows
машины, или машины к которым не может быть получен доступ (не входящие
в домен, или за Firewall'ом) пропускаются c записью ошибки в файл с
расширением .Err. Скрипт может работать со списком исключений - это
файл должен называться ShareExcludeHostList.txt и содержать ip адрес
или имя компьютера, записанные построчно. Причём имя компьютера не
должно содержать доменных суффиксов, иначе сравнение имен не пройдёт и
имя не будет считаться исключенным. Регистр имен хостов значения не
имеет. В конце скрипта производится вызов внешней утилиты "Blat.exe" -
она отправляет сформированный лог на почту админу сети.
Если будете что-либо менять не забудьте поменять почтовые адреса и имя сервера в строке отправки предупреждения на на мыло.
Содержимое VBScript:
'
' Подпрограмма поиска и удаления расшаренных ресурсов компьютера
Sub FindDelete_Share(strComputer)
On Error Resume Next ' Продолжение работы скрипта при возникновении ошибки
Write_Flag_Share = False ' Флаг записи в лог инфорамции о шарах хоста
Err.Clear
Set colLocalGroups = objWMIService.ExecQuery("Select * From Win32_Group Where SID = 'S-1-5-32-544'")
If Err.Number <> 0 Then ErrorLogFile.WriteLine("Ошибка получения информации о локальных группах для хоста " & strComputer & " Ошибка: " & Err.Number & " Описание: " & Err.description) ' Если ошибка запись в лог ошибок
For Each LocalGroup in colLocalGroups
HostName = LocalGroup.Domain ' Присвоение имени хоста
Next
If In_ExcludeList(LCase(HostName)) Then Exit Sub ' Если хост находится в списке исключений, то пропускаем его
Text_for_Write = Time & " " & Date & vbTab & "Имя компьютера: " & HostName & vbTab & vbTab & "IP: " & strComputer & Chr(10) ' Запись имени компьютера
Text_for_Write_share = "Расшаренные пользователькие ресурсы:" & Chr(10) ' Запись заголовка раздела
Err.Clear
Set colShares = objWMIService.ExecQuery("Select * from Win32_Share") ' Получение списка всех расшаренных ресурсов
If Err.Number <> 0 Then ErrorLogFile.WriteLine("Ошибка получения списка расшаренных ресурсов для хоста " & strComputer & " Ошибка: " & Err.Number & " Описание: " & Err.description) ' Если ошибка запись в лог ошибок
For Each ShareItem in colShares ' Перебор списка локальных шар
If (ShareItem.Type = 0 And ShareItem.Name <> "print$") Then ' Если шара не системная и не принтер
DeleteShareText = "- удалена"
Err.Clear
ShareItem.Delete() ' Удаление текушей шары
If Err.Number <> 0 Then ' Если ошибка, запись в лог ошибок
ErrorLogFile.WriteLine("Ошибка удаления шары " & ShareItem.Name & " Ошибка: " & Err.Number & " Описание: " & Err.description) ' Если ошибка запись в лог ошибок
DeleteShareText = "- не удалена"
End If
Text_for_Write_share = Text_for_Write_share & "Имя шары: " & ShareItem.Name & vbTab & vbTab & "Путь: " & ShareItem.Path & vbTab & vbTab & DeleteShareText & Chr(10)
Write_Flag_Share = True ' Установка флага записи в лог информации о шарах
End If
Next ' Следующий элемент списка шар
If Write_Flag_Share Then LogFile.WriteLine(Text_for_Write & Text_for_Write_share) ' Запись в лог если найдены шары
End Sub ' Конец подпрограммы
Function HostPinging(Host_IP) ' Функция проверки пинга на хост
On Error Resume Next ' Продолжение работы скрипта при возникновении ошибки
HostPinging = True ' Возвращает ПРАВДУ, если пингуется
Set objPing = GetObject("winmgmts:{impersonationLevel=impersonate}").ExecQuery("select * from Win32_PingStatus where address = '" & Host_IP & "'")
For Each objStatus in objPing
If ( IsNull(objStatus.StatusCode) Or objStatus.StatusCode <> 0 ) Then HostPinging = False ' Возвращает ЛОЖЬ, если не пингуется
Next
End Function
Function In_ExcludeList(Host_Adress) ' Функция поиска хоста в списке исключений
On Error Resume Next ' Продолжение работы скрипта при возникновении ошибки
In_ExcludeList = False
For Each ExcludeHost In arrExcludeHostList
If ExcludeHost = Host_Adress Then
In_ExcludeList = True
Exit For
End If
Next
End Function
On Error Resume Next ' Продолжение работы скрипта при возникновении ошибки
Set wshShell = WScript.CreateObject("WScript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject") ' Создание объекта работы с файлами
strLogFileName = Replace(WScript.ScriptName, ".vbs", "") & "_" & Replace(Date, ".", "") & ".log"
Set LogFile = objFSO.OpenTextFile(strLogFileName, 8, True) ' Открытие нового лог файла для добавления
Set ErrorLogFile = objFSO.OpenTextFile(Replace(WScript.ScriptName, ".vbs", "") & "_" & Replace(Date, ".", "") & ".err", 8, True) ' Открытие нового лог файла для добавления
If objFSO.FileExists("ShareExcludeHostList.txt") Then ' Если существует файл со списком исключений, то
Set ExcludeFile = objFSO.OpenTextFile("ShareExcludeHostList.txt", 1)' Открытие файла со списком исключенных хостов
m = 0
Dim arrExcludeHostList() ' Обявление массива со списком исключений
Do Until ExcludeFile.AtEndOfStream ' Перебор всех строк файла исключений
Redim Preserve arrExcludeHostList(m)
arrExcludeHostList(m) = LCase(ExcludeFile.ReadLine) ' Присвоение строк элементам масива
m = m + 1
Loop
ExcludeFile.Close ' Закрыть файл
End If
For j = 100 to 108 ' Подсети с 100 по 108
For i = 1 to 254 ' Хосты с 1 по 254
HostIPAdress = "192.168." & j & "." & i ' Формирование IP Хоста
If ( Not In_ExcludeList(HostIPAdress) And HostPinging(HostIPAdress) ) Then ' Если хост пингуется и не находится в списке исключений, то связываемся с ним через WMI
Err.Clear
Set objWMIService = GetObject("winmgmts:\\" & HostIPAdress & "\root\cimv2") ' Связывание с WMI хоста
If Err.Number <> 0 Then ' Если ошибка, запись ошибки в лог и обработка следующего хоста
ErrorLogFile.WriteLine("Ошибка связи c WMI для хоста " & HostIPAdress & vbTab & "Описание: " & Err.description)
Else ' Иначе поиск админов и шар
Call FindDelete_Share(HostIPAdress)
End If
End If
Next ' Следующий хост в подсети
Next ' Следующая подсеть
LogFile.Close ' Закрыть лог файл
ErrorLogFile.Close ' Закрыть лог файл
Set objLogFile = objFSO.GetFile(strLogFileName)
If objLogFile.Size > 0 Then wshShell.Run "blat.exe "&strLogFileName&" -to LanMailAlert@my_domain.ru -f LanGuard@my_domain.ru -server mailsrv.my_domain.lan -subject "&Chr(34)&"LAN Shares changes"&Chr(34)&" -charset "&Chr(34)&"Windows-1251"&Chr(34),0,True
objLogFile.Delete
WScript.Quit 0 ' Завершение работы скрипта
|
Вы можете скчать этот скрипт в текстовом формате, только не забудьте переименовать файл, что бы у него было расширение VBS.
Скачать
|
Комментарии
2006-04-2822:48:48 А проверка If зачем перед приклеплением стоит ? Или там не все символы видны ?
2006-04-2822:45:40 Спасибо, буду знать.
Всегда есть чему поучиться у знающих людей.
2006-04-2810:03:29 Приветик!
Найди или у тебя наверняка есть "The Portable Script Center" от Microsofta. В нем есть скрипт оправки сообщения "Send Email without Installing the SMTP Service" если ты имел ввиду те параметры, то это настройка локального smtp сервера.
А вложене делается так:
If sEmailAttachment "" Then
objEmail.AddAttachment=sEmailAttachment
End If
2006-04-2806:56:28 И как вложение сделать по методу CDO.Message ?
2006-04-2806:54:34 Посмотрел я этот метод "CDO.Message" и не очень понял, а зачем там упоминается http ссылка на микрософт ? Он случайно не через Инет отправлять будет ?
2006-04-2612:44:53 С таким же успехом можно не использовать дополнительную утилиту для отправки письма с вложением, а использовать для отправки встроенные средства "CDO.Message". Тоже неплохо отрабатывает.
2006-04-2108:46:25 Спасибо, очень грамотный скрипт! Хорошо использовать, як, скелет для для многих операций. Например для замены пароля локальных админов или отключения firewall на XP.