使用 PowerShell 验证 Windows 服务是否未运行,并发送包含信息的电子邮件

Using PowerShell to verify if a Windows Service isn't running and send an email with information

提问人:SuperZee 提问时间:8/8/2023 最后编辑:SuperZee 更新时间:8/9/2023 访问量:157

问:

我已经创建了这个 powershell 代码。 它运行并发送一封电子邮件,其中包含每台远程计算机、服务的详细信息以及似乎是状态。

但是,服务名称和状态似乎无法正常工作。此脚本的输出告诉我找不到该服务。但是,我已经通过在同一台机器上运行它来检查这一点,我运行了这个完整的脚本来验证服务是否存在并确定实际服务的状态;

Get-Service -ComputerName machine1 -Name MyService

我的完整 PowerShell 脚本如下;

# Define the list of machine names where the service should be checked
$machineNames = @("machine1","machine2")  # Add more machine names as needed

# Define the service name to check
$serviceName = "MyService"

# Function to check service status on a specific machine
function Get-ServiceStatus {
param (
    [string]$machineName,
    [string]$service
)

$serviceStatus = Get-Service -ComputerName $machineName -Name $service -ErrorAction 
SilentlyContinue
if ($serviceStatus) {
    return $serviceStatus.Status
} else {
    return "Service Not Found"
}
}

# Initialize an empty array to store information about services that are not running
$notRunningServices = @()

# Check the service status on each machine
foreach ($machine in $machineNames) {
$status = Get-ServiceStatus -machineName $machine -service $serviceName
if ($status -ne "Running") {
    $notRunningServices += [PSCustomObject]@{
        MachineName = $machine
        ServiceName = $serviceName
        Status = $status
    }
}
}

# If there are services not running, send an email
if ($notRunningServices.Count -gt 0) {
$smtpServer = "smtp.server.com"
$smtpPort = 25
$fromAddress = "[email protected]"  
$toAddress = "[email protected]"

$emailSubject = "MyService Service Status - Not Running"
$emailBody = "The following services are not running:`r`n`r`n"

foreach ($service in $notRunningServices) {
    $emailBody += "Server: $($service.MachineName)`r`nService: 
$($service.ServiceName)`r`nStatus: $($service.Status)`r`n`r`n"
}

Send-MailMessage -From $fromAddress -To $toAddress -Subject $emailSubject -Body $emailBody - 
SmtpServer $smtpServer -Port $smtpPort
}

我需要解析 powershell 脚本以标识每台计算机上的远程服务名称。

电子邮件的副本在这里;

以下服务未运行:

服务器:machine1 服务:MyService 状态:未找到服务

服务器:machine2 服务:MyService 状态:未找到服务

如果有人能帮忙,将不胜感激。

提前致谢

注意:感谢 https://stackoverflow.com/users/21272873/toddy-s,他说我通过计划任务运行它是正确的。

PowerShell 服务器 服务 sendmail

评论

0赞 mklement0 8/9/2023
知道涉及计划任务当然是应该预先提及的关键信息。仅凭这一点,仅仅诊断您的问题是不够的。您的代码盲目地假设没有从中获取结果等同于“找不到服务”,这不一定是真的,并且可能掩盖了真正的问题。Get-Service

答:

0赞 Toddy 8/8/2023 #1

我测试了您的脚本,它在我的测试环境中工作。

检查成员服务器 (TESTSRV) 和 ActiveDirectoryWebService (ADWS) 的 DC (TESTDC) 的结果:

$notRunningServices    

MachineName ServiceName Status           
----------- ----------- ------           
TESTSRV     ADWS        Service Not Found

我假设您将其作为计划任务运行。

也许是权限问题?


更新:

如果要访问任务计划程序启动的脚本中的网络资源,则必须使用具有足够权限的用户帐户启动任务。

默认帐户“System”仅允许访问本地服务器。

您可以在任务的“常规”选项卡上更改此设置。

评论

0赞 mklement0 8/9/2023
虽然你的帖子中有很好的信息,鼓励OP澄清他们的问题,但它本身并不是一个答案,更适合以评论的形式发布(后者需要50分或更高的声誉水平)。
0赞 Community 8/14/2023
您的答案可以通过其他支持信息进行改进。请编辑以添加更多详细信息,例如引文或文档,以便其他人可以确认您的答案是正确的。您可以在帮助中心找到有关如何写出好答案的更多信息。