gpt4 book ai didi

powershell - Windows Service Recovery,无法执行PS脚本

转载 作者:行者123 更新时间:2023-12-02 23:57:02 26 4
gpt4 key购买 nike

作业系统:Win 2012 R2

你好

我尝试设置某些服务,以便当它们第二次失败时,将触发Powershell脚本向某些人发送电子邮件。这是通过services > (specific service) > properties > recovery完成的。

尝试了几乎所有可能的程序组合:Powershell.exeC:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe与最后一个相同,但大写字母“P”。

命令行参数:-NoProfile -Executionpolicy bypass C:\users\username\appdata\local\myscript.ps1,脚本路径之后的参数。

脚本未签名。

现在,我的脚本使用了Send-MailMessage,并且使用ConvertFrom-SecureString保存了密码,并且我认为实际运行脚本的服务/用户可能无法解密密码,因为它是使用我的管理员帐户创建的。

我尝试使用与要监视的进程相同的服务帐户登录,并从其用户创建加密的密码文件,然后将其保存在不需要该用户为admin(即%localappdata%)但脚本的路径中当我在pskill上使用PID时,仍然无法触发。

在PS中手动执行命令时,一切正常,没有任何提示。它确实做了它应该做的。

现在,我对Windows管理场景还很陌生,那么哪个userservice实际上触发了PowerShell脚本?运行服务的身份是否相同,即我指定的特定服务帐户?或者是别的什么?

我将在这里高兴地发布代码,但是它在我的另一台计算机上,稍后将对此进行更新。谷歌搜索了数小时并尝试了几乎所有内容,但是我可能会缺少一些基本内容。

非常感谢您的帮助-TheSwede86

编辑:这是代码,我也尝试了Ronald Rink'd-fens'的建议,当我手动执行脚本时(使用我的用户名显示事件),但是当我尝试模拟服务失败时,它记录了用户。

$PSEmailServer = "<address to smtp-server>"
$SMTPPort = <port>
$SMTPUsername = "<email-address to send from>"
$EncryptedPasswordFile = "<path and filename to pwd-file, currently on C:\>.securestring"
$SecureStringPassword = Get-Content -Path $EncryptedPasswordFile | ConvertTo-SecureString
$EmailCredential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $SMTPUsername,$SecureStringPassword
$MailTo = "<email-address to mail to>"
$MailFrom = $SMTPUsername
$hostname = Hostname
$service = Get-Service -Name "<Servicename*>" | Where-Object {$_.Status -eq "Stopped"}
$MailSubject = "ALERT: Service on $hostname has stopped and failed to restart after one attempt"
$MailBody = "$service"
$OtherEmail = "<Other email-address to send to>"
$whoami = whoami
Send-MailMessage -From $MailFrom -To $MailTo -Bcc $OtherEmail -Subject $MailSubject -Body $MailBody -Port $SMTPPort -Credential $EmailCredential -UseSsl -Priority High
Write-EventLog –LogName Application –Source “PowerShell Script Debug” –EntryType Information –EventID 1 -Message $whoami

编辑的电子邮件地址,SMTP服务器等

编辑1:添加了尝试记录执行脚本的用户的信息。

编辑2:@Ronald Rink'd-fens'

我尝试了以下方法:
$PlainPassword = "<passwordForEmailToSendFrom>"
$SecurePassword = $PlainPassword | ConvertTo-SecureString -AsPlainText -Force | Out-File -FilePath C:\temp\<filename>.securestring

我让服务一次失败,因此它将把纯文本密码转换为安全字符串文件,然后在脚本中调用该文件。这是行不通的。

如果我尝试您的建议:

1)
$password = "<passwordForEmailToSendFrom>" | ConvertTo-SecureString -asPlainText -Force
$username = "<domain\serviceAccountWhichRunsTheService>"
$credential = New-Object System.Management.Automation.PSCredential($username,$password)

$credential | Export-CliXml C:\temp\credential.xml

它在我选择的路径中成功创建了“credential.xml”

2)
$credential = Import-CliXml C:\temp\credential.xml
$decryptedCredential = "{0} - {1}" -f $credential.UserName, $credential.GetNetworkCredential().Password
$decryptedCredential | Out-File C:\temp\ServiceRecovery.txt -Append -Force

我在“ServiceRecovery.txt”中得到未加密的密码,但是没有SYSTEM。

我在本地“管理员”组中添加了“系统”,然后重试;
它只是将另一行添加到“ServiceRecovery.txt”中,并使用我在“1”中指定的用户名和未加密的密码。

