¡Ojalá alguien pueda ayudarme a comprender esto, ya que me está afectando un poco la cabeza! [Soy nuevo, así que sea amable :)]
Recientemente configuré un script PS para ejecutarlo mediante la tarea programada de Windows al inicio, mediante un archivo por lotes para ejecutarlo con el modificador -ExecutionPolicy Bypass. El objetivo es enviar una lista de Servicios Automáticos que no se están ejecutando a nuestra lista de distribución de administrador de sistemas para que podamos intervenir si es necesario.
La tarea ha sido implementada por Group Policy Oject en varios servidores Windows 2008, 2008 R2 y Windows 2012 R2. La tarea se ejecuta como SISTEMA con los privilegios más altos y nuestro bosque/dominio funciona en el nivel del Servidor 2012 R2. El script se ejecuta desde un UNC en nuestra SAN e implica una salida del host local a C:\temp (un archivo notepad.txt simple)
Aquí está el guión: [Es cierto que soy bastante novato con PowerShell, así que lo improvisé a partir de varios artículos de aquí y allá y lo junté hasta que conseguí que funcionara a un nivel aceptable.]
#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
Ahora, el script funciona si se ejecuta directamente en el indicador de PowerShell; funciona si ejecuta el archivo por lotes para activarlo, como lo haría con una tarea programada; y funciona cuando se activa como una tarea programada... aunque resulta que este es sólo el caso de alrededor del 75% de nuestras máquinas.
Para el otro 25%, la única parte del script que no funciona es la parte de enviar mensaje de correo. El archivo de texto se crea en C:\temp con el 'nombre de host', etc. para identificar de qué máquina proviene y el contenido es preciso. Simplemente no terminan el trabajo y envían el informe por correo electrónico (que es el objetivo de todo el ejercicio :)
Lo que es más frustrante es que estas "máquinas problemáticas" enviarán el correo electrónico si activo el proceso ejecutando el archivo por lotes o el script de PowerShell directamente cuando inicie sesión en el escritorio del servidor con mi cuenta de usuario, por lo que sé que son capaces de hacerlo. !
¡Cualquier ayuda o tiempo dedicado a considerarlo sería apreciado!
Gracias, James
Respuesta1
Parece que lo he solucionado. No se requería autenticación ni conexión segura. Reduje el problema al error "La cuenta 'DOMINIO\COMPUTER$' proporcionó credenciales válidas, pero no tiene permisos de envío en el conector de recepción SMTP 'SERVIDOR DE CORREO frontal predeterminado; autenticación fallida". en los registros de Exchange 2013 Server. Aunque el servidor estaba en el rango de IP, por alguna razón, simplemente marcar la casilla Grupos de permisos/Usuarios de Exchange lo permitía. No sé por qué esto fue necesario solo para algunos de los servidores, ni qué tan relevante es, pero funciona y ¡es suficiente! Nuestro entorno de Exchange se encuentra en medio de la migración y es bastante desordenado en este momento, por lo que indica que la respuesta está ahí.
Gracias @Todd Wilcox por los consejos. Salud