Войти на сайт

Возможные проблемы и способы их устранения

При тестировании скрипта замечены такие ошибки:

Проблема Вероятная причина Как устранить
Сообщение «Компьютер удаленного сервера не существует или недоступен» Доступ к службе WMI удаленного компьютера заблокирован брандмауэром. Отключить службу брандмауэра, подключившись к удаленному компьютеру через консоль (оснастку) «Управление компьютером».
Сообщение «Разрешение отклонено» Не удается создать новый или обновить существующий файл отчета. Проверить, что в настройках скрипта указан нужный каталог для сохранения отчетов, файл отчета не занят другой программой и для него не установлен атрибут «только чтение», у скрипта достаточно разрешений на запись.
Сообщение «Объект не поддерживает это свойство или метод» Некоторые свойства объектов WMI не поддерживаются Windows 2000. При обращении к таким свойствам возникает ошибка. Например, при подключении к Windows 2000 такую ошибку вызывает обращение к свойствам ’NetConnectionStatus’, ’AdapterType’ элемента коллекции ’Win32_NetworkAdapter’. Проверить в документации по WMI, какие свойства не поддерживаются в некоторых ОС и перед обращением к таким свойствам проверять версию ОС или вообще их не использовать.
Неправильно определяется процессор Intel Core 2 в XP Это неточность компонента WMI, см. статью Microsoft на эту тему. Цитата: `The data that is returned indicates that the CPU name is «Intel Pentium III Xeon» or «Intel Pentium III.» However, System Properties or System Information (MSInfo32.exe) shows the name as «Intel(R) Core(TM)2 Duo CPU E8000»`. В упомянутой статье есть ссылка для загрузки исправления.
Неправильно определяется процессор Intel Celeron в XP Это неточность компонента WMI, см. статью Microsoft на эту тему. В упомянутой статье есть ссылка для загрузки исправления.
Не появляется окно «Отчет сохранен в файл», создание отчета останавливается Отправлен некорректный WMI-запрос — допущена синтаксическая ошибка или запрошенное свойство не поддерживается. Найти, исправить или отключить некорректный WMI-запрос.

(c) http://zheleznov.info

Функции для работы с датой и временем

Функция Описание
Date

Возвращает текущую системную дату.

Now

Возвращает текущие системные дату и время в виде, соответствующем региональным настройкам Windows.

Time

Возвращает текущее системное время.

Timer

Возвращает количество секунд, прошедших с полуночи.

IsDate(expr)

Возвращает true, если параметр expr задаёт корректную дату, и false в противном случае.

Year(date)

Выделяет год из даты, заданной параметром date, и возвращает это целое число.

Month(date)

Выделяет номер месяца из даты, заданной параметром date, и возвращает целое число от 1 до 12.

Day(date)

Выделяет номер дня месяца из даты, заданной параметром date, и возвращает целое число от 1 до 31.

Weekday(date)

Возвращает целое число — день недели для даты, заданной параметром date. Параметр firstdayofweek — константа, показывающая, какой из дней недели считать первым.

Hour(time)

Выделяет номер часа из даты или момента времени, заданных параметром time, и возвращает целое число от 0 до 23.

Minute(time)

Выделяет количество минут из даты или момента времени, заданных параметром time, и возвращает целое число от 0 до 59.

Second(time)

Выделяет количество секунд из даты или момента времени, заданных параметром time, и возвращает целое число от 0 до 59.

DateValue(date)

Возвращает переменную подтипа Date, которая соответствует дате, заданной символьным параметром date.

TimeValue(time)

Возвращает переменную подтипа Date, которая соответствует времени, заданному символьным параметром time.

DateSerial(year, month, day)

Возвращает переменную подтипа Date, которая соответствует указанным году (параметр year), месяцу (параметр month) и дню (параметр day).

TimeSerial(hour, minute, second)

Возвращает переменную подтипа Date, которая соответствует указанным часу (параметр hour), минуте (параметр minute) и секунде (параметр second).

