Примеры скриптов для администрирования

23.01.2014
Содержание
  1. Копирование файла на рабочий стол пользователя
  2. Удаление сервиса
  3. Добавление учетной записи в группу администраторов компьютера
  4. Сжатие папки и отправка архива по почте
  5. Удаление устаревших временных файлов
  6. Получение пользователей, групп и компьютеров из Active Directory
  7. Замена слова во всех файлах директории
  8. Выполнение команды на удаленном компьютере
  9. Вычисление подсети по IP-адресу и маске
Копирование файла на рабочий стол пользователя

Назначение сценария - скопировать на рабочий стол всех пользователей организации файл. Скрипт выполняется при загрузке компьютера через Logon Script (через доменную политику) или с помощью System Management Server (он же System Center Configuration Manager).

Использование скрипта: в папку со скриптом скопировать файл, который нужно распространить среди пользователей, в теле сценария заменитьMySite.urlна имя скопированного файла.

' === Script Information Header ===
' Script Name: CopyFile.vbs
' Date:        18.10.09
' Author:      Виталий Бочкарев
' Description: Скрипт копирования файла на рабочий стол пользователя

' === Initialization Block ===
Option Explicit
Dim sAllUsersProfile
Dim oShell, oFSO

' === Script Main Logic ===
' Создание объекта оболочки
Set oShell = CreateObject("WScript.Shell")
' Создание объекта файловой системы
Set oFSO = CreateObject("Scripting.Filesystemobject")
' Получение пути к общему профилю
sAllUsersProfile = oShell.ExpandEnvironmentStrings("%ALLUSERSPROFILE%")
' Проверка существования файла
If oFSO.FileExists(sAllUsersProfile & "\Desktop\MySite.url") = False Then
   ' Копирование файла из рабочей директории на рабочий стол пользователя
   Call oFSO.CopyFile(oShell.CurrentDirectory & "\MySite.url",_
     sAllUsersProfile & "\Desktop\", True)
End If
Удаление сервиса

Назначение сценария - удалить сервис из системы.

Использование сценария: в строкеsServiceName = "ExampleService"заменитьExampleServiceна имя удаляемого сервиса.

' === Script Information Header ===
' Script Name: DeleteService.vbs
' Date:        18.10.09
' Author:      Виталий Бочкарев
' Description: Скрипт удаления сервиса

' === Initialization Block ===
Option Explicit
On Error Resume Next
Dim sComputer, sServiceName
Dim oShell, oFSO, oWMIService, colListOfServices, oService

' ==== Script Main Logic ====
' Создание объекта оболочки
Set oShell = CreateObject("WScript.Shell")
' Создание объекта файловой системы
Set oFSO = CreateObject("Scripting.Filesystemobject")
' Имя компьютера, где надо удалить сервис
sComputer = "."
' Имя сервиса для удаления
sServiceName = "ExampleService"
' Подключение к WMI компьютера
Set oWMIService = GetObject("winmgmts:\\" & sComputer & "\root\cimv2")
' Получение коллекции сервисов
Set colListOfServices = oWMIService.ExecQuery ("SELECT * FROM Win32_BaseService " _
 & "WHERE Name LIKE '" & sServiceName & " '")
' Удаление сервисов, попавших в выборку
For Each oService in colListOfServices
   oService.StopService()
   WScript.Sleep 5000
   oService.Delete()
   WScript.Sleep 3000
Next
Добавление учетной записи в группу администраторов компьютера

Назначение сценария - добавить учетную запись в группу локальных администраторов компьютера.

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

Примечание. Сценарий работает только на англоязычной версии Windows, для русскоязычных версий, возможно, потребуется изменение тела сценария (написать имя группы администраторов на русском языке).
' === Script Information Header ===
' Script Name: AddToAdmins.vbs
' Date:        18.10.09
' Author:      Виталий Бочкарев
' Description: Скрипт добавления учетной записи в группу администраторов компьютера

' === Initialization Block ===
Option Explicit
On Error Resume Next
Dim sComputer, mArg, mAccount, mFlag, mGroup, CurrentUser
Dim oShell, oFSO, oWMIService, colListOfServices, oService

' ==== Script Main Logic ====
' Получение аргументов командной строки
Set mArg = Wscript.Arguments
If mArg.count = 1 Then
   mAccount = mArg(0)
Else
   Wscript.Echo "Использование:" & vbCrLf & _
       "  AddAccountToAdmins.vbs Account" & vbCrLf & _
       vbCrLf & _
       "Пример:" & vbCrLf & _
       "  AddAccountToAdmins.vbs ""DOMAIN\ACCOUNT""" & vbCrLf & _
       "  добавляет указанную учетную записть в группу локальных администраторов компьютера"
   Wscript.Quit
End If
' Имя компьютера, где надо удалить сервис
sComputer = "."
' Флаг наличия учетной записи в группе администраторов
mFlag = False
' Подготовка учетной записи к добавлению в группу администраторов
mAccount = Replace(mAccount,"\","/")
mAccount = "WinNT://" & mAccount
' Подключение к группе администраторов компьютера
Set mGroup = GetObject("WinNT://" & sComputer & "/Administrators,group")
' Проверка наличия учетной записи в группе администраторов
For Each CurrentUser in mGroup.Members
   If CurrentUser.ADsPath = mAccount Then mFlag = True
Next
' Добавление учетной записи в группу администраторов компьютера
If mFlag = False then mGroup.Add(mAccount)
Сжатие папки и отправка архива по почте

Назначение сценария - отправить администратору архив файлов журнала.

Использование сценария: скопировать в папку скрипта архиватор 7z, в теле сценария указать папку для сжатия (mFolderToCompress), адрес отправителя (mFrom), адрес получателя (mTo), тему сообщения (mSubject), текст сообщения (mTextBody), почтовый сервер (mSMTPServer), SMTP порт почтового сервера (mSMTPport).

' === Script Information Header ===
' Script Name: SendArchive.vbs
' Date:        19.10.09
' Author:      Виталий Бочкарев
' Description: Скрипт сжатия папки и отправки архива по почте

' === Initialization Block ===
Option Explicit
On Error Resume Next
Dim mWorkDir, mCommand
Dim oShell, oFSO, oEmail
Const mFolderToCompress = "C:\Test Folder\*"
Const mArhiveName = "Attachment.zip"
Const mFrom = "script@domain.com"
Const mTo = "user@domain.com"
Const mSubject = "Letter Subject"
Const mTextBody = "Look the attachment."
Const mSMTPServer = "mail.domain.com"
Const mSMTPport = 25

' ==== Script Main Logic ====
' Создание объекта оболочки
Set oShell = CreateObject("WScript.Shell")
' Создание объекта файловой системы
Set oFSO = CreateObject("Scripting.Filesystemobject")
' Создание объекта почтового сообщения
Set oEmail = CreateObject("CDO.Message")
' Получение рабочей директории скрипта
mWorkDir = Left(WScript.ScriptFullName,Len(WScript.ScriptFullName)-Len(WScript.ScriptName))
' Составление команды для упаковки указанной директории
mCommand = """" & mWorkDir & "7z.exe""" & " a -y " & """" & mWorkDir & mArhiveName _
 & """ """ & mFolderToCompress & """"
' Упаковка директории
Call oShell.Run(mCommand, 0, True)
' Составление почтового сообщения
oEmail.From = mFrom
oEmail.To = mTo
oEmail.Subject = mSubject
oEmail.Textbody = mTextBody
' Прикрепление архива к сообщению
Call oEmail.AddAttachment(mWorkDir & mArhiveName)
' Настройка почтового канала
oEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/" & _
 "cdo/configuration/sendusing") = 2
oEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/" & _
 "cdo/configuration/smtpserver") = mSMTPServer
oEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/" & _
 "cdo/configuration/smtpserverport") = mSMTPport
oEmail.Configuration.Fields.Update
' Отправка сообщения
oEmail.Send
WScript.Sleep 300
' Удаление архива
Call oFSO.DeleteFile(mWorkDir & mArhiveName, True)
Удаление устаревших временных файлов

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

Использование сценария: в теле скрипта указать время в днях, после которого файл считается устаревшим (PurgeTime), профили-исключения, которые не нужно обрабатывать (aExceptions), и папку-карантин антивируса (sQuarantine), после работы сценария во временной папке Windows будет создан файл-отчет.

' === Script Information Header ===
' Script Name: PurgeTemp.vbs
' Date:        18.10.09
' Author:      Виталий Бочкарев
' Description: Скрипт удаления устаревших временных файлов

' === Initialization Block ===
Option Explicit
On Error Resume Next
Dim aExceptions(3)
Dim sProgramFiles, sWinDir, sWinTempFolder, sDocuments, sLogFileName, sQuarantine
Dim bFlag, sException
Dim oShell, oFSO, oLogFile, oDocuments, colProfiles, oProfile
Const PurgeTime = 14

' ==== Script Main Logic ====
' Создание объекта оболочки
Set oShell = CreateObject("WScript.Shell")
' Создание объекта файловой системы
Set oFSO = CreateObject("Scripting.Filesystemobject")
' Исключения - профили пользователей, которые не должны обрабатываться
aExceptions(0) = "Default User"
aExceptions(1) = "LocalService"
aExceptions(2) = "NetworkService"
aExceptions(3) = "All Users"
' Определение путей служебных папок
sProgramFiles = oShell.ExpandEnvironmentStrings("%ProgramFiles%")
sWinDir = oShell.ExpandEnvironmentStrings("%WinDir%")
sWinTempFolder = sWinDir & "\Temp"
sDocuments = "C:\Documents and Settings"
' Создание фурнала работы сценария
sLogFileName = sWinTempFolder & "\PurgeTemp_" & Date
sLogFileName = Replace(sLogFileName, ".", "_")
sLogFileName = Replace(sLogFileName, "/", "_")
Set oLogFile = oFSO.CreateTextFile(sLogFileName & ".log",true)
oLogFile.WriteLine "========== Start purging =========="
' Очистка временной папки Windows
oLogFile.WriteLine vbCrLf & "========== Windows Temporary folder =========="
PurgeFolder(sWinTempFolder)
' Очистка временной папки профиля пользователя и файлов Интернет
oLogFile.WriteLine vbCrLf & _
 "========== Users Temporary folder and Users Temporary Internet Files =========="
