Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Запуск бат файла на сервере через эл. письмо (http://forum.oszone.net/showthread.php?t=298291)

AZABAZA 13-04-2015 13:23 2495083

Запуск бат файла на сервере через эл. письмо
 
Добрый день, всем

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

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

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

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

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

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

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

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

Kazun 13-04-2015 14:37 2495104

Скачиваем EWS 2.2 и устанавливаем - http://www.microsoft.com/en-us/downl....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 2495878

Kazun,
Добрый день, спасибо за помощь!

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

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

Kazun 15-04-2015 09:23 2495905

1. Никакие
2. Не знаю, можете вручную, можете нанять человека, чтобы запускал
3. Логично, что версию Exchange сервера

https://msdn.microsoft.com/en-us/lib...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 2495939

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 2495952

Value cannot be null. - Предположительно проблема с $ews. Приведите вывод $ews.

AZABAZA 15-04-2015 10:40 2495960

Kazun,
Огромное спасибо :clapping: :yahoo:

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

сам ошибку допустил:
Код:

$inboxFolderName = [Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox #Входящие

AZABAZA 15-04-2015 11:16 2495990

Kazun,

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

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

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

Kazun 15-04-2015 11:22 2495995

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

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

AZABAZA 15-04-2015 12:27 2496028

Kazun,

Спасибо :)

AZABAZA 17-04-2015 12:01 2497050

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 2497055

И в чем проблема?

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

AZABAZA 17-04-2015 12:28 2497073

Kazun,
Огромное спасибо =)

AZABAZA 27-04-2015 14:11 2501351

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 2501356

Почему вывод результата команды $message.SendAndSaveCopy без скобок, когда должны быть со скобками, как выше $message.SendAndSaveCopy()?


Время: 18:56.

Время: 18:56.
© OSzone.net 2001-