Надеюсь, кто-нибудь поможет мне понять это, потому что это немного влияет на мою голову! [Я новичок, будьте осторожны :)]
Недавно я настроил сценарий PS для запуска запланированной задачей Windows при запуске через пакетный файл для запуска с переключателем -ExecutionPolicy Bypass. Цель состоит в том, чтобы отправить список автоматических служб, которые не работают, в наш список рассылки системного администратора, чтобы мы могли вмешаться в случае необходимости.
Задача была развернута групповой политикой Oject на ряде серверов Windows 2008, 2008 R2 и Windows 2012 R2. Задача выполняется как СИСТЕМА с наивысшими привилегиями, а наш лес / домен работает на уровне Server 2012 R2. Сценарий запускается из UNC в нашей SAN и включает вывод localhost в C: \ temp (простой файл notepad.txt)
Вот сценарий: [По общему признанию, я новичок в PowerShell, поэтому я сколотил его из разных статей оттуда и там и сколотил вместе, пока не добился, чтобы он работал до приемлемого стандарта!]
#PowerScript task for reporting the name of any service with automatic startup mode that are not are running.
$Results = @()
$hst = hostname
$msgbdy = "This machine has restarted.
Check the attached file for any services with Automatic startup configuration that are not running.
[NB: Services configured to startup in Automatic (Delayed Start) are ignored]"
#GET AUTOMATIC (NOT DELAYED-START) SERVICES
$Results += Get-WmiObject -Class Win32_Service -Filter {State != 'Running' and StartMode = 'Auto'} |
ForEach-Object {Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\$($_.Name)" |
Where-Object {$_.Start -eq 2 -and $_.DelayedAutoStart -ne 1}} |
Select-Object -Property @{label='ServiceName';expression={$_.PSChildName}}
#OUTPUT TO TXT
$Results | Out-File "c:\temp\$hst.txt"
#PAUSE FOR 2 SECONDS
Start-Sleep -s 2
#SEND OUTPUT FILE BY EMAIL
send-mailmessage -from "$hst@ourdomain.co.uk" -to "systemadministrators@ourdomain.co.uk" -subject "$hst Automatic Services Check" -Attachments "c:\temp\$hst.txt" -body $msgbdy -priority High -smtpServer server.ourdomain.co.uk
Теперь сценарий работает, если он запускается непосредственно в командной строке PowerShell; он работает, если вы запускаете командный файл для его запуска, как если бы вы выполняли запланированное задание; и он работает, когда запускается как запланированная задача ... хотя оказывается, что это справедливо только для примерно 75% наших машин.
Для остальных 25% единственная часть скрипта, которая не работает, - это часть отправки сообщения электронной почты. Текстовый файл создается в C: \ temp с «именем хоста» и т. Д., Чтобы определить, с какой машины он находится, и его содержимое является точным. Они просто не закончат работу и не отправят отчет по электронной почте (что является своего рода смыслом всего упражнения :)
Что еще больше расстраивает, так это то, что эти "проблемные машины" отправят электронное письмо, если я запустил процесс, запустив пакетный файл или сценарий PowerShell напрямую, когда я вошел на рабочий стол сервера с моей учетной записью пользователя, поэтому я знаю, что они на это способны. !
Любая помощь или время, потраченное на рассмотрение, будут оценены!
Спасибо, Джеймс
Я вроде починил. Это не было ни аутентификацией, ни безопасным соединением. Я сузил проблему до ошибки «Учетная запись« ДОМЕН \ КОМПЬЮТЕР $ »предоставила действительные учетные данные, но не имеет разрешений на отправку для SMTP-соединителя приема« По умолчанию Frontend MAILSERVER; не удается выполнить аутентификацию ». в журналах сервера Exchange 2013. Хотя сервер находился в диапазоне IP-адресов, по какой-то причине простая установка флажка Группы разрешений / Пользователи Exchange позволяла это. Я не понимаю, почему это было необходимо только для некоторых серверов, насколько это актуально, но это работает, и этого достаточно! Наша среда Exchange находится в середине миграции и в настоящий момент довольно беспорядочная, поэтому она заставляет send, что ответ лежит там.
Спасибо @Todd Wilcox за указатели. Ура