Set oDocuments = oFSO.GetFolder(sDocuments)
Set colProfiles = oDocuments.SubFolders
For Each oProfile In colProfiles
   bFlag = false
   For Each sException in aExceptions
       if InStr(oProfile.Path,sException) > 0 then
       bFlag = true
           exit for
       end if
   Next
   If bFlag = False Then
       PurgeFolder(oProfile.Path & "\Local Settings\Temp")
       PurgeFolder(oProfile.Path & "\Local Settings\Temporary Internet Files")
   End If
Next
' Очистка карантина NOD32
oLogFile.WriteLine vbCrLf & "========== NOD32 Quarantine =========="
sQuarantine = sProgramFiles & "\Eset\Infected"
PurgeFolder(sQuarantine)
' Закрытие файла журнала
oLogFile.WriteLine vbCrLf & "========== Stop purging =========="
oLogFile.Close

' === Functions and Procedures ===
' Процедура PurgeFolder - удаление старых файлов
Sub PurgeFolder(sFolderPath)
   Dim oFolder, colFiles, oFile, colSubFolders, oSubFolder
   ' Создание объекта Folder
   Set oFolder = oFSO.GetFolder(sFolderPath)
   ' Получение коллекции файлов
   Set colFiles = oFolder.Files
   ' Обработка каждого файла из коллекции
   For each oFile in colFiles
       ' Проверка, является ли файл устаревшим
       If (Date-oFile.DateLastModified) > PurgeTime and (Date-oFile.DateCreated) > _
         PurgeTime Then
           ' Запись сообщения в журнал сценария
           oLogFile.Writeline oFile.Path & vbTab & oFile.DateCreated
           ' Удаление устаревшего файла
           oFSO.DeleteFile oFile.Path, True
           ' Проверка на наличие ошибок
           if err.Number <> 0 then
               ' Запись сообщения об ошибке в журнал сценария
               oLogFile.Writeline "-----> Error # " & CStr(Err.Number) _
                 & " " & Err.Description
               ' Очистка ошибки
               Err.Clear
           end if
           ' Пауза в 20 милисекунд
           WScript.Sleep 20
       End if
   Next
   ' Получение коллекции подпапок
   Set colSubFolders = oFolder.SubFolders
   ' Обработка каждой подпапки
   For Each oSubFolder In colSubFolders
       ' Рекурсивный вызов процедуры удаления старых файлов - подпрограмма вызывает
       ' сама себя
       PurgeFolder(oSubFolder.Path)
       ' Проверка размера папки
       If oSubFolder.Size = 0 Then
           ' Запись сообщения в журнал сценария
           oLogFile.Writeline oSubFolder.Path & vbTab & oSubFolder.DateCreated
           ' Удаление пустой папки
           oFSO.DeleteFolder oSubFolder.Path
           ' Проверка на наличие ошибок
           If err.Number <> 0 then
               ' Запись сообщения об ошибке в журнал сценария
               oLogFile.Writeline "-----> Error # " & CStr(Err.Number) _
                 & " " & Err.Description
               ' Очистка ошибки
               Err.Clear
           End if
       End if
   Next
