Войти

Показать полную графическую версию : [решено] Запуск бат файла на сервере через эл. письмо


AZABAZA
13-04-2015, 13:23
Добрый день, всем

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

Задача: есть сервер1 там уже написан скрипт на BAT. компы все в AD. Есть Exchange.

Нужно при отправке письма от любого пользователя на определенного получателя (пример bat@example.com) он получает его обрабатывает если в сообщение содержится команда (пример fas/start =) ) то начинает работать скрипт. И так каждую

Можно автоматом очищать почту ну или как удобно чтобы он знал когда запускать.

Еще нужно избежать того чтобы не устанавливать на сервер OUTLOOK!

Можно выбрать любой другой язык написания скрипта VBS/BAT/PS/CMD/C#/++

Заранее всех благодарю кто поможет в решений данной задачи!

P.S. если задача написано сумбурно простите комментируйте и постараюсь подробно описать.

Kazun
13-04-2015, 14:37
Скачиваем 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")
}
}

AZABAZA
15-04-2015, 07:16
Kazun,
Добрый день, спасибо за помощь!

у меня возникли вопросы.

1. Установил EWS 2.2 , какие настройки надо ему, в службах запускать надо?
2. Этот скрипт мне надо настроить в планировщик?
3. в PS скрипте (("Exchange2013_SP1")) что нужно прописать?

Kazun
15-04-2015, 09:23
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

AZABAZA
15-04-2015, 10:13
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

Kazun
15-04-2015, 10:31
Value cannot be null. - Предположительно проблема с $ews. Приведите вывод $ews.

AZABAZA
15-04-2015, 10:40
Kazun,
Огромное спасибо :clapping: :yahoo:

Все получилось!

сам ошибку допустил: $inboxFolderName = [Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox #Входящие

AZABAZA
15-04-2015, 11:16
Kazun,

А если дополнить?

1. К примеру когда запустит батник он письмо отправлял мне что скрипт запущен! и дальше продолжал работать!
2. А как быть если 3-сервера? они не будут ругаться и драться за одно письмо?

Спасибо заранее!

Kazun
15-04-2015, 11:22
1. К примеру когда запустит батник он письмо отправлял мне что скрипт запущен! и дальше продолжал работать! - Добавить в батник команду для отправки письма, чтобы наверняка знать, что bat запустился

2. А как быть если 3-сервера? они не будут ругаться и драться за одно письмо? - Кто первый получил, тот и выполнил и в последующим удалил письмо. Вариантов много, например:

Отсылать три письма с разными темами, в которых есть указание сервера на котором выполняется( 1-Run, 2-Run)
Создать персональные почтовые ящики под каждый сервер
Выбрать основной сервер или любой другой, который будет проверять письмо и запускать батник на остальных серверах

AZABAZA
15-04-2015, 12:27
Kazun,

Спасибо :)

AZABAZA
17-04-2015, 12:01
Kazun,

Как можно применить последовательность для этого кода?
# Написать письмо о начале скрипта
$message = New-Object Microsoft.Exchange.WebServices.Data.EmailMessage -ArgumentList $ews
$message.Subject = 'тема'
$message.Body = 'начинка'
$message.ToRecipients.Add(‘получатель’)
$message.SendAndSaveCopy()

Этот код внутри выше написанного кода!
нужно так чтобы после проверки почты и после запуска скрипта он параллельно отправлял письмо (используя этот код или что лучше)
Модули и почтовый ящик уже выше используется

Kazun
17-04-2015, 12:08
И в чем проблема?

Добавить код после строки - $i.Delete("MoveToDeletedItems").

AZABAZA
17-04-2015, 12:28
Kazun,
Огромное спасибо =)

AZABAZA
27-04-2015, 14:11
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

Kazun
27-04-2015, 14:25
Почему вывод результата команды $message.SendAndSaveCopy без скобок, когда должны быть со скобками, как выше $message.SendAndSaveCopy()?




© OSzone.net 2001-2012