Powershellメモ

 

学習用サイト(Microsoft公式)

 

 ↓ 何かあれば追加していく

 

メモ

 

ps1ファイルの実行について

ps1:powershellのスクリプトファイル

Powershellのスクリプトファイルはセキュリティの関係上デフォルトで実行不可になっている。
実行させたい場合は設定を変更する必要がある。

 

サンプル(要:管理者権限で実行)

# 現在の設定を確認する
> Get-ExecutionPolicy
Restricted

# 設定を変更する
Set-ExecutionPolicy RemoteSigned

実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies
のヘルプ トピック (https://go.microsoft.com/fwlink/?LinkID=135170)
で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "N"): y

 ※Set-ExecutionPolicy+半角スペースの後で「TAB」を押下することで、設定可能なポリシーが表示される(切り替わる)

 

 

比較演算子

-eq	等しい(equal)
-ne	等しくない(not equal)
-gt	より大きい(greater than)
-ge	以上(greater than or equal)
-lt	未満(less than)
-le	以下(less than or equal)
-like	検索(曖昧)
-match	検索(正規表現)

 

ヘルプ関連のコマンド

① Get-Commandでコマンドを見つける

② Get-Helpでコマンドの詳細情報を確認する

- その他 -

# オブジェクトの構造(型名、メンバー一覧)を表示する
# ※例えば、とあるコマンドレットの戻り値の型を調べる場合などに使用する
Get-Member

# コマンドのAlias一覧を取得する
Get-Alias

 

ヘルプ(例)

# ヘルプの表示
Get-Help {コマンドレット名}

# コメントの特定のパラメータの説明のみ表示する
Get-Help {コマンドレット名} -Parameter パラメータ名

# ワイルドカードを利用してコマンドを検索
Get-Help {コマンドレット名の一部}

# コマンドレット一覧を表示する
Get-Command

# コマンドの構文を表示
Get-Command {コマンドレット名} -Syntax

# とあるコマンドレットの戻り値の型を調べる
{何らかのコマンドレット} | Get-Member

 

フォーマット

書式用のコマンドレット(Format-xxxx)はパイプの最後に記述する


# テーブル表示
{各コマンド} | Format-Table

# リスト表示
{各コマンド} | Format-List

 

エイリアス

# コメントレットの別名から元のコマンド名を取得する
Get-Alias {別名}

> Get-Alias gsv

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           gsv -> Get-Service


# 逆引き
Get-Alias -Definition {コマンドレット名}

> Get-Alias -Definition Get-Service

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           gsv -> Get-Service

 

ACLの取得(icaclsよりもパースしやすい)

Get-Acl {対象} | Format-List 

 

WMIとCMI(Common Information Model)

WMI:非推奨になった
CMI:推奨(Windows以外でも利用可)

CMIコマンド一覧

> Get-Command -Module CimCmdlets

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Cmdlet          Export-BinaryMiLog                                 X.X.X.X    CimCmdlets
Cmdlet          Get-CimAssociatedInstance                          X.X.X.X    CimCmdlets
Cmdlet          Get-CimClass                                       X.X.X.X    CimCmdlets
Cmdlet          Get-CimInstance                                    X.X.X.X    CimCmdlets
Cmdlet          Get-CimSession                                     X.X.X.X    CimCmdlets
Cmdlet          Import-BinaryMiLog                                 X.X.X.X    CimCmdlets
Cmdlet          Invoke-CimMethod                                   X.X.X.X    CimCmdlets
Cmdlet          New-CimInstance                                    X.X.X.X    CimCmdlets
Cmdlet          New-CimSession                                     X.X.X.X    CimCmdlets
Cmdlet          New-CimSessionOption                               X.X.X.X    CimCmdlets
Cmdlet          Register-CimIndicationEvent                        X.X.X.X    CimCmdlets
Cmdlet          Remove-CimInstance                                 X.X.X.X    CimCmdlets
Cmdlet          Remove-CimSession                                  X.X.X.X    CimCmdlets
Cmdlet          Set-CimInstance                                    X.X.X.X    CimCmdlets

 フィルタ

Select-Object
Where-Object

 