End Sub
Получение пользователей, групп и компьютеров из Active Directory

Назначение сценария - получить выгрузку пользователей, компьютеров и групп из Active Directory.

Использование сценария: в теле скрипта указать контейнеры, где хранятся объекты учетных записей пользователей, компьютеров и групп (oADCommand.CommandText), после работы сценария будут созданы три файла с выгруженной информацией, которые удобно читать в Excell.

' === Script Information Header ===
	' Script Name: GetADObjects.vbs
	' Date:        19.10.09
	' Author:      Виталий Бочкарев
	' Description: Скрипт получения пользователей, групп и компьютеров из Active Directory
	' === Initialization Block ===
	
	Const ADS_UF_ACCOUNTDISABLE             = &H00000002
	Const ADS_GROUP_TYPE_GLOBAL_GROUP       = &H2
	Const ADS_GROUP_TYPE_DOMAIN_LOCAL_GROUP = &H4
Const ADS_GROUP_TYPE_UNIVERSAL_GROUP    = &H8
Const ADS_GROUP_TYPE_SECURITY_ENABLED   = &H80000000

Dim aTemp()
' === Script Main Logic ===

mWorkDir = Left(WScript.ScriptFullName,Len(WScript.ScriptFullName)-Len(WScript.ScriptName))

' Создание объекта оболочки
Set oShell = CreateObject("WScript.Shell")
' Создание объекта файловой системы
Set oFSO = CreateObject("Scripting.Filesystemobject")
' Создание объекта соединения с Active Directory
Set oADConection = CreateObject("ADODB.Connection")
' Создание объекта команд запроса к Active Directory
Set oADCommand = CreateObject("ADODB.Command")
' Открытие соединения с Active Directory
oADConection.Provider = "ADsDSOObject"
oADConection.Open
oADCommand.ActiveConnection = oADConection
' Составление команды для получения пользователей
oADCommand.CommandText = "<LDAP://CN=Users,DC=domain,DC=com>;" & _
 "(objectClass=user);samAccountName,userPrincipalName,displayName," & _
 "name,sn,GivenName,MiddleName,initials,company,department,title," & _
 "telephoneNumber,otherTelephone,facsimileTelephoneNumber," & _
 "otherFacsimileTelephoneNumber,mail,mailNickname,info," & _
 "physicalDeliveryOfficeName,roomNumber,memberOf,ScriptPath," & _
 "HomeDirectory,HomeDrive,ProfilePath;SubTree"
