【问题标题】:Powershell Script to Start Service if it is Stopped and wait for minute and send an email notification如果服务已停止,则 Powershell 脚本启动服务并等待一分钟并发送电子邮件通知
【发布时间】:2015-07-27 11:28:12
【问题描述】:

我是 Powershell 的新手,在学习阶段,我尝试创建一个脚本来自动执行以下任务。这个脚本没有像我预期的那样工作。能否请您检查一下并给我一些帮助。

我的任务是,

我正在尝试找出处于停止状态的 SQL 服务(多个服务器中的多个 SQL 服务)并尝试启动它,等待一分钟以完成服务启动并再次验证服务状态。如果它仍然处于停止状态,我正在尝试发送电子邮件以设置人员以执行操作。

能否请您查看以下代码并纠正错误,我试图找到它但无法做到

#Define servers & Services Variables
$Servers = GC "E:\Bhanu\SQLServer.txt"
$Services = GC "E:\Bhanu\SQLService.txt"

#Function Call
Function ServiceStatus ($Servers, $Services)
{
    foreach ($Server in $Servers)
    {
        foreach ($Service in $Services)
        {
            $Servicestatus = get-service -ComputerName $Server -Name $Service
            if ($Servicestatus.Status -eq "Stopped")
            {
                Start-service $Service          
                Start-Sleep -Seconds 60            
                $ServiceStatus1 = Get-Service -ComputerName $Server -Name $Service
                if ($Servicestatus1.Status -eq "Stopped")
                {            
                FuncMail -To “abc@gmail.com” -From “abc@gmail.com” -Subject $Server + $Service "fails to Start, Take immediate Action to avoid Impact” -Body $ServiceName "Service fails to Start, Take immediate Action to avoid Impact” -smtpServer “servername”
                }
            }
        }
    }
}


function FuncMail 
{
    #param($strTo, $strFrom, $strSubject, $strBody, $smtpServer)
    param($To, $From, $Subject, $Body, $smtpServer)
    $msg = new-object Net.Mail.MailMessage
    $smtp = new-object Net.Mail.SmtpClient($smtpServer)
    $msg.From = $From
    $msg.To.Add($To)
    $msg.Subject = $Subject
    $msg.IsBodyHtml = 1
    $msg.Body = $Body
    $smtp.Send($msg)
}

servicestatus $Servers $Services

如果您需要我这里的任何东西,请告诉我

【问题讨论】:

  • 你已经定义了 serviceStatus 函数但从未调用过它
  • 您还没有告诉我们它的行为与您期望的不一样吗?
  • 需要更多关于此处是否发生错误的信息。此外,如果 Send-MailMessage cmdlet 已经可用,则不需要您的 FuncMail 函数。
  • 这不会影响您的代码,但我看起来您在 Start-Sleep 周围有多余的大括号,不需要在那里。当我注意到它们时,我试图清理多余的间距。
  • 您确定您在文本文件中使用的是实际服务名称而不是服务描述吗?例如“Windows Update”是描述,但服务的名称是“wuauserv”。您的姓名参考中的空格使我怀疑是这种情况。如果是这样,请更改文本文件以使用实际的服务名称,否则您将需要添加更多代码来查找基于描述的选择。

标签: sql-server powershell


【解决方案1】:

您好,这不是最好的方法,我正在快速进行。 注意 %=foreach 对象; ?=Where-对象。

如果您的 smtp 服务器需要身份验证,您必须将密码保存在一个文件中,否则不要使用 read-host -assecurestring | convertfrom-securestring | out-file "C:\Secure\Password.txt" 运行它

我还假设您将服务器保存在一个文件中。
我的解决方案是启动所有 sql server 服务,如果你想启动特定的,只需将服务名称保存在单独一行的一个文件中。

下面要执行的代码。

#Loading Server and service details
$Services=Get-content C:\PS\Service.txt
$servidores=get-content C:\PS\Servers\Servers.txt

#Loading Mail credential
$Mailpasswordpath="C:\PS\Securestring.txt"
$Mailusername="DOmain\User"
$password=cat $Mailpasswordpath |ConvertTo-Securestring
$Cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $Mailusername,$password


$servidores|Foreach-Object{Get-Service -ComputerName $_ -Name $Services }|  #Get the services running on all servers
Where-Object{$_.Status -eq "Stopped"}| #Which status is equal stopped
Foreach-Object{
     $_.Start(); #try to start
     Start-Sleep -Seconds 60;  #wait one minute
     $_.Refresh();  #refresh then service to update status

     #validate is status still stopped
     if($_.Status -eq "Stopped") 
     {
         #LOADING Mail details
         $To="user@domain.com"
         $subject="$($_.MachineName) $($_.Name)  fails to Start, Take immediate Action to avoid Impact"
         $From="ServiceStatus@domain.com"
         $smtp="Server.domain.com"
         $body="$($_.Name) Service fails to Start, Take immediate Action to avoid Impact"

         #Sending email to notify
         Send-MailMessage -To $To -Subject $subject  -From $From  -SmtpServer $smtp  -Body $body  -Credential $Cred
     }
}

P.S:这不是我只决定解决这个问题的最佳方法。如果你愿意,我们可以稍后一起创建一个函数,只需先测试它。

【讨论】:

  • 在向 Powershell 新手提供示例时,我绝对会建议您不要使用缩写或在一行中包含一堆命令
  • 我同意你的看法@Taegost。这就是为什么我在回答的基础上简要解释了缩写。我会根据你的建议改正。再次对所有想尝试这种方法的人表示抱歉。我认为一些鬼开始输入我的代码。 :)
  • @Taegost 我希望现在它比以前改进了一半,感谢您的提示我希望这个解决方案变得可读且用户友好
  • 嗨 Felicio,感谢您的帮助,我希望它会起作用,我会再次测试让您知道。
  • 费利西奥,你太棒了。是的 (SQL) (开始符号没有占用,不知道该怎么做)正在工作,它正在检查所有 SQL 服务。非常感谢。将检查我们的实际服务器并让您知道状态。感谢所有帮助我的人。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多