MonthName(month)

Возвращает наименование для месяца с номером month. Если параметр abbr равен true, наименование месяца представляется в виде аббревиатуры, если false — в полном виде.

WeekdayName(weekday])

Возвращает наименование дня недели с порядковым номером weekday. Если параметр abbr равен true, наименование дня недели представляется в виде аббревиатуры, если false — в полном виде. Параметр firstdayofweek — константа, показывающая, какой из дней недели считать первым.

DateAdd(interval, number, date)

Возвращает дату, отстоящую от даты date на number интервалов, заданных параметром interval, который может принимать значения:
«yyyy» — год
«q» — квартал
«m» — месяц
«y» — день года
«d» — день
«w» — день недели
«ww» — неделя года
«h» — час
«n» — минута
«s» — секунда

DateDiff(interval, date1, date2])

Возвращает количество интервалов interval между датами date1 и date2. Возможные значения параметра interval — те же, что и в функции DateAdd. Параметр firstdayofweek — константа, показывающая, какой из дней недели считать первым. Параметр firstweekofyear — константа, показывающая, какую неделю считать первой в году.

DatePart(interval, date])

Возвращает ту часть даты, которая соответствует параметру interval. Возможные значения параметра interval — те же, что и в функции DateAdd. Параметр firstdayofweek — константа, показывающая, какой из дней недели считать первым. Параметр firstweekofyear — константа, показывающая, какую неделю считать первой в году.

Объявление переменных и массивов

В VBS есть глобальные и локальные переменные, доступные только в конкретной области.

Dim     Variable1 ' объявление глобальной переменной
Public  Variable2 ' объявление глобальной переменной
Private Variable3 ' объявление локальной переменной

Использование Public и Private по большей части имеют смысл при использовании классов в VBS, которые будут рассмотрены в следующей статье. В языке VBS так же можно объявить константы:

Const Const1 = Value1

Переменную так же можно вообще не объявлять, а сразу присваивать ей значение, однако, так делать не рекомендуется, т.к. в случае опечатки в названии переменной, можно получить не те результаты, что ожидались. Чтобы компилятор требовал явного объявления всех переменных, нужно использовать оператор Option Explicit

Тип переменной задается при присвоении ей значения, при этом тип может меняться в процессе выполнения программы.

Массивы объявляются с помощью скобок.

Dim Arr1(10) ' Объявление массива с фиксированным размером (11 элементов)
Dim Arr2()   ' Объявление динамического массива
ReDim Preserve Arr2(100)  ' Изменение размера динамического массива

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

Очистить массив от данных можно так:

Erase имя_массива

Тонкая настройка скрипта

Добавление и удаление параметров

Какие параметры и в каком порядке попадут в отчет определяется в программном коде процедуры InventComp. Каждой секции отчета, содержащей сведения по всем экземплярам какого-либо класса компонентов, соответствует один вызов подпрограммы Log. Вот пример:

Параметры вызова подпрограммы разнесены на несколько строк для наглядности. Третий параметр чаще всего — пустая строка, и поэтому расположен на одной строке со вторым.

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

  • «Win32_ComputerSystem» — класс WMI, к которому идет запрос
  • «Name,Domain,PrimaryOwnerName… — свойства WMI (через запятую), значения которых надо включить в отчет
  • »» — условие отбора по правилам WQL (подробности далее), или пустая строка.
  • «Компьютер» — название соответствующей секции отчета, выводится в первом столбще CSV-файла.
  • «Сетевое имя,Домен,Владелец… — названия параметров (через запятую), соответствующих перечисленным выше свойствам WMI, в том же порядке и количестве, выводится во втором столбце CSV-файла.

Чтобы корректно добавить или изменить подобный вызов, необходимо найти и изучить документацию по соответствующему WMI-классу:

  • Описание классов WMI в MSDN
  • WMI Platform SDK, если удастся найти