m-filterのログ解析用スクリプト(公式サイトのサンプルログでテスト実施)

※sjisで保存しないと文字化けします

※参考情報

https://www.pa-solution.net/daj/bs/faq/Detail.aspx?id=2585&dispNodeId=

※URLデコードする場合

 5行目あたりに「Add-Type -AssemblyName System.Web」を追加し、

 $ostream.Write($token)の部分を
   ↓

 $str = [System.Web.HttpUtility]::UrlDecode($token,$encoder)
 $ostream.Write($str)

 こんな感じに変える
 なお、デコードする場合はタブ区切りなどにした方が良い(データにが含まれる場合があるので)

Param(
   [parameter(mandatory=$true)][String]$inputFile,
   [parameter(mandatory=$true)][String]$outputFile
)


# 定数(通知メール種別)
$mailTypeText = @(
    "予約領域"
    "MTAとの通信中に不明なエラーが発生した場合"
    "MTAとSMTP認証に失敗場合"
    "MTAとの通信でタイムアウトが発生した場合"
    "予約領域"
    "その他不明なエラーが発生した場合"
    "パスワード再設定通知メール(管理者)"
    "パスワード再設定通知メール(利用者)"
    "メール送信サーバー設定テストメール"
    "POSTMASTER設定テストメール"
    "ドライブ情報通知メール"
    "ルールの通知メール"
    "予約領域"
    "保留解除時通知メール"
    "保留メール件数通知メール"
    "ライセンス失効猶予時の通知メール"
    "バックアップ完了通知メール"
    "システムログ通知メール"
    "ZIP化処理失敗した場合"
    "管理者LDAP連携でLDAPのメールアドレス参照成功しないままリトライ上限を迎えた"
    "グループ管理者のインポートによってランダムパスワード発行のパスワード通知"
    "予約領域"
    "改竄チェックの通知メール"
    "FinalCode暗号化失敗通知メール"
    "FinalCode招待メール"
    "FinalCode暗号化情報登録完了通知メール (宛先に権限を付与する場合)"
    "FinalCode暗号化情報登録完了通知メール (宛先に権限を付与しない場合)"
    "FinalCode暗号化情報登録失敗通知メール"
    "予約領域"
    "クリプト便ダウンロードパスワード通知メール"
    "予約領域"
    "MXレコード引き失敗通知メール"
    "予約領域"
    "予約領域"
    "FinalCode復号失敗通知メール"
    "複製したメール(メールリダイレクト)"
    "予約領域"
    "FileZen Adapter:ZIP化処理失敗した場合"
    "FileZen Adapter:添付ファイル削除失敗した場合"
)

# param strIndex 第2引数のインデックス(文字列)
# param data 文字列配列
# param offset 文字列配列へのオフセット 
# return data[strIndex+offset] 又はエラー文字列("$str (unknown data)")
function StringIndexToText
{
    param(
        [parameter(mandatory=$false)][string]$StrIndex = "",
        [parameter(mandatory=$true)][string[]]$Data,
        [uint16]$offset=0
    )

    try {
        if ([System.Int32]::TryParse($StrIndex,[ref]$null))
        {
            $idx = [System.Int32]::Parse($StrIndex) + $offset
            if (($idx -ge 0) -And ($idx -lt $Data.Length) )
            {
                return $Data[$idx]
            }
            else 
            {
                return "$StrIndex (unknown data)"
            }
        }
        else {
            if ($StrIndex -eq "")
            {
                return ""
            }
            else {
                return "$StrIndex (unknown data)"    
            }            
        }
    }
    catch {
        Write-Host $StrIndex $Data
        throw $PSItem 
    }
}


