2015-11-13 2 views
0

Как создать вакансию (или скрипт или?):Как создать запланированное задание электронной почты на дисковое пространство в Windows Server 2008?

Проверить местонахождение на диске; когда дисковое пространство осталось на 1,5 ГБ, а затем отправьте электронное оповещение некоторым конечным пользователям.

Windows Edition: Windows Server 2008 R2 Standard Тип сервера: база данных SQL Server.

У меня нет опыта работы с Windows или Windows-технологиями. Был ли поиск и обнаружен планировщик задач, но он не смог понять, как применять ожидаемые условия.

ответ

1

Для этого в Windows Server с использованием Task Scheduler и System Log. Если свободное пространство падает ниже процента, указанного в HKLM \ SYSTEM \ CurrentControlSet \ Services \ LanmanServer \ Parameters \ DiskSpaceThreshold, событие регистрируется в System Log, который может инициировать задачу отправки сообщения электронной почты. Вы можете следовать ниже этапов -

  • Открыть планировщик заданий и создать новую задачу.
  • Введите имя задачи, выберите «Запустить, был ли пользователь включен или нет», и установите флажок «Не храните пароль».
  • Добавить новый триггер на вкладке Триггеры.
  • Выберите «В событии» в поле «Начать задачу».
  • Установите Log to «System», Source to «srv» и Event ID на «2013».
  • Добавьте новое действие на вкладку «Действия».
  • Установите действие «Отправить электронное письмо» и заполните остальные настройки
    соответствующим образом.
  • Чтобы настроить, когда событие низкого места на диске записывается в системном журнале, откройте редактор реестра, перейдите к HKLM \ SYSTEM \ CurrentControlSet \ Services \ LanmanServer \ Параметры и добавьте значение в DWORD с именем DiskSpaceThreshold, установка это до желаемого процента. Когда запись не существует, то значение по умолчанию равно 10.

Если вы хотите сделать это с помощью SQL Server, то вы можете написать сценарий и затем запланировать сценарий через работу, которая будет работать периодически и отправлять оповещения/почту (используя msdb.dbo.sp_send_dbmail), когда дисковое пространство пересекает пороговое значение.

Пример запроса -

SELECT DISTINCT DB_NAME(dovs.database_id) DBName, 
mf.physical_name PhysicalFileLocation, 
dovs.logical_volume_name AS LogicalName, 
dovs.volume_mount_point AS Drive, 
CONVERT(INT,dovs.available_bytes/1048576.0) AS FreeSpaceInMB 
FROM sys.master_files mf 
CROSS APPLY sys.dm_os_volume_stats(mf.database_id, mf.FILE_ID) dovs 
ORDER BY FreeSpaceInMB ASC 

проверка колонки FreeSpaceInMB

Другой запрос -

EXEC master..xp_fixeddrives 

проверка колонки MBfree

Edit: Ссылка с подробной информацией о том, как сделать это с помощью Sql Server - link

+0

Благодарим за показ начального пути. Я сделал шаги, как было предложено. Ничего не произошло. Установите значение порога на 80, чтобы запустить его правильно. My C Drive 95GB не содержит 227 ГБ. D составляет 155 ГБ без 227 ГБ. Я изменил его, чтобы отобразить сообщение, и оно тоже не отображается. В средстве просмотра событий невозможно найти 2013. Я не обычный пользователь окон, а Linux. Поэтому, пожалуйста, уточните, где я делаю неправильно. – fatherazrael

+0

Для мероприятия вам не нужно найти идентификатор, просто введите номер (2013). Это идентификатор события, определенный Microsoft, 'Ошибка 2013 - Диск находится на или около емкости '. – Abhishek

+0

Я думаю, что ваша проблема не решена, я отредактировал свой вопрос и предоставил ссылку, которая выполнит задачу для вас через 'Sql Server'. – Abhishek

0

Я искал подобное решение и ударив головой в стену. После тонны поиска я убедился, что могу сделать это сам. Это требует 3 скриптов, 1 bat-файл и 2 vbs-скрипта (потому что я действительно отправляю предупреждения перед предупреждениями). Предупреждения отправляются по электронной почте и могут быть проигнорированы через час, но оповещения отправляются на телефоны по электронной почте на шлюзы sms (мне придется работать над получением прямого sms-решения в конце концов).

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

@echo off 
:: Copyright Lou Spinuso 2017 
:: This script calculates the amount of free space on a disk and returns the percentage 
:: This can be used with a task scheduler job to verify that more than 10% 
:: (or prefered threshold) of disk is available and then set to send alerts if it fails 
:: You will require setting the path to where grep and awk exists as these are required 
:: in order to extract the values necessary 
:: alternatively you can use find and for to get the right values 

:: this is needed to enable setting some variables in the IF statement 
setlocal EnableDelayedExpansion 

:: SCRIPT_HOME = home directory for script and VB Script 
:: DISK_TEST = Disk to test 
:: GNU_TOOLS = location of grep and awk 
:: DTFile = log file written with total disk size 
:: DFFile = log file written with free disk space 

set SCRIPT_HOME=C:\Monitor\Disk 
set DISK_TEST=C: 
set GNU_TOOLS=c:\gnu_tools\bin 
set DTFile=C:\Monitor\disktotal.log 
set DFFile=C:\Monitor\diskfree.log 
set WarnValue=10 
set AlertValue=5 
set PATH=%PATH%;%GNU_TOOLS% 

