В комментарии к моему ответу на этот вопрос , cop1152 сказал, что любит сценарии WMI. Ну, я тоже!
Какие ваши любимые, самые лучшие и самые полезные скрипты вы бы хотели поделиться с сообществом?
Спасибо.
Один я написал, чтобы помочь коллеге, который подключился к серверу через RDPd, открыл программу просмотра событий и просмотрел ее на предмет ошибок. Затем повторяется для остальных 3 серверов ... каждый день.
'
' WMI script to read all eventlog errors generated since last time this script was run.
' This script reads a datetime value from a file (EventView_date.txt) and uses it to
' construct a WMI query for all windows EventLog entries since then that are of type
' Error or error (seems winxp writes with a lowercase e)
'
' These results are written to a file (EventView_<dts>.log) and the time the script was
' run is written to the date file. This allows this script to be run several times a day
' and will only retrieve the error entries since the last run.
'
' If the date file is not present a new one will be created with the current date/time.
'
'
' Usage: click the vbs file in Windows Explorer to run using wscript. Some information
' will be displayed in message boxes (start time, each computer, number of records found)
' Alternatively type "cscript EventLogErrorView.vbs" in a command prompt to show the
' same details written to the command prompt. This can be used in a batch file, or in
' a scheduled task - the command is cscript, the parameter is this vbs file.
'
'
'
On Error Resume Next
'
' update this to refelect the computers to monitor - comma separated for multiple
'
arrComputers = Array("server1", "server2")
Const wbemFlagReturnImmediately = &h10
Const wbemFlagForwardOnly = &h20
Set objFSO = CreateObject("Scripting.FileSystemObject")
today = ""
Set objDateFile = objFSO.OpenTextFile ("EventView_date.txt")
today = objDateFile.Readline
Wscript.echo "today = " & today
if (isempty(today)) then
WScript.Echo "Date file not found, using today's date at midnight"
today = Date & " 00:00:00"
end if
today = DateToWMIDateString(today)
' write current datetime to file for next run.
set objDateFile = objFSO.CreateTextFile("EventView_date.txt")
objDateFile.WriteLine(Date & " " & Time)
Set objFile = objFSO.CreateTextFile("EventView_" & today & ".log")
' start processing
WScript.Echo "Processing All Error reports since: " & today & " (" & WMIDateStringToDate(today) & ")"
objFile.WriteLine "Processing All Error reports since: " & today & " (" & WMIDateStringToDate(today) & ")"
For Each strComputer In arrComputers
objFile.WriteLine
objFile.WriteLine
objFile.WriteLine
objFile.WriteLine "=========================================="
objFile.WriteLine "Computer: " & strComputer
objFile.WriteLine "=========================================="
WScript.Echo "Computer: " & strComputer
' notes:
' timestamp comparisons in WMI queries are in the form YYYYMMDDHHMMSS.milliseconds+exp
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_NTLogEvent WHERE (Type = 'error' OR Type= 'Error') AND TimeGenerated > '" & today & ".000000+000'", "WQL", _
wbemFlagReturnImmediately + wbemFlagForwardOnly)
dim records
records = 0
For Each objItem In colItems
objFile.WriteLine "CategoryString: " & objItem.CategoryString
objFile.WriteLine "ComputerName: " & objItem.ComputerName
strData = Join(objItem.Data, ",")
objFile.WriteLine "Data: " & strData
objFile.WriteLine "EventCode: " & objItem.EventCode
objFile.WriteLine "EventIdentifier: " & objItem.EventIdentifier
objFile.WriteLine "EventType: " & objItem.EventType
strInsertionStrings = Join(objItem.InsertionStrings, ",")
objFile.WriteLine "InsertionStrings: " & strInsertionStrings
objFile.WriteLine "Logfile: " & objItem.Logfile
objFile.WriteLine "Message: " & objItem.Message
objFile.WriteLine "SourceName: " & objItem.SourceName
objFile.WriteLine "TimeGenerated: " & WMIDateStringToDate(objItem.TimeGenerated)
objFile.WriteLine "Type: " & objItem.Type
objFile.WriteLine "User: " & objItem.User
objFile.WriteLine
objFile.WriteLine "------------------------------------------"
objFile.WriteLine
records = records + 1
Next
WScript.Echo " " & records & " records found"
objFile.WriteLine " " & records & " records found"
Next
Function WMIDateStringToDate(dtmDate)
WMIDateStringToDate = CDate(Mid(dtmDate, 5, 2) & "/" & _
Mid(dtmDate, 7, 2) & "/" & Left(dtmDate, 4) _
& " " & Mid (dtmDate, 9, 2) & ":" & Mid(dtmDate, 11, 2) & ":" & Mid(dtmDate,13, 2))
End Function
' takes a dd/mm/yyyy hh:mm:ss format and turns it into yyyymmddhhmmss
Function DateToWMIDateString(dtmDate)
DateToWMIDateString = Year(dtmDate) & PadZeros(Month(dtmDate)) & PadZeros(Day(dtmDate)) & PadZeros(Hour(dtmDate)) & PadZeros(Minute(dtmDate)) & PadZeros(Second(dtmDate))
End Function
Function PadZeros(dtmDate)
If Len(dtmDate) = 1 Then
PadZeros = "0" & dtmDate
Else
PadZeros = dtmDate
End If
End Function
Я собрал кучу сниппетов WMIC Вот.
Все в (бесплатном) инструменте Microsoft Scriptomatic2!
Один из моих любимых инструментов (потому что он был моим первым), который доставил мне больше всего проблем ... который я писал снова и снова, пока он не работал правильно ... был скрипт, который удаленно "отключал" наш самодельный веб-фильтр.
Мы используем «настроенную» (мной) версию Squid с некоторыми бесплатными черными списками для фильтрации содержимого и блокировки портов на наших общедоступных машинах (я работаю в системе публичных библиотек среднего размера с 3 ветвями).
Сценарий WMI выполняется на служебной машине. Как только сотрудник выполнит его, ему / ей будет предложено выбрать, на какой машине отключить фильтр. Когда сценарий выполняется, по сути, он снимает галочку с параметров настройки прокси в Internet Explorer на уровне реестра.
Фильтр включается пакетным файлом, который запускается, когда сеанс постоянных посетителей запускается, а компьютер автоматически выходит из системы и снова включается.
В итоге мы использовали мой WMI только на нескольких тестовых машинах, но мне очень понравилось узнавать, как с WMI можно делать почти все.
Скрипт полезен, и я могу это выполнить. Но файл показывает только такую информацию, как
========================================== Данные: InsertionStrings:
1 records found
Более того ("EventView_" & сегодня & ".log") этот файл просто создает файл с EventView_00.log, а не с фактической датой. Согласно синтаксису он должен выдавать данные вместо off) 00.
Из WSH JScript:
// List errors from Windows EventLog (filter only errors from last month). function leadingzero(str) { if (str.length == 1) return "0"+str; else return str; } function good_date(d) { var dstr = d.getFullYear().toString(); dstr += leadingzero((d.getMonth()+1).toString()); dstr += leadingzero(d.getDate().toString()); dstr += leadingzero(d.getHours().toString()); dstr += leadingzero(d.getMinutes().toString()); dstr += leadingzero(d.getSeconds().toString()); dstr += ".000000-000"; return dstr; } // 24*3600*1000 - one day // 30*24*3600*1000 - one month time = good_date(new Date(new Date() - 30*24*3600*1000)); var wbemFlagReturnImmediately = 0x10; var wbemFlagForwardOnly = 0x20; var objWMIService = GetObject("winmgmts:\\\\.\\root\\CIMV2"); var items = objWMIService.ExecQuery("SELECT * FROM Win32_NTLogEvent WHERE (Type = 'Ошибка' OR Type = 'Error') AND TimeGenerated > '" + time + "'", "WQL", wbemFlagReturnImmediately | wbemFlagForwardOnly); var enumItems = new Enumerator(items); for (enumItems.moveFirst(); !enumItems.atEnd(); enumItems.moveNext()) { var i = enumItems.item(); WScript.Echo("Type: " + i.Type + "\n" + "Message: " + i.Message + "\n" + "TimeGenerated: " + i.TimeGenerated); }