function LogAnalyzer {

    # ログファイルを読み込む
    $encoder = [Text.Encoding]::GetEncoding("UTF-8")
    $istream = $null
    
    try {
        $istream = New-Object System.IO.StreamReader($inputFile,$encoder)
    }
    catch {
        Write-Host "$($PSItem.ToString())"
        return
    }

    $ostream = $null
    try {
        $ostream = New-Object System.IO.StreamWriter($outputFile,$false,$encoder)
    }
    catch {
        Write-Host "$($PSItem.ToString())"
        $istream.Close()
        return
    }

    try {
        # ヘッダの出力
        $ostream.Write("アクセスログ出力日時")
        $ostream.Write(",メール固有のID")
        $ostream.Write(",「m-FILTER」がメールを受け取った日時")
        $ostream.Write(",最終適用グループ名")
        $ostream.Write(",送信元IPアドレス")
        $ostream.Write(",差出人メールアドレス(エンベロープ)")
        $ostream.Write(",宛先メールアドレス(To,Cc,Bcc)(エンベロープ)")
        $ostream.Write(",宛先メールアドレス中の「外部ドメイン」有無")
        $ostream.Write(",テストモード")
        $ostream.Write(",認証状況")
        $ostream.Write(",アクション")
        $ostream.Write(",メール送信の成功/失敗")
        $ostream.Write(",リトライ回数")
        $ostream.Write(",ヘッダーに書かれたDateの値")
        $ostream.Write(",送先MTAアドレス")
        $ostream.Write(",配送先MTAポート番号")
        $ostream.Write(",MTAから受信した応答コード(メッセージ付き)")
        $ostream.Write(",MTAへ送信したSMTPコマンド")
        $ostream.Write(",メールサイズ(Bytes)")
        $ostream.Write(",ヘッダーに書かれたMessage-Idの値")
        $ostream.Write(",送信メールドメイン変換処理の実施有無")
        $ostream.Write(",共通SMTPスパムルールセットで判定された条件名")
        $ostream.Write(",予約領域")
        $ostream.Write(",予約領域")
        $ostream.Write(",予約領域")
        $ostream.Write(",送信ディレイの状態")
        $ostream.Write(",送信ディレイ時間(分)")
        $ostream.Write(",コメント部分を削除して取得したSMTPコマンド")
        $ostream.Write(",エラー通知メールの元メールの固有ID")
        $ostream.Write(",通知メールの種類")
        $ostream.Write(",送信に失敗したメールアドレス")
        $ostream.Write(",メール配送状態")
        $ostream.Write(",添付ファイルの拡張子情報")
        $ostream.Write(",予約領域")
        $ostream.Write(",予約領域")
        $ostream.Write(",予約領域")
        $ostream.Write(",予約領域")
        $ostream.Write(",Exchangeジャーナル連携情報")
        $ostream.Write(",接続したSSLバージョン")
        $ostream.Write(",予約領域")
        $ostream.Write(",TNEF処理結果")
        $ostream.Write(",MXレコード引き")
        $ostream.Write(",メールリダイレクト宛先情報")
        $ostream.Write(",メール無害化アクション")
        $ostream.Write(",FileZen Adapterアクション")
        $ostream.Write(",「FileZen」アップロード失敗時の宛先メールアドレス")
        $ostream.WriteLine("")

        # パース及び変換
        while($null -ne ($l=$istream.ReadLine()))
        {
            $tokens = $l.Split(",")
            $first = $true
            $idx = 1
            foreach($token in $tokens)
            {
                if (!$first)
                {
                    $ostream.Write(",")
                }

                $token = $token.Trim()
                switch($idx)
                {
                    0  { $ostream.Write($token) }
                    1  { $ostream.Write($token) }
                    2  { $ostream.Write($token) }
                    3  { $ostream.Write($token) }
                    4  { $ostream.Write($token) }
                    5  { $ostream.Write($token) }
                    6  { $ostream.Write($token) }
                    7  { $ostream.Write($token) }
                    8  {
                        $str = StringIndexToText $token @("内部ドメインのみ","外部ドメインが含まれている")
                        $ostream.Write($str)
                    }
                    9 {
                        $str = StringIndexToText $token @("ルール処理が行われていない","通常モード","テストモード") 1 
                        $ostream.Write($str)
                    }
                    10  {
                        $str = StringIndexToText $token @("未初期化","認証なし","認証あり(m-FILTER認証のみ)","認証あり(MTA認証のみ)","3:認証あり(両方の認証)") 1 
                        $ostream.Write($str)
                    }            
                    11 {
                        $str = StringIndexToText $token @("送信","削除","保留","リレ")
                        $ostream.Write($str)
                    }
                    12 {
                        $str = StringIndexToText $token @("送信処理を行っていない","成功","リトライ","失敗(リトライ上限オーバー含む)","一部アドレスへの送信に失敗またはMTAへのコネクトに失敗") 1
                        $ostream.Write($str)
                    }
                    13 { $ostream.Write($token) }
                    14 { $ostream.Write($token) }
                    15 { $ostream.Write($token) }
                    15 { $ostream.Write($token) }
                    16 { $ostream.Write($token) }
                    17 { $ostream.Write($token) }
                    18 { $ostream.Write($token) }
                    19 { $ostream.Write($token) }
                    20 { $ostream.Write($token) }
                    21 {
                        $str = StringIndexToText $token @("変換処理を行っていない","変換処理を行った")
                        $ostream.Write($str)
                    }
                    22 { $ostream.Write($token) }
                    23 { $ostream.Write($token) }
                    24 { $ostream.Write($token) }
                    25 { $ostream.Write($token) }
                    26 {
                        $str = StringIndexToText $token @("送信ディレイ対象でない","送信ディレイ中","送信ディレイ状態から送信","送信ディレイ状態から外部ドメインへ送信","送信ディレイ状態から内部ドメインのみ送信")
                        $ostream.Write($str)
                    }
                    27 { $ostream.Write($token) }
                    28 { $ostream.Write($token) }
                    29 { $ostream.Write($token) }
                    30{
                        $str = StringIndexToText $token $mailTypeText
                        $ostream.Write($str)
                    }
                    31 { $ostream.Write($token) }
                    32 {
                        $str = $token
                        if ($str -eq "1(0)")
                        {
                            $str = "機能がOFF(システム通知のため送信)"
                        }
                        elseif($str -eq "2(0)")
                        {
                            $str = "機能がOFF(リダイレクトメールのため送信)"
                        }
                        else 
                        {
                            $str = StringIndexToText $token @("機能がOFF","機能がON","送信ディレイ状態から送信","送信ディレイ状態から外部ドメインへ送信","送信ディレイ状態から内部ドメインのみ送信")
                        }                
                        $ostream.Write($str)
                    }
                    33 { $ostream.Write($token) }
                    34 { $ostream.Write($token) }
                    35 { $ostream.Write($token) }
                    36 { $ostream.Write($token) }
                    37 { $ostream.Write($token) }
                    38 {
                        $str = StringIndexToText $token @("通常メール/ジャーナル配送あり","ジャーナルレポート/ジャーナル配送あり","通常メール/ジャーナル配送なし","ジャーナルレポート/ジャーナル配送なし")
                        $ostream.Write($str)
                    }
                    39 { $ostream.Write($token) }
                    40 { $ostream.Write($token) }
                    41 {
                        $str = StringIndexToText $token @("TNEF処理を行っていない","TNEF処理を行った")
                        $ostream.Write($str)
                    }
                    42 {
                        $str = $token
                        if ($str -eq "ON")
                        {
                            $str = "MXレコード引きを行う"
                        }
                        elseif($str -eq "OFF")
                        {
                            $str = "MXレコード引きを行わない"
                        }
                        $ostream.Write($str)
                    }
                    43 { $ostream.Write($token) }
                    44 {
                        $str = StringIndexToText $token @("設定なし","添付ファイルを削除する","受信メッセージをテキスト形式に変換する","受信メッセージに含まれるリンク要素を無効化する")
                        $ostream.Write($str)
                    }
                    45 {
                        $str = StringIndexToText $token @("成功","ログイン失敗","ZIP化失敗(リトライ有)","ZIP化失敗(リトライ無)","転送失敗","その他のエラー")
                        $ostream.Write($str)
                    }
                    46 { $ostream.Write($token) }
                }

                $idx += 1
                $first = $false
            }
            $ostream.WriteLine("");
        }   
        $ostream.Close();
        $istream.Close();
    }
    catch {
        Write-Host "$($PSItem.ToString())"
        $ostream.Close();
        $istream.Close();
    }
}

Write-Host "Input File : $inputFile"
Write-Host "Output File : $outputFile"

# 解析処理呼び出し
LogAnalyzer