但是,当我尝试使用您的脚本来确定哪个用户实际运行了脚本,而那个用户确实是“SYSTEM”时,我获得了成功。

很抱歉,我的解释不好,已经坐了几个小时试图对最后的内容进行排序,但无法这样做。

编辑3:

感谢@Ronald Rink'd-fens',我这样解决了它:
New-Object System.Management.Automation.PSCredential("<EmailAddressToSendFrom>", (ConvertTo-SecureString -AsPlainText -Force "<PasswordForAboveEmailAccount>")) | Export-CliXml C:\temp\MyCredential.xml

上面的代码将未加密的密码转换为使用API​​(DPAPI)加密的密码,仅可用于创建该密码的帐户/计算机!

使用上述脚本让服务一次失败,以使用SERVICE帐户生成文件
$PSEmailServer = "<smtp-address>"
$SMTPPort = <port>
$SMTPUsername = "<EmailAddressToSendFrom>"
$credpath = Import-Clixml -Path C:\temp\MyCredential.xml
$MailTo = "<EmailAddressToSendTo>"
$MailFrom = $SMTPUsername
$hostname = Hostname
$service = Get-Service -Name "<Servicename(s)>" | Where-Object {$_.Status -eq "Stopped"} | Select-Object -Property DisplayName | Out-String
$MailSubject = "ALERT: Service on $hostname has stopped and failed to restart after one attempt"
$MailBody = $service
$OtherEmail = "<AnotherEmailAddressToSendTo>"
Send-MailMessage -From $MailFrom -To $MailTo -Bcc $OtherEmail -Subject $MailSubject -Body $MailBody -Port $SMTPPort -Credential $credpath -UseSsl -Priority High

上面是服务失败时将运行的实际脚本

服务>恢复中的参数为:

程序:C:\ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe

命令行参数:
-文件C:\ temp \ myscriptname.ps1

启用错误停止操作

首次失败:重新启动服务

第二次失败:运行程序

最佳答案

您输入的在发生故障时运行的脚本似乎不是在服务帐户下运行(也不在您的管理员帐户下),而是在操作系统帐户下运行。您可以通过在服务失败后在执行时从脚本内记录用户名来验证这一点(使用Write-EventLog或将其保存到文本文件中)。

这是如何验证脚本在本地系统下运行的示例:

# C:\src\TEMP\ServiceRecovery.ps1

cd C:\src\TEMP\
$ENV:USERNAME | Out-File C:\src\TEMP\ServiceRecovery.txt -Append -Force

您可以按照以下屏幕截图所示配置服务:

Service Settings LogOn

Service Recovery

服务帐户是这样创建的:
PS > net user ServiceAccount P@ssw0rdP@ssw0rd /ADD
PS > net localgroup Administrators ServiceAccount /ADD

如果然后通过调用 Stop-Process -Name teamviewer_service -Force停止该过程,则可以在生成的文本文件中看到以下名称:
SYSTEM

这意味着您将必须通过 SYSTEM帐户而不是您的个人用户或服务用户帐户来加密安全字符串,或者您必须采用其他方式读取加密的密码。

通过创建用于创建密码并以加密形式存储的脚本,可以通过服务帐户对密码进行加密。将此脚本放入服务恢复设置中,并使该服务一次失败。然后删除脚本并插入您的原始脚本,该脚本将能够导入加密的密码。

在这里,您可以找到用于测试的脚本:

(1)用于加密凭证的脚本
# Creating a PS Credential from a Clear Text Password in Powershell
# https://blogs.technet.microsoft.com/gary/2009/07/23/creating-a-ps-credential-from-a-clear-text-password-in-powershell/

$password = "P@ssw0rdP@ssw0rd" | ConvertTo-SecureString -asPlainText -Force
$username = ".\ServiceAccount"
$credential = New-Object System.Management.Automation.PSCredential($username,$password)

$credential | Export-CliXml C:\src\TEMP\credential.xml

(2)解密凭证的脚本
$credential = Import-CliXml C:\src\TEMP\credential.xml
$decryptedCredential = "{0} - {1}" -f $credential.UserName, $credential.GetNetworkCredential().Password
$decryptedCredential | Out-File C:\src\TEMP\ServiceRecovery.txt -Append -Force

现在生成的文本文件包含
.\ServiceAccount - P@ssw0rdP@ssw0rd

注意:第一个“加密”脚本包含一个纯文本密码,该密码仅用于加密一次。为了在 SYSTEM帐户下运行,我们必须采用这种方式。一种替代方法是使用SysInternals中的 RunAs

关于powershell - Windows Service Recovery,无法执行PS脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42726658/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com