' Выполнение команды получения пользователей
Set oUsers = oADCommand.Execute()
iCounter = 0
ReDim aTemp(0)
' Обработка полученных данных
Do Until oUsers.EOF
   ReDim Preserve aTemp(iCounter)
   aTemp(iCounter) = oUsers("samAccountName") & vbTab _
     & oUsers("userPrincipalName") & vbTab _
     & oUsers("displayName") & vbTab _
     & oUsers("name") & vbTab _
     & oUsers("sn") & vbTab _
     & oUsers("GivenName") & vbTab _
     & oUsers("MiddleName") & vbTab _
     & oUsers("initials") & vbTab _
     & oUsers("company") & vbTab _
     & oUsers("department") & vbTab _
     & oUsers("title") & vbTab _
     & oUsers("telephoneNumber") & vbTab _
     & oUsers("facsimileTelephoneNumber") & vbTab _
     & oUsers("otherFacsimileTelephoneNumber") & vbTab _
     & oUsers("mail") & vbTab _
     & oUsers("mailNickname") & vbTab _
     & oUsers("info") & vbTab _
     & oUsers("physicalDeliveryOfficeName") & vbTab _
     & oUsers("roomNumber") & vbTab _
     & oUsers("ScriptPath") & vbTab _
     & oUsers("HomeDirectory") & vbTab _
     & oUsers("HomeDrive") & vbTab _
     & oUsers("ProfilePath") & vbCrLf
   oUsers.MoveNext
   iCounter = iCounter + 1
Loop
' Сортировка массива пользователей
Call SortArray(aTemp)
' Составление выходного файла
mUsers ="samAccountName" & vbTab & _
 "userPrincipalName" & vbTab & _
 "displayName" & vbTab & _
 "name" & vbTab & _
 "sn" & vbTab & _
 "GivenName" & vbTab & _
 "MiddleName" & vbTab & _
 "initials" & vbTab & _
 "company" & vbTab & _
 "department" & vbTab & _
 "title" & vbTab & _
 "telephoneNumber" & vbTab & _
 "facsimileTelephoneNumber" & vbTab & _
 "otherFacsimileTelephoneNumber" & vbTab & _
 "mail" & vbTab & _
 "mailNickname" & vbTab & _
 "info" & vbTab & _
 "physicalDeliveryOfficeName" & vbTab & _
 "roomNumber" & vbTab & _
 "ScriptPath" & vbTab & _
 "HomeDirectory" & vbTab & _
 "HomeDrive" & vbTab & _
 "ProfilePath" & vbCrLf
For iCounter = 0 To UBound(aTemp)
   mUsers = mUsers & aTemp(iCounter)
Next
' Составление команды для получения компьютеров
oADCommand.CommandText = "<LDAP://CN=Computers,DC=domain,DC=com>;" & _
 "(objectClass=Computer);name,operatingSystem,useraccountcontrol;SubTree"
' Выполнение команды получения компьютеров
Set oComputers = oADCommand.Execute()
iCounter = 0
ReDim aTemp(0)
' Обработка полученных данных
Do Until oComputers.EOF
   ReDim Preserve aTemp(iCounter)
   aTemp(iCounter) = oComputers("name") & vbTab _
     & oComputers("operatingSystem") & vbTab
   If Hex(oComputers("UserAccountControl")) and ADS_UF_ACCOUNTDISABLE then
     aTemp(iCounter) = aTemp(iCounter) & "Disabled" & vbCrLf
   Else
       aTemp(iCounter) = aTemp(iCounter) & "Enabled" & vbCrLf
   End If
   oComputers.MoveNext
   iCounter = iCounter + 1
Loop
' Сортировка массива компьютеров
Call SortArray(aTemp)
' Составление выходного файла
mComputers = "Name" & vbTab & _
 "Operating System" & vbTab & _
 "Status" & vbCrLf
For iCounter = 0 To UBound(aTemp)
   mComputers = mComputers & aTemp(iCounter)
Next
' Составление команды для получения групп
oADCommand.CommandText = "<LDAP://CN=Users,DC=domain,DC=com>;" & _
 "(objectClass=group);name,member,memberOf;SubTree"