::fsutil is a built-in windows application 
fsutil volume diskfree %DISK_TEST%|grep -i "total # of bytes" |awk "{print $6}" >%DTFile% 
fsutil volume diskfree %DISK_TEST%|grep -i "total # of free bytes" |awk "{print $7}" >%DFFile% 

:: setting variables from files since batch files can't do it 
:: directly from a command that I've been able to find 
set /P DiskTotal= < %DTFile% 
set /P DiskFree= < %DFFile% 

:: call to function that calculates the length of the variables 
:: for disk size. This is because set /a will only calcuate 
:: 32 bits or up to 2,147,483,647, or 2 GB 
:: and fsutil returns number of bytes which can get up to TB's 
:: Using this we can effectively chop the right most digits 
:: effectively dividing by orders of magnitude later 
call :strlen DiskTotalLen DiskTotal 
call :strlen DiskFreeLen DiskFree 

::echo DiskTotalLen= %DiskTotalLen% 
::echo DiskFreeLen = %DiskFreeLen% 

:: setting variables just in case we are working with small disks 
set DFLLeftMost=%DiskFreeLen% 
set DTLLeftMost=%DiskTotalLen% 

:: if statement that checks if numbers we're looking at are 
:: 9,999,999 or smaller. This is because we need to make the 
:: disk free variable 2 oom > than the disk size variable 
:: in order to have returned a whole number 
:: (no decimal values are returned) 
:: also, as a result of using "setlocal EnableDelayedExpansion" 
:: we should use ! instead of % in the if statement 

if %DiskTotalLen% GTR 7 (
    set /a Subtractor=!DiskTotalLen! - 7 
    set /a DTLLeftMost=!DiskTotalLen!-!Subtractor! 
    set /a DFLLeftMost=!DiskFreeLen!-!Subtractor!+2 
    ) 

:: dividing values by oom 
call set DiskFree=%%DiskFree:~0,%DFLLeftMost%%% 
:: echo %DiskFree% 
call set DiskTotal=%%DiskTotal:~0,%DTLLeftMost%%% 
:: echo %DiskTotal% 

:: set value in text file for reading 
set /a DiskPercent=%DiskFree%/%DiskTotal% 

if %DiskPercent% LSS %WarnValue% (
    if %DiskPercent% LSS %AlertValue% (cscript.exe %SCRIPT_HOME%\Alert.vbs "!COMPUTERNAME!" "!DiskPercent!" 
    ) ELSE (cscript.exe %SCRIPT_HOME%\Warn.vbs "!COMPUTERNAME!" "!DiskPercent!") 
) 
::echo %DiskPercent% > c:\monitor\diskpercent.log 
::echo %DiskPercent% 

goto :eof 

:: function to count the length of a variable. Not sure what this all 
:: means, this was written by 'jeb' on stackoverflow 
:: ht tp://stack overflow.com/questions/5837418/how-do-you-get-the-string-length-in-a-batch-file 

:strlen <resultVar> <stringVar> 
(
    setlocal EnableDelayedExpansion 
    set "s=!%~2!#" 
    set "len=0" 
    for %%P in (4096 2048 1024 512 128 64 32 16 8 4 2 1) do (
     if "!s:~%%P,1!" NEQ "" (
     set /a "len+=%%P" 
     set "s=!s:~%%P!" 
    ) 
    ) 
) 
(
    endlocal 
    set "%~1=%len%" 
    exit /b 
) 

Отсюда мы теперь нужны VBS скрипты, которые будут посылать электронную почту. Вот сценарий «alert» vbs, названный, точно, «alert.vbs». Также требуется вторая vbs, почти идентичная названной, «warn.vbs». Вы должны убедиться, что вы правильно установить значения для

  • objEmail.From
  • objEmail.To
  • objEmail.Configuration.Fields.Item тот, который указывает SMTP-сервер

также порт для вашего почтового сервера, если он не является 25.

if WScript.Arguments.Count = 0 then 
    WScript.Echo "Missing Parameters" 
end if 

Set objEmail = CreateObject("CDO.Message") 
objEmail.From = "[email protected]" 
objEmail.To = "[email protected]" 
objEmail.Subject = "ALERT!!!! Server "+WScript.Arguments(0)+" is low on disk space" 
objEmail.Textbody = "Critical disk space issue. Please clear some space on C drive on server . " + WScript.Arguments(0) 
objEmail.Textbody = objEmail.Textbody + vbCrLf + "Server is at " + WScript.Arguments(1) +" percent free Disk Space" 

objEmail.Configuration.Fields.Item ("ht tp://schemas.micro soft.com/cdo/configuration/sendusing")=2 
'Name or IP of remote SMTP server 
objEmail.Configuration.Fields.Item ("ht tp://schemas.micro soft.com/cdo/configuration/smtpserver")="mail.yourcompany.com" 
'Server port 
objEmail.Configuration.Fields.Item ("ht tp://schemas.micro soft.com/cdo/configuration/smtpserverport")=25 
objEmail.Configuration.Fields.Update 

objEmail.Send 

set objEmail=nothing 

Затем я установил их для запуска на сервере в планировщике задач каждые 15 минут, а когда свободное место на диске ниже порогового значения (в процентах), отправляется предупреждение или предупреждение.

Надеюсь, я ответил на этот вопрос достаточно хорошо для достаточно других людей, которые ищут аналогичное решение.

Заключительное примечание, мне пришлось разбить «urls» в коде, потому что у меня недостаточно репутации, чтобы публиковать их. Вы должны иметь возможность просто удалить пробелы и партии.