PowerShellでコンソール出力を統合し、HTML形式の電子メールとして送信するにはどうすればよいですか

Kismet Agbasi

良い一日の人々、

私は、自分の管理下にあるWindowsシステムでローカル管理者パスワードを管理するというありふれた管理タスクを自動化することを主な目的として、このスクリプト元々はSitaram Pamarthiによって作成されたを適応させようとしています。これまでのところ、スクリプトは機能しています-パスワードを変更して電子メール出力を取得することができます(テキスト形式ではありますが)-しかし、まだ完全には機能していません。

これは私のスクリプトからの抜粋です:

完全なスクリプトは、完全なコンテキストでここから入手できます。

$Computers = Get-Content -Path $InputFile

#Now let's loop through each computer and change the specified account password.
ForEach ($Computer in $Computers) {

    $Computer   =   $Computer.ToUpper()
    $IsOnline   =   "OFFLINE"
    $Status     =   "SUCCESS"

    Write-Verbose "Working on $Computer"
    If((Test-Connection -ComputerName $Computer -count 1 -ErrorAction 0)) {
        $IsOnline = "ONLINE"
        Write-Verbose "`t$Computer is Online"
    } Else { Write-Verbose "`t$Computer is OFFLINE" }

    Try {
        $Account = [ADSI]("WinNT://$Computer/$TargetAccount,user")
        $Account.psbase.invoke("setpassword",$Pwd1_Text)
        Write-Verbose "`tPassword Change completed successfully"
    }
    Catch {
        $Status = "FAILED"
        Write-Verbose "`tFailed to Change the password for $TargetAccount on $Computer. Error: $_"
        $StatsError = "$_"
    }

    $Obj = New-Object -TypeName PSObject -Property @{
        Date = "$(Get-Date)"
        ComputerName = $Computer
        IsOnline = $IsOnline
        PasswordChangeStatus = $Status
        DetailedStatus = $StatsError
    }

    $Obj | Format-Table ComputerName, Date, IsOnline, PasswordChangeStatus, DetailedStatus -AutoSize
    $Obj | Select-Object "ComputerName", "Date", "IsOnline", "PasswordChangeStatus", "DetailedStatus" | Export-Csv -Append -Path ".\output.csv" -NoTypeInformation

    If($Status -eq "FAILED" -or $IsOnline -eq "OFFLINE") {
        $Stream.Writeline("$Computer `t $IsOnline `t $Status")
    }
}

#Finally, let's close the Stream Writer, write the stream to the text file
#and notify the user of the location of the FailedComputers log file
$Stream.Close()
Write-Host "`n`nFailed computers list is saved to $FailedComputers"
$ScriptEndDate = $(Get-Date)

#Send an email log of what was done
$MsgBody = @"

Dear IT Admins,

Please be advised that the local admin account password for [ $TargetAccount ] has been changed
successfully on the following hosts:

Action Initiated by:  `t$([System.Security.Principal.WindowsIdentity]::GetCurrent().Name)
Script Started:  `t$ScriptStartDate
Script Ended:  `t$ScriptEndDate

"@
Send-MailMessage -Body $MsgBody -Verbose

# Finally, let's clear the default parameters we set earlier
$PSDefaultParameterValues.Clear()

#END SCRIPT

スクリプトは現在、次のようにPowerShellコンソールに出力します。

ComputerName Date                IsOnline PasswordChangeStatus DetailedStatus
------------ ----                -------- -------------------- --------------
HOME2        02/10/2019 06:18:20 ONLINE   FAILED               Exception calling "Invoke" with "2" argument(s): "Access is denied....



ComputerName Date                IsOnline PasswordChangeStatus DetailedStatus
------------ ----                -------- -------------------- --------------
HOME3        02/10/2019 06:18:22 ONLINE   FAILED               Exception calling "Invoke" with "2" argument(s): "Access is denied....



ComputerName Date                IsOnline PasswordChangeStatus DetailedStatus
------------ ----                -------- -------------------- --------------
HOME4        02/10/2019 06:18:29 OFFLINE  FAILED               Exception calling "Invoke" with "2" argument(s): "The network path was not found....

だから私の質問-電子メールの本文に含めることができるように、スクリプトを次のように(オンラインホストとオフラインホストの両方に単一のヘッダー行を使用して)統合するにはどうすればよいですか?

ComputerName Date                IsOnline PasswordChangeStatus DetailedStatus
------------ ----                -------- -------------------- --------------
HOME2        02/10/2019 06:18:20 ONLINE   FAILED               Exception calling "Invoke" with "2" argument(s): "Access is denied....
HOME3        02/10/2019 06:18:22 ONLINE   FAILED               Exception calling "Invoke" with "2" argument(s): "Access is denied....
HOME4        02/10/2019 06:18:29 OFFLINE  FAILED               Exception calling "Invoke" with "2" argument(s): "The network path was not found....

なんらかの方法でコンソール出力をテーブルに変換してから、電子メールメッセージにスタイルを適用するために、Send-MailMessageコマンドレットに渡すことができるヘッダー変数にCSSを含める必要があると思います。しかし、私はこれを達成する方法をまだ理解していないので、このプラットフォームからの助けをいただければ幸いです。

皆さん、ありがとうございました!

メッツ

ゲームに少し遅れますPSObjectsが、すべてを収集/保存してArrayListから、を適用する必要がありますFormat-Tableこの例は期待どおりに機能します。コンピューターがオンラインであるかどうかをテストし、パスワード変更コードにコメントを付けています。

$Computers = @('SERVERA', 'SERVERB')

[System.Collections.ArrayList] $res = New-Object -TypeName "System.Collections.ArrayList"

#Now let's loop through each computer and change the specified account password.
ForEach ($Computer in $Computers) {

    $Computer   =   $Computer.ToUpper()
    $IsOnline   =   "OFFLINE"
    $Status     =   "SUCCESS"

    Write-Verbose "Working on $Computer"
    If((Test-Connection -ComputerName $Computer -count 1 -ErrorAction 0)) {
        $IsOnline = "ONLINE"
        Write-Verbose "`t$Computer is Online"
    } Else { Write-Verbose "`t$Computer is OFFLINE" }

    <#
    Try {
        $Account = [ADSI]("WinNT://$Computer/$TargetAccount,user")
        $Account.psbase.invoke("setpassword",$Pwd1_Text)
        Write-Verbose "`tPassword Change completed successfully"
    }
    Catch {
        $Status = "FAILED"
        Write-Verbose "`tFailed to Change the password for $TargetAccount on $Computer. Error: $_"
        $StatsError = "$_"
    }
    #>

    $Obj = New-Object -TypeName PSObject -Property @{
        Date = "$(Get-Date)"
        ComputerName = $Computer
        IsOnline = $IsOnline
        PasswordChangeStatus = $Status
        DetailedStatus = $StatsError
    }

    $res.Add($Obj)

    #$Obj | Format-Table ComputerName, Date, IsOnline, PasswordChangeStatus, DetailedStatus -AutoSize
    #$Obj | Select-Object "ComputerName", "Date", "IsOnline", "PasswordChangeStatus", "DetailedStatus" | Export-Csv -Append -Path ".\output.csv" -NoTypeInformation

    If($Status -eq "FAILED" -or $IsOnline -eq "OFFLINE") {
        $Stream.Writeline("$Computer `t $IsOnline `t $Status")
    }
}

$res.ToArray() | Format-Table ComputerName, Date, IsOnline, PasswordChangeStatus, DetailedStatus -AutoSize

#This will output 1 file, with all the computers in it, with only 1 set of headers.
$res.ToArray() | Select-Object "ComputerName", "Date", "IsOnline", "PasswordChangeStatus", "DetailedStatus" | Export-Csv -Append -Path ".\output.csv" -NoTypeInformation

このような結果が得られます

ComputerName Date                IsOnline PasswordChangeStatus DetailedStatus
------------ ----                -------- -------------------- --------------
SERVERA      02/11/2019 11:05:57 ONLINE   SUCCESS
SERVERB      02/11/2019 11:05:57 ONLINE   SUCCESS

Format-Tableコマンドレットを実行し続けるため、コンソールは同じオブジェクトタイプを出力することを認識していないと思います。したがって、複数回呼び出しているため、出力テーブルがコンソールに対して明示的に解析されていることを確認する必要があります。配列に物があり、Format-Table1回だけ呼び出すと、次のように期待される結果が得られます。

私もExport-Csvあなたのforeachから移動し、それも期待どおりに機能することに注意してください

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Linuxコマンドラインを使用してファイルを電子メールの添付ファイルとして送信するにはどうすればよいですか?

分類Dev

crontabを使用して電子メールを送信するときに件名を変更するにはどうすればよいですか?

分類Dev

crontabを使用して電子メールを送信するときに件名を変更するにはどうすればよいですか?

分類Dev

crontabを使用して電子メールを送信するときに件名を変更するにはどうすればよいですか?

分類Dev

juliaコンソールで取得したものと同じ印刷形式をjuliaコード内で出力するにはどうすればよいですか?

分類Dev

電子メールを1つのメッセージとして送信する前に、最初にコンテンツをバインドするにはどうすればよいですか?

分類Dev

電子メールを1つのメッセージとして送信する前に、最初にコンテンツをバインドするにはどうすればよいですか?

分類Dev

内容を表のような形式で表示したPDFを電子メールで送信するにはどうすればよいですか?

分類Dev

すべてのフォーム入力を取得して電子メールに送信するにはどうすればよいですか?

分類Dev

データベースレポートをcsvシートとして電子メールに送信するにはどうすればよいですか?

分類Dev

シートの特定の部分を電子メールとして送信するにはどうすればよいですか?

分類Dev

コンソール出力を電子メールに送信するにはどうすればよいですか?

分類Dev

コードを変更して、コンソールに出力し、Powershellの出力ログに出力するにはどうすればよいですか?

分類Dev

OPENSSLを使用して電子メールメッセージに署名し、CURLを使用して送信するにはどうすればよいですか?

分類Dev

電子メールチャネルを使用するときに、通知をNotifierを使用してHTMLとしてコンテンツとして送信するにはどうすればよいですか?

分類Dev

PHPを使用してPDF添付ファイル付きの電子メールを送信するにはどうすればよいですか?

分類Dev

deviseを使用して電子メールのみを更新するにはどうすればよいですか?

分類Dev

MFMailComposeViewContollerを使用してPDFを電子メールで送信するにはどうすればよいですか?

分類Dev

VB.NETを使用して送信された電子メール出力の「=」記号を削除するにはどうすればよいですか?

分類Dev

summernoteとlaravelを使用してhtml電子メールを送信するときにhtmlentitesを停止するにはどうすればよいですか?

分類Dev

HTML以外の電子メールを太字で送信するにはどうすればよいですか?

分類Dev

mpackを使用して、コマンドラインから電子メールの添付ファイルとしてHTMLファイルを送信するにはどうすればよいですか?

分類Dev

電子メール クライアントを使用して電子メールを送信するにはどうすればよいですか。

分類Dev

C#を使用してstringbuilderクラスの出力を電子メールで送信するにはどうすればよいですか?

分類Dev

NLogを使用して電子メールを送信するにはどうすればよいですか?

分類Dev

SendGrid API v3を介してテンプレート化された電子メールを送信するにはどうすればよいですか?

分類Dev

VBAを使用して、選択したExcelセルをHTML形式の電子メール本文に送信するにはどうすればよいですか?

分類Dev

保存したBLOBを添付ファイルとして電子メールで送信するにはどうすればよいですか?

分類Dev

mailgun、taskqueue、ndbを使用して重複する電子メールを送信しないようにするにはどうすればよいですか?

Related 関連記事

  1. 1

    Linuxコマンドラインを使用してファイルを電子メールの添付ファイルとして送信するにはどうすればよいですか?

  2. 2

    crontabを使用して電子メールを送信するときに件名を変更するにはどうすればよいですか?

  3. 3

    crontabを使用して電子メールを送信するときに件名を変更するにはどうすればよいですか?

  4. 4

    crontabを使用して電子メールを送信するときに件名を変更するにはどうすればよいですか?

  5. 5

    juliaコンソールで取得したものと同じ印刷形式をjuliaコード内で出力するにはどうすればよいですか?

  6. 6

    電子メールを1つのメッセージとして送信する前に、最初にコンテンツをバインドするにはどうすればよいですか?

  7. 7

    電子メールを1つのメッセージとして送信する前に、最初にコンテンツをバインドするにはどうすればよいですか?

  8. 8

    内容を表のような形式で表示したPDFを電子メールで送信するにはどうすればよいですか?

  9. 9

    すべてのフォーム入力を取得して電子メールに送信するにはどうすればよいですか?

  10. 10

    データベースレポートをcsvシートとして電子メールに送信するにはどうすればよいですか?

  11. 11

    シートの特定の部分を電子メールとして送信するにはどうすればよいですか?

  12. 12

    コンソール出力を電子メールに送信するにはどうすればよいですか?

  13. 13

    コードを変更して、コンソールに出力し、Powershellの出力ログに出力するにはどうすればよいですか?

  14. 14

    OPENSSLを使用して電子メールメッセージに署名し、CURLを使用して送信するにはどうすればよいですか?

  15. 15

    電子メールチャネルを使用するときに、通知をNotifierを使用してHTMLとしてコンテンツとして送信するにはどうすればよいですか?

  16. 16

    PHPを使用してPDF添付ファイル付きの電子メールを送信するにはどうすればよいですか?

  17. 17

    deviseを使用して電子メールのみを更新するにはどうすればよいですか?

  18. 18

    MFMailComposeViewContollerを使用してPDFを電子メールで送信するにはどうすればよいですか?

  19. 19

    VB.NETを使用して送信された電子メール出力の「=」記号を削除するにはどうすればよいですか?

  20. 20

    summernoteとlaravelを使用してhtml電子メールを送信するときにhtmlentitesを停止するにはどうすればよいですか?

  21. 21

    HTML以外の電子メールを太字で送信するにはどうすればよいですか?

  22. 22

    mpackを使用して、コマンドラインから電子メールの添付ファイルとしてHTMLファイルを送信するにはどうすればよいですか?

  23. 23

    電子メール クライアントを使用して電子メールを送信するにはどうすればよいですか。

  24. 24

    C#を使用してstringbuilderクラスの出力を電子メールで送信するにはどうすればよいですか?

  25. 25

    NLogを使用して電子メールを送信するにはどうすればよいですか?

  26. 26

    SendGrid API v3を介してテンプレート化された電子メールを送信するにはどうすればよいですか?

  27. 27

    VBAを使用して、選択したExcelセルをHTML形式の電子メール本文に送信するにはどうすればよいですか?

  28. 28

    保存したBLOBを添付ファイルとして電子メールで送信するにはどうすればよいですか?

  29. 29

    mailgun、taskqueue、ndbを使用して重複する電子メールを送信しないようにするにはどうすればよいですか?

ホットタグ

アーカイブ