' Выполнение команды получения групп
Set oGroups = oADCommand.Execute()
iCounter = 0
ReDim aTemp(0)
' Обработка полученных данных
Do until oGroups.EOF
   ReDim Preserve aTemp(iCounter)
   aTemp(iCounter) = aTemp(iCounter) & oGroups("name") & vbCrLf
   aTemp(iCounter) = aTemp(iCounter) & vbTab & "Members:" & vbCrLf
   aMembers = oGroups("member")
   If Not IsNull(aMembers) Then
       For iMember = 0 To UBound(aMembers)
           aTemp(iCounter) = aTemp(iCounter) & vbTab & vbTab & Mid(aMembers(iMember), _
             4,InStr(aMembers(iMember),",")-4) & vbCrLf
       Next
   End if
   aTemp(iCounter) = aTemp(iCounter) & vbTab & "Member of:" & vbCrLf
   aMembers = oGroups("memberOf")
   If Not IsNull(aMembers) Then
       For iMember = 0 To UBound(aMembers)
           aTemp(iCounter) = aTemp(iCounter) & vbTab & vbTab & Mid(aMembers(iMember), _
             4,InStr(aMembers(iMember),",")-4) & vbCrLf
       Next
   End if
   aTemp(iCounter) = aTemp(iCounter) & vbCrLf
   oGroups.MoveNext
   iCounter = iCounter + 1
Loop
' Сортировка массива групп
Call SortArray(aTemp)
' Составление выходного файла
For iCounter = 0 To UBound(aTemp)
   mGroups = mGroups & aTemp(iCounter)