Также для составления и тестирования запросов к WMI можно использовать программы:

  • Microsoft WMI Object Browser — работает через web-интерфейс, входит в состав «WMI Administrative Tools»
  • WMI Explorer — не требует установки, автор Alexander Kozlov

Удаление ненужных значений

Чтобы в отчет не попадали отключенные сетевые адаптеры, минипорты и виртуальные адаптеры VMware, в запросе к классу Win32_NetworkAdapter добавлено условие:

Чтобы в отчет попадали только локальные принтеры, подключенные через порт USB или LPT, в запросе к классу Win32_Printer добавлено условие:

Чтобы в секцию отчета «Диск» попадали данные только о жестких дисках, в запросе к классу Win32_DiskDrive добавлено условие:

Соответственно, чтобы в секцию отчета «Логический диск» также попадали данные только о разделах жестких дисков, в запросе к классу Win32_LogicalDisk добавлено условие:

В Windows 2000 компонент WMI не поддерживает некоторые WMI-классы, например сетевые адаптеры и принтеры. Причем, если все-таки отправить некорректный запрос, не вернется ни ответа, ни сообщения об ошибке — создание отчета просто прекратится. Поэтому добавлена проверка версии WMI-сервера — запрос выполняется только если номер сборки операционной системы больше или равен 2600 (Windows XP/2003):

Видеоадаптеры ATI, имеющие два выхода отображаются как два отдельных адаптера, причем в названии второго есть слово «Secondary». Чтобы в отчете не отображались такие «двойники», в запросе к классу Win32_VideoController добавлено условие:

Формат значений

Размер дисков и объем памяти в WMI выдается в байтах. Чтобы в отчете значения какого-либо параметра выводились в более привычных кратных единицах, достаточно в конце названия параметра добавить условные символы (Мб) или (Гб). В скрипте есть проверка этих условных символов:

Значения, имеющие тип «дата и время» распознаются по свойству CIMType и автоматически преобразуются в читаемый вид:

Если значение является массивом (например, перечень поддерживаемых форматов бумаги у принтера — свойство PrinterPaperNames класса Win32_Printer), то все значения автоматически «склеиваются» в строку с запятой в качестве разделителя:

Первый этап работы — сбор данных

Скрипт invent_comp.vbs собирает данные о конфигурации указанного компьютера и сохраняет отчет в формате CSV в заданный локальный каталог или на сетевой ресурс. Имя файла отчета соответствует сетевому имени компьютера. Есть несколько вариантов запуска.

Вариант 1 — для тестирования или для отдельных сетевых компьютеров и серверов

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

Вариант 2 — для сетевых рабочих станций

Скрипт может работать в «тихом» режиме, т. е. не выводить диалоги, собирать данные о локальном компьютере и сохранять отчет на заранее определенный сетевой ресурс. Таким образом возможен автоматический запуск на всех рабочих станциях сети, например при их включении. Для этого варианта запуска лучше создать и использовать отдельную копию файла.

Сначала необходимо выделить сетевой ресурс для сохранения отчетов и дать разрешение на запись пользователю (или группе пользователей), от имени которого будет запускаться скрипт.

Настройки в самом скрипте такие:

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

Вариант 3 — для компьютеров, не подключенных к сети

Если есть компьютеры, данные по которым невозможно собрать другими способами, можно скопировать скрипт на переносной диск и запускать с него. Настройки взять из варианта 1, собранные отчеты добавить к остальным.

Формат отчета с результатами
Результаты сохраняются в текстовый файл формата CSV. Каждая строка файла состоит из 4 полей, разделенных символом ; («точка с запятой»):

  • Тип компонента — используется для группировки
  • Название параметра
  • Номер экземпляра (целое число) — нужен для различения нескольких компонентов одного типа
  • Значение параметра

Если в значении какого-либо параметра встретится символ ;, он будет заменен на символ _. Значения полей не заключаются в кавычки. Первая строка содержит заголовки столбцов. При желании можно отключить добавление этой строки в настройках:

Пример отчета:

Циклы

В VBS используется два основных вида циклов.

