获取 wmiobject win32:如何通过电子邮件发送输出

get wmiobject win32: how do I email the output

我已经准备好了一切,至少我是这么认为的。我想通过电子邮件将 Get-WmiObject win32 命令的输出发送给自己。示例:

$OS = "."
(Get-WmiObject Win32_OperatingSystem).Name |Out-String

 $secpasswd = ConvertTo-SecureString "mypassword" -AsPlainText -Force
    $mycreds = New-Object System.Management.Automation.PSCredential 
("support@myemail.com", $secpasswd)

    Send-MailMessage -To "support@myemail.com" -SmtpServer 
"smtp.office365.com" -Credential $mycreds -UseSsl "Backup Notification" -
Body $body -From "support@myemail.com"

我试过以下方法:

$body = (
  Write-Host "Computer Info:" -Message $PCinfo
  ) -join "`r`n"
    Write-Verbose -Message $body

即returns错误:"Cannot validate argument on parameter 'Body'. The argument is null or empty."

如有任何指导、建议或示例,我们将不胜感激。 谢谢

Write-Host 绕过通常的 PowerShell 数据路由(管道);您可能需要查看 Get-Help Out-String or Get-Help Out-Default 以寻找可能的替代方案。

在使用 Write-Host 绕过管道时,您将分配留给 $body "empty" - 也就是说,没有数据分配给变量。由于 $null 是变量的合法值,因此不会抛出错误,直到在不允许空值的上下文中使用该变量(例如 Send-MailMessage)。

这种格式给你一些更丰富的信息。这将获取 Win32_OperatingSystem class 的内容并将其转换为 HTML table,将其附加到 $body 变量,并使用 "Computer Info:"上面的文字:

$body = "Computer Info: <br>"
$body += Get-WmiObject -Class Win32_OperatingSystem | ConvertTo-HTML -Fragment

通过将 $body 传输到 Out-String,有效地重新创建 $body。这确保它是一个字符串对象,Send-MailMessage-Body 参数需要:

$Body = $Body | Out-String

最后,调用 Send-MailMessage 时使用 -BodyAsHTML 参数确保电子邮件作为 HTML 电子邮件发送:

Send-MailMessage -To "support@myemail.com" -From "support@myemail.com" -SmtpServer "smtp.office365.com" -Credential $mycreds -UseSsl "Backup Notification" -Body $body -BodyAsHTML