none
リモートのPCへのイベントログ通知方法

    質問

  • ホストのイベントログをリモートのPCでイベントログを監視するために通知させたいのですが権限がないとエラーが出ます。

    権限を取得する方法やいい解決方法がございましたら解決方法をご教授願います。

    実行コマンド

    Write-EventLog -ComputerName XXX.XXX.XXX.XXX -LogName Application -EntryType Error -Source TEST  -EventId 1000 -Message "test"

    エラー内容

    Write-EventLog : 許可されていない操作を実行しようとしました。
    発生場所 行:1 文字:1
    + Write-EventLog -ComputerName XXX.XXX.XXX.XXX -LogName Application -EntryType Error  ...
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [Write-EventLog], UnauthorizedAccessException
        + FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.WriteEventLogCommand

    2018年7月5日 2:27

すべての返信

  • Write-EventLogコマンドレットには-Credentialパラメータの定義がないため、接続先コンピュータにアクセス権がないアカウントで実行することはできないと思われます。

    代替案として、Invoke-Commandコマンドレットを使い、PowerShellリモートの機能によりWrite-EventLogコマンドレットをリモート実行する方法が考えられます。

    Invoke-Commandには-Credentialパラメータのサポートがありますので、接続先コンピュータにアクセス権のあるユーザーを指定すれば実行可能となります。ただし、あらかじめリモートコンピュータがPowerShellリモートによる操作を受け付ける状態にしておく必要があります。

    2018年7月13日 8:20
    モデレータ
  • 回答ありがとうございます。

    Invoke-Commandを使用することでイベントログの通知はできるようになりましたが、

    パスワード入力を自動化することは可能でしょうか?

    イベントログ通知を自動で行いたいです、回答の程お願いいたします。

    2018年7月24日 5:28
  • 方法はいくつかありますがお勧めの方法は、パスワードを事前に入力し、暗号化してテキストファイルに保存しておく方法です。

    ConvertFrom-SecureString (Read-Host -AsSecureString) | 
        Set-Content -Path encrypted_password.txt

    このようなコマンドを実行すると、パスワードを入力するプロンプトが出ますので、入力すると、暗号化されたパスワードがテキストファイルに保存されます。

    事前に入力した暗号化したパスワードを読み込み、復号し、資格情報を生成しリモート実行するスクリプトは以下のようになります。

    $encrypted = Get-Content encrypted_password.txt
    $secureString = ConvertTo-SecureString -String $encrypted
    $credential = New-Object `
        -TypeName System.Management.Automation.PSCredential `
        -ArgumentList "ユーザー名", $secureString
    Invoke-Command `
        -ComputerName "コンピュータ名" `
        -ScriptBlock {コマンド} `
        -Credential $credential

    なおこの手法で暗号化したパスワード文字列は、ログオン中のユーザーの資格情報を元に行われるため、他ユーザーが使用することはできません。よって、パスワードを暗号化するユーザーと、スクリプトを動作させるユーザーは同一である必要があります。

    どうしてもこの方法が使えない状況であるなら、セキュリティリスクを認識した上で、以下のように生パスワードを埋め込む方法もあるにはあります。

    $secureString = 
        ConvertTo-SecureString -String "パスワード" -AsPlainText -Force
    $credential = New-Object `
        -TypeName System.Management.Automation.PSCredential `
        -ArgumentList "ユーザー名", $secureString
    Invoke-Command `
        -ComputerName "コンピュータ名" `
        -ScriptBlock {コマンド} `
        -Credential $credential


    2018年7月24日 18:47
    モデレータ
  • やきです。

    やりたいことが違うかもしれませんが、イベントログの転送でしたら「イベントサブスクリプション」という機能を使うことでも実現できます。

    2018年8月1日 2:47