Синтаксис цикла For … Next

For переменная=начало To конец 
  тело цикла 
   
  тело цикла 
Next

Операторы в квадратных скобках не обязательны. Step — задает шаг изменения переменной цикла, на сколько она увеличивается или уменьшается с каждой итерацией (повтором) цикла. Exit For — позволяет прервать цикл «досрочно», т.е. выйти из цикла, когда необходимо и передать управление оператору, следующему за Next.

Пример цикла For … Next

For i = 1 To 10
  summ = summ + i 
Next

Еще один вариант цикла For Each … Next. Он позволяет перебирать элементы какого-либо списка (массива), в случае, если его размеры не известны. В цикле так же можно использовать Exit For при необходимости.

Пример цикла For Each … Next

Dim Arr(3), el, s
Arr(0) = 1 
Arr(1) = "строка"
Arr(2) = 3
For Each el In Arr
  s = s & elem & vbCrLf
Next  
MsgBox s

Цикл Do .. Loop используется когда необходимо выполнять цикл до тех пор пока условие верно или, наоброт, выйти из цикла если условие стало верно.

Синтаксис цикла с предусловием:

Do  условие 
  тело цикла 
   
  тело цикла
Loop

Синтаксис цикла с постусловием:

Do 
  тело цикла
  
  тело цикла
Loop  условие

Как и с циклом For оператор Exit Do позволяет «досрочно» выйти из цикла.

Пример

i = 0
Do While i < 3
  MsgBox i
  i=i+1
Loop

Цикл While Wend — альтернативная форма записи цикла Do Loop с предусловием. Цикл выполняется пока условие верно.

While условие 
  тело цикла 
Wend

Возможности и особенности

Предлагаемый скрипт позволяет:

  • Собирать сведения о конфигурации множества компьютеров тремя разными способами — локально (если нет доступа по сети), удаленно (с рабочего места администратора), через logon-скрипт.
  • Сохранять отчеты о конфигурации компьютера в структурированный текстовый файл формата CSV, удобный для последующей автоматизированной обработки.
  • Создавать настраиваемый общий отчет по всем имеющимся компьютерам.

Отличительные особенности скрипта:

  • Используются встроенные в Windows 2000/XP/2003/Vista компоненты VBScript и WMI. Установка и лицензирование дополнительных программ не требуется.
  • В программном коде можно настроить состав и структуру отчета под свои нужды. При желании не трудно добавить вывод отчетов в других текстовых форматах (TXT, INI, HTML, XML), удобных для просмотра, печати или импорта в других программах.
  • Собираются и выводятся в отчет только действительно нужные для решения поставленных задач сведения. Скрипт не предназначен для сбора исчерпывающей информации о составе системного блока.

Добавление скрипта в групповую политику

Теперь нам нужно распространить выполнение скриптов на компьютеры. Я воспользовался стандартным функционалом GPO. Не буду приводить картинки, как это сделать, в интернете есть масса статей с различными версиями windows. Расскажу словами, как это делаю я.

Для начала я создаю отдельную политику. Я всегда для разных настроек создают отдельные политики. Мне так удобнее управлять ими. Можно оперативно отключить что-то или добавить настройку отдельной группе пользователей. Если добавлять все в одну политику, гибкости в управлении не будет.

Таким образом, создаем отдельную политику. Отключаем в ней конфигурацию компьютера, она не нужна. Скрипты будут добавляться в настройки пользователя. Переименовываем скрипты, к примеру, в logon.vbs и logoff.vbs. Назначаем каждому событию свой скрипт. После этого линкуете в нужное место политику и проверяете.

VBS скрипт для аудита входов/выходов в компьютер

Сразу предупреждаю, что писать vbs скрипты я не умею, и практически не знаком с этим языком. Я собирал из разных кусочков то, что мне нужно, читая документацию и правя на ходу чужие куски кода. Может я предвзято отношусь к vbs, но когда я вижу его код, сразу хочу закрыть редактор. Мне он кажется каким-то нелепым и трудночитаемым. Было бы здорово, если кто-нибудь подсказал бы как сделать мой скрипт более правильным и логичным.

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

