надеюсь, кто-нибудь поможет мне разобраться, так как это немного сбивает меня с толку! [Я новичок, так что, пожалуйста, будьте нежны :) ]
Недавно я настроил скрипт PS для запуска запланированной задачей Windows при запуске, через пакетный файл для запуска с параметром -ExecutionPolicy Bypass. Цель состоит в том, чтобы отправить список неработающих автоматических служб в наш список рассылки sysadmin, чтобы мы могли вмешаться при необходимости.
Задача была развернута Group Policy Oject на ряде серверов Windows 2008, 2008 R2 и Windows 2012 R2. Задача выполняется как SYSTEM с наивысшими привилегиями, а наш лес/домен функционирует на уровне 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 "[email protected]" -to "[email protected]" -subject "$hst Automatic Services Check" -Attachments "c:\temp\$hst.txt" -body $msgbdy -priority High -smtpServer server.ourdomain.co.uk
Теперь скрипт работает, если его запустить непосредственно в командной строке PowerShell; он работает, если вы запустите пакетный файл, чтобы запустить его, как если бы вы запустили запланированную задачу; и он работает, если запустить его как запланированную задачу... хотя, как оказалось, это касается только примерно 75% наших машин.
Для остальных 25% единственная часть скрипта, которая не работает, это часть send-mailmessage. Текстовый файл создается в C:\temp с 'hostname' и т. д., чтобы определить, с какой машины он пришел, и его содержимое является точным. Они просто не завершают работу и не отправляют отчет по электронной почте (что является своего рода смыслом всего упражнения :)
Еще больше раздражает то, что эти «проблемные машины» отправляют электронное письмо, если я запускаю процесс, либо запустив пакетный файл, либо скрипт PowerShell напрямую, войдя на рабочий стол сервера с помощью своей учетной записи пользователя, поэтому я знаю, что они способны на это!
Будем признательны за любую помощь или потраченное на размышления время!
Спасибо,Джеймс
решение1
Кажется, я исправил это. Это не требовало ни аутентификации, ни безопасного соединения. Я сузил проблему до ошибки «Учетная запись 'DOMAIN\COMPUTER$' предоставила действительные учетные данные, но у нее нет разрешений на отправку на SMTP Receive connector 'Default Frontend MAILSERVER; не пройдена аутентификация». в журналах сервера Exchange 2013. Хотя сервер находился в диапазоне IP-адресов, по какой-то причине простая установка флажка Группы разрешений/Пользователи Exchange позволяла это сделать. Я не знаю, почему это было необходимо только для некоторых серверов, насколько это актуально, но это работает, и этого достаточно! Наша среда Exchange находится в середине миграции и в настоящее время в ней довольно беспорядок, поэтому можно сказать, что ответ кроется там.
Спасибо @Todd Wilcox за подсказки. Ура