Next
' Запись результатов в файлы
Set oOutFile1 = oFSO.CreateTextFile(mWorkDir & "\" & "Users.txt",1)
Set oOutFile2 = oFSO.CreateTextFile(mWorkDir & "\" & "Computers.txt",1)
Set oOutFile3 = oFSO.CreateTextFile(mWorkDir & "\" & "Groups.txt",1)
oOutFile1.Write mUsers
oOutFile2.Write mComputers
oOutFile3.Write mGroups
oOutFile1.Close
oOutFile2.Close
oOutFile3.Close

' === Functions and Procedures ===
' Процедура сортировки массива
Sub SortArray(byref arrNames)
   For i = (UBound(arrNames) - 1) to 0 Step -1
       For j= 0 to i
           If UCase(arrNames(j)) > UCase(arrNames(j+1)) Then
               strHolder = arrNames(j+1)
               arrNames(j+1) = arrNames(j)
               arrNames(j) = strHolder
           End If
       Next
   Next
End Sub
Замена слова во всех файлах директории

Назначение сценария - заменить слова в тексте всех htm- и html-файлов, находящихся в указанной директории.

Использование сценария: в теле скрипта указать путь к папке, где хранятся файлы для обработки (sFolder), слово, которое нужно найти, (sFindText) и слово, на которое нужно сделать замену, (sReplaceText). После работы сценария во всех файлах htm и html указанное слово будет заменено на требуемое.

' === Script Information Header ===
' Script Name: TextReplacement.vbs
' Date:        24.02.10
' Author:      Виталий Бочкарев
' Description: Скрипт замены слова во всех файлах директории
' === Initialization Block ===

Const ForReading   = 1
Const ForWriting   = 2
Const ForAppending = 8

Const TristateUseDefault = -2
Const TristateTrue       = -1
Const TristateFalse      =  0

Const sFolder      = "\\Server\Resource\Folder"
Const sFindText    = "Server01"
Const sReplaceText = "Server02"

Dim ChangeCounter

' === Script Main Logic ===
' Создание объекта оболочки
Set oShell = CreateObject("WScript.Shell")
' Создание объекта файловой системы
Set oFSO = CreateObject("Scripting.Filesystemobject")
' Вызов процедуры замены слов
Call TextReplacement(sFolder, sFindText, sReplaceText)
' Вывод на экран количества обработанных файлов
WScript.Echo vbCrLf & ChangeCounter & " files were checked"

' === Functions and Procedures ===

' Процедура замены слов
Sub TextReplacement(FolderPath, FindText, ReplaceText)
   ' Подключение к директории
   Set oFolder = oFSO.GetFolder(FolderPath)
   ' Получение файлов директории
   Set colFiles = oFolder.Files
   ' Обработка каждого файла директории
   For Each oFile In colFiles
       ' Фильтрация только HTM и HTML файлов
       If LCase(Right(oFile.Name,3))="htm" Or LCase(Right(oFile.Name,4))="html" Then
           ' Считывание содержимого очередного файла
           Set oFileContent = oFile.OpenAsTextStream(ForReading, TristateUseDefault)
           sText = oFileContent.ReadAll
           oFileContent.Close
           ' Замена содержимого очередного файла
           sText = Replace(sText, FindText, ReplaceText)
           ' Перезапись очередного файла
           Set oNewFile = oFSO.CreateTextFile(oFile.Path)
           oNewFile.Write(sText)
           oNewFile.Close
           ' Увеличение счетчика проверенных файлов
           ChangeCounter = ChangeCounter + 1
       End If
   Next
   ' Получение подпапок директории
   Set colSubFolders = oFolder.SubFolders
   For Each oSubFolder In colSubFolders
       ' Рекурсивный вызов процедуры замены слов
       Call TextReplacement(oSubFolder.Path, FindText, ReplaceText)
   Next
End Sub
Выполнение команды на удаленном компьютере

Назначение сценария - поставить на удаленном компьютере задачу на выполнение указанной команды через 3 минуты от текущего времени.

Использование сценария: в теле скрипта указать имя компьютера, на котором нужно запустить команду, (sComputer), команду или файл скрипта для выполнения (sCommand) и тип взаимодействия с пользователем (bInteract). После работы сценария на указанном компьютере будет создана задача на запуск требуемого файла (задача отображается в планировщике задач Windows). После завершения работы команды задача уничтожается.

Примечание. Файл, указанный в команде, должен быть доступен для запуска с удаленного компьютера или присутствовать на самом компьютере, в противном случае пользователь увидит окно с ошибкой выполнения задачи, если тип взаимодействия с пользователем указан какTrue- показывать на экране.
' === Script Information Header ===
' Script Name: SetTask.vbs
' Date:        24.02.10
' Author:      Виталий Бочкарев
' Description: Скрипт выполнения команды на удаленном компьютере в определенное время

' === Initialization Block ===

Const sComputer = "CompName"
Const sCommand  = "notepad.exe"
Const bInteract = True

' === Script Main Logic ===

'Создание объекта для работы с оболочкой
Set oShell = CreateObject("WScript.Shell")
'Создание объекта для работы с файловой системой
Set oFSO = CreateObject("Scripting.FileSystemObject")
' Вызов функции постановки задачи
WScript.Echo SetTask(sComputer, sCommand, bInteract)

' === Functions and Procedures ===

' Функция постановки задачи
Function SetTask(Computer, Command, Interact)
   ' Подключение к WMI текущего компьютера
   Set oWMIService = GetObject("winmgmts:\\" & "." & "\root\cimv2")
   ' Запрос временной зоны текущего компьютера
   Set oColTime = oWMIService.ExecQuery("Select * from Win32_TimeZone")
   ' Вычисление смещения на летнее время
   For Each oTime In oColTime
       If Month(Date) > 4 And Month(Date) ' Составление часового пояса: OOO
   Select Case Len(cStr(Abs(iLocalBias)))
       Case "0"
           SetTask = "Error! No information about the time settings."
           WScript.Quit
       Case "1"
           sLocalBias = "00" & cStr(Abs(iLocalBias))
       Case "2"
           sLocalBias = "0" & cStr(Abs(iLocalBias))
       Case Else
           sLocalBias = cStr(Abs(iLocalBias))
   End select
   ' Выбор знака часового пояса (+-)OOO
   If iLocalBias >= 0 then
       sOOO = "+" & sLocalBias
   Else
       sOOO = "-" & sLocalBias
   End if
   ' Задание времени запуска команды (через 3 минуты от текущего времени)
   If Len(cStr((Minute(Time) + 3))) = 1 then
       sMM = "0" & cStr(Minute(Time) + 3)
   Else
       sMM = cStr(Minute(Time) + 3)
   End if
   If Len(cStr(Hour(Time))) = 1 then
       sHH = "0" & cStr(Hour(Time))
   Else
       sHH = cStr(Hour(Time))
   End if
   ' Создание времени запуска задания в формате YYYYMMDDHHMMSS.MMMMMM(+-)OOO"
   sStartTime = "********" & sHH & sMM & "00.000000" & sOOO
   ' Подключение к WMI удаленного компьютера
   Set oWMIService = GetObject("winmgmts:\\" & sComputer & "\root\cimv2")
   ' Создание объекта планировщика
   Set oJob = oWMIService.Get("Win32_ScheduledJob")
   ' Установка задания на выполнение команды
   errJobCreated = oJob.Create (sCommand, sStartTime, False , , , Interact, JobID)
   ' Проверка результата установки задания
   If errJobCreated = 0 then
       SetTask = "The job was successfully set on " & sComputer & " at " & sStartTime
   Else
       SetTask = "Error! The job has not been set."
   End if
End Function
Вычисление подсети по IP-адресу и маске

Назначение сценария - вычислить подсеть по IP-адресу и маске.

Использование скрипта: запусить скрипт. В результате работы сценария, на экране появится сообщение со следующими параметрами: имя сетевого интерфейса, IP-адрес, маска сети и адрес подсети.

Примечание. Также можно передать нужные значения IP-адреса и маски сети для вычисления подсети в качестве аргументов к скрипту.
' === Script Information Header ===
' Script Name: GetSubnet.vbs
' Date:        24.02.10
' Author:      Виталий Бочкарев
' Description: Скрипт вычисления подсети по IP-адресу и маске

' === Initialization Block ===
Dim sResult

' === Script Main Logic ===
' Получение аргументов командной строки
Set Arguments = Wscript.Arguments
' Проверка наличия аргументов командной строки
If Wscript.Arguments.Count=2 Then
   ' Высисление маски подсети по указанным аргументам
   sResult = sResult & GetSubnet(Arguments(0), Arguments(1))
Else
   ' Получение настроек сетевых карт
   Set oLocator = CreateObject("WbemScripting.SWbemLocator")
   Set oWbemServices = oLocator.ConnectServer( , "root\cimv2")
   Set oAdapters = oWbemServices.ExecQuery("Select * FROM Win32_NetworkAdapterConfiguration")
   ' Вычисление маски подсети для каждой сетевой карты
   For Each oAdapter in oAdapters
       If Not IsNull(oAdapter.IPAddress) Then
           sResult = sResult & "Network adapter: " & vbCrLf _
             & vbTab & oAdapter.Description & vbCrLf
           sResult = sResult & GetSubnet(oAdapter.IPAddress(0), oAdapter.IPSubnet(0)) & vbCrLf
       End If
   Next
   sResult = sResult & "You can also specify an address and Subnet mask as parameters to " _
     & "this script. For example:" & vbCrLf _
     & vbTab & "GetSubnet.vbs 192.168.1.2 255.255.255.255"
End If
' Вывод результата на экран
WScript.Echo sResult

' === Functions and Procedures ===

' Функция вычисления подсети
Function GetSubnet(Address, Subnet)
   Dim sResult
   If Address = "0.0.0.0" Then
       sResult = sResult & "No network" & vbCrLf
   Else
       sResult = sResult & "IP address:  " & vbCrLf _
         & vbTab & Address & vbCrLf
       sResult = sResult & "Subnet mask: " & vbCrLf _
         & vbTab & Subnet & vbCrLf
       Dim AddressBytes(4)
       Dim SubnetMaskBytes(4)
       i = 0
       Period = 1
       While Period <> Len(address) + 2
           PrevPeriod = Period
           Period = InStr(Period + 1, Address, ".") + 1
           If Period = 1 Then Period = Len(Address) + 2
           AddressByte = Mid(Address, PrevPeriod, Period - PrevPeriod - 1)
           AddressBytes(i) = AddressByte
           i = i + 1
       Wend
       i = 0
       Period = 1
       While Period <> Len (Subnet) + 2
           PrevPeriod = Period
           Period = InStr(Period + 1, Subnet, "." ) + 1
           If Period = 1 Then Period = Len(Subnet) + 2
           SubnetMaskByte = Mid(Subnet, PrevPeriod, Period - PrevPeriod - 1)
           SubnetMaskBytes(i) = SubnetMaskByte
           i = i + 1
       Wend
       Subnet = ""
       For i = 0 to 3
           Subnet = Subnet & (AddressBytes(i) And SubnetMaskBytes(i)) & "."
       Next
       Subnet = Left(Subnet, len(Subnet) - 1)
       sResult = sResult & "Subnet: " & vbCrLf _
         & vbTab & Subnet & vbCrLf
   End If
   GetSubnet = sResult
End Function
Виталий Бочкарев
Вложения