Показать полную графическую версию : [решено] Запуск бат файла на сервере через эл. письмо
Добрый день, всем
На работе застряла задачка, нужна помощь по написанию скрипта для отправки команды через эл. письмо для запуска бат файлов для восстановления базы на сервере
Задача: есть сервер1 там уже написан скрипт на BAT. компы все в AD. Есть Exchange.
Нужно при отправке письма от любого пользователя на определенного получателя (пример bat@example.com) он получает его обрабатывает если в сообщение содержится команда (пример fas/start =) ) то начинает работать скрипт. И так каждую
Можно автоматом очищать почту ну или как удобно чтобы он знал когда запускать.
Еще нужно избежать того чтобы не устанавливать на сервер OUTLOOK!
Можно выбрать любой другой язык написания скрипта VBS/BAT/PS/CMD/C#/++
Заранее всех благодарю кто поможет в решений данной задачи!
P.S. если задача написано сумбурно простите комментируйте и постараюсь подробно описать.
Скачиваем EWS 2.2 и устанавливаем - http://www.microsoft.com/en-us/download/confirmation.aspx?id=42951
# Почтовый ящик
$ews = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService("Exchange2013_SP1")
$ews.Credentials = New-Object System.Net.NetworkCredential('UserName', 'P@$$w0rd1', "DOMAIN")
$ews.AutodiscoverUrl("bat@example.com")
# Папка входящие
$inboxFolderName = [Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox
$inboxFolder = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($ews,$inboxFolderName)
# Элементы
$itemView = New-Object -TypeName Microsoft.Exchange.WebServices.Data.ItemView(1000)
$dateTimeItem = [Microsoft.Exchange.WebServices.Data.ItemSchema]::DateTimeReceived
# Фильтр сегодня
$ToDay = (Get-Date).Date
$searchFilter = New-Object -TypeName Microsoft.Exchange.WebServices.Data.SearchFilter+IsGreaterThanOrEqualTo($dateTimeItem,$ToDay)
$foundItems = $ews.FindItems($inboxFolder.Id,$searchFilter,$itemView)
# Выполняем скрипт
$foundItems | Foreach {
$i = $_
if($i.Subject -match "Run") {
Invoke-Expression "C:\Script\script.bat"
$i.Delete("MoveToDeletedItems")
}
}
Kazun,
Добрый день, спасибо за помощь!
у меня возникли вопросы.
1. Установил EWS 2.2 , какие настройки надо ему, в службах запускать надо?
2. Этот скрипт мне надо настроить в планировщик?
3. в PS скрипте (("Exchange2013_SP1")) что нужно прописать?
1. Никакие
2. Не знаю, можете вручную, можете нанять человека, чтобы запускал
3. Логично, что версию Exchange сервера
https://msdn.microsoft.com/en-us/library/microsoft.exchange.webservices.data.exchangeversion(v=exchg.80).aspx
Exchange2007_SP1 Exchange Server 2007 Service Pack 1 (SP1).
Exchange2010 Exchange Server 2010.
Exchange2010_SP1 Exchange Server 2010 Service Pack 1 (SP1).
Exchange2010_SP2 Exchange Server 2010 Service Pack 2 (SP2).
Exchange2013 Exchange Server 2013.
Exchange2013_SP1 Exchange Server 2013 Service Pack 1 (SP1).
4. Для импорта модуля использовать
# Подключение модуля
Import-Module -Name "C:\Program Files\Microsoft\Exchange\Web Services\2.2\Microsoft.Exchange.WebServices.dll"
5. $i.Subject -match "Run" - запуск скрипта, если заголовок содержит слово Run
Kazun,
Я разобрался спасибо, вот только 2-е ошибки! :dont-know
Exception calling "Bind" with "2" argument(s): "Value cannot be null.
Parameter name: folderId"
At line:9 char:66
+ $inboxFolder = [Microsoft.Exchange.WebServices.Data.Folder]::Bind <<<< ($ews,$inboxFolderName)
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException
Exception calling "FindItems" with "3" argument(s): "The element at position 0 is invalid
Parameter name: parentFolderIds"
At line:19 char:29
+ $foundItems = $ews.FindItems <<<< ($inboxFolder.Id,$searchFilter,$itemView)
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException
Value cannot be null. - Предположительно проблема с $ews. Приведите вывод $ews.
Kazun,
Огромное спасибо :clapping: :yahoo:
Все получилось!
сам ошибку допустил: $inboxFolderName = [Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox #Входящие
Kazun,
А если дополнить?
1. К примеру когда запустит батник он письмо отправлял мне что скрипт запущен! и дальше продолжал работать!
2. А как быть если 3-сервера? они не будут ругаться и драться за одно письмо?
Спасибо заранее!
1. К примеру когда запустит батник он письмо отправлял мне что скрипт запущен! и дальше продолжал работать! - Добавить в батник команду для отправки письма, чтобы наверняка знать, что bat запустился
2. А как быть если 3-сервера? они не будут ругаться и драться за одно письмо? - Кто первый получил, тот и выполнил и в последующим удалил письмо. Вариантов много, например:
Отсылать три письма с разными темами, в которых есть указание сервера на котором выполняется( 1-Run, 2-Run)
Создать персональные почтовые ящики под каждый сервер
Выбрать основной сервер или любой другой, который будет проверять письмо и запускать батник на остальных серверах
Kazun,
Как можно применить последовательность для этого кода?
# Написать письмо о начале скрипта
$message = New-Object Microsoft.Exchange.WebServices.Data.EmailMessage -ArgumentList $ews
$message.Subject = 'тема'
$message.Body = 'начинка'
$message.ToRecipients.Add(‘получатель’)
$message.SendAndSaveCopy()
Этот код внутри выше написанного кода!
нужно так чтобы после проверки почты и после запуска скрипта он параллельно отправлял письмо (используя этот код или что лучше)
Модули и почтовый ящик уже выше используется
И в чем проблема?
Добавить код после строки - $i.Delete("MoveToDeletedItems").
Kazun,
Огромное спасибо =)
Kazun,
При выполнение скрипта # Написать письмо о начале скрипта
$message = New-Object Microsoft.Exchange.WebServices.Data.EmailMessage -ArgumentList $ews
$message.Subject = 'тема'
$message.Body = 'начинка'
$message.ToRecipients.Add(‘получатель’)
$message.SendAndSaveCopy()
выпадает ошибка
Name :
Address : получатель
RoutingType :
MailboxType :
Id :
MemberType : Method
OverloadDefinitions : {System.Void SendAndSaveCopy(Microsoft.Exchange.WebServices.Data.FolderId destinationFolderId), System.Void SendAndSaveCopy(Microsoft.Exchange.WebSer
vices.Data.WellKnownFolderName destinationFolderName), System.Void SendAndSaveCopy()}
TypeNameOfValue : System.Management.Automation.PSMethod
Value : System.Void SendAndSaveCopy(Microsoft.Exchange.WebServices.Data.FolderId destinationFolderId), System.Void SendAndSaveCopy(Microsoft.Exchange.WebServ
ices.Data.WellKnownFolderName destinationFolderName), System.Void SendAndSaveCopy()
Name : SendAndSaveCopy
IsInstance : True
Как бороться с этим? или аналог есть чтобы отправить почту.
с send-mailmessage не работает :help: :dont-know
Почему вывод результата команды $message.SendAndSaveCopy без скобок, когда должны быть со скобками, как выше $message.SendAndSaveCopy()?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.