Const MY_COMPUTER = &H11&
Set objNetwork = CreateObject("Wscript.Network")
objComputerName = objNetwork.ComputerName
objUserName = objNetwork.UserName
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.Namespace(MY_COMPUTER)
Set objFolderItem = objFolder.Self
MyStroka = "User: " & (objUserName) & vbNewLine & "Компьютер: " & (objComputerName) & vbNewLine & "Время: "'

On Error Resume Next
Const ForWriting = 2
Const ForReading = 1
Const ForAppending = 8
Const TristateFalse = 0
Set fso = CreateObject("Scripting.FileSystemObject")
Set GObjArgs = WScript.Arguments
GStrCmd = GObjArgs(0)
Call crypt(GStrCmd)

Sub crypt(msg)
n = Len(msg)
c = 0
Do Until c = n
c = c + 1
t1 = Mid(msg,c,1)
ch = Chr(asc(t1)+n)
output = output & ch
Loop

MyComp = objComputerName
MyPath = "\\192.168.0.100\logon-info\"
MyDate = Date
MyTime = Time
MyDir = MyPath & MyComp
If Not FSO.FolderExists(MyDir) Then 
  FSO.CreateFolder(MyDir)
End If

Mytxt = ".txt"
My1 = "\"
Myfile = MyDir & My1 & MyDate & Mytxt

Set GObjLocalF = fso.OpenTextFile(Myfile,ForAppending,True)
GObjLocalF.WriteLine "###########LOGON#################"
GObjLocalF.WriteLine MyStroka & Time
GObjLocalF.WriteLine "#################################"
GObjLocalF.Close
End Sub

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

Математические функции

Функция Описание
Abs(x)

Возвращает абсолютное значение числа x.

Int(x)

Возвращает целую часть числа x. Если х — отрицательное число, функция вернёт ближайшее целое число, меньшее, чем х.

Fix(x)

Возвращает целую часть числа x. Если х — отрицательное число, функция вернёт ближайшее целое число, большее, чем х.

Sgn(x)

Знаковая функция числа x. Возвращает 1 для чисел больше нуля, 0 для нуля и -1 для чисел меньше нуля.

Round(x, )

Возвращает результат округления числа x с точностью до numdecimal знаков после запятой.

Rnd()

Возвращает случайное число от 0 до 1. Необязательный аргумент является начальным значением для генерации случайных чисел.

Sqr(x)

Возвращает квадратный корень числа x.

Sin(x)

Возвращает синус числа x.

Cos(x)

Возвращает косинус числа x.

Tan(x)

Возвращает тангенс числа x.

Atn(x)

Возвращает арктангенс числа x.

Exp(x)

Экспоненциальная функция, возвращает число е в степени x.

Log(x)

Возвращает натуральный логарифм числа x.

Заключение

Мне мало приходится работать с windows серверами. Чувствую себя не очень уверенно в этом окружении. Писать скрипты на bash и sh мне несравненно проще, чем на vbs или powershell. Тут вопрос привычки и опыта, но даже с самого начала своей работы с серверами в линуксе мне работать было интереснее и приятнее. Но от винды никуда не деться, приходится быть в тонусе и решать поставленные задачи.

Онлайн курс «DevOps практики и инструменты»

Если у вас есть желание научиться строить и поддерживать высокодоступные и надежные системы, научиться непрерывной поставке ПО, мониторингу и логированию web приложений, рекомендую познакомиться с онлайн-курсом «DevOps практики и инструменты» в OTUS. Курс не для новичков, для поступления нужны базовые знания по сетям и установке Linux на виртуалку. Обучение длится 5 месяцев, после чего успешные выпускники курса смогут пройти собеседования у партнеров.

Проверьте себя на вступительном тесте и смотрите программу детальнее по .

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Ваша ОС
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: