PowershellでのWhere-Objectの使い方(たぶん繰り返し処理)
こんにちは!
前回に続いて今回もPowershellでの繰り返し処理について記載します。
今回は若干繰り返し処理っぽくないのですが、試してみた結果コンソールに繰り返し処理っぽい応答が返ってきたので繰り返し処理!ってくくりにさせてもらいました!(適当笑)
今回記載していくのは「Where-Object」というものの利用方法についてです。
前回の以下記事では
以下の図の2~6行目に該当する所属が”営業"の人にだけFlagに1という値を追加していました。
ただ稀に?10行目の営業にもFlagに値を入れたいってケースがあるかと思います。
そんな時簡単に使えるのがWhere-Objectです!
もちろん以前記載したforでもforeachでも記載できます!
Where-Objectはどちらかというと検索に強いイメージですが(検索の速度は遅いかも笑)、今回は強引に値の入力までやってしまいます!
※速度優先の方はforeach使った方がよいかもです!
- 今回やること
上記ファイルの所属が"営業"となっている人のFlag列に1という値をいれる
- 前提
上記ファイルは「Looptest.csv」という名前でC:\tempに保存
$Datas = Import-Csv -Path "C:\temp\Looptest.csv" -Encoding Default
を実行してファイルを$Datasの中にロードしておきます。
- Where-Objectの利用方法
検索対象のオブジェクト | Where-Object{$_."検索対象のヘッダー" 比較演算子 比較対象}
というように利用します。※Where-ObjectはWhereのみでも可です。
今回のパターンでいくと!!
$Datas | Where-Object{$_."所属" -eq "営業"}
となります。
これを実行するとどうなるかというとこんな感じで営業のみ出力されます!
ちょっと見ずらいので出力を以下の感じで整えます。
$Datas | Where-Object{$_."所属" -eq "営業"} | Format-Table
こんな感じで条件に合致するものだけピックアップしてくることが可能です。
便利~~~♪
ただ!!僕がこれを初めて見たとき思ったのは「$_.」ってなんやねん!ってこと笑
$_はファイル内の1行分を示しています。
下図の赤枠が1回目の処理の$_と思ってください。
$_."所属"は1回目の処理での下図ってことになりますね!
それが -eq "営業"と記載したので赤枠内の文字が"営業"とイコールだったら
って意味になります。
比較演算子は色々なものが利用できますし、正規表現も利用可能なものもあります。
※曖昧系もいけたかも!
- スクリプトの作成
では実際にスクリプト作成します!
今回はWhere-Objectでヒットした行のFlag列に1を入力したいので、
以下のように記載します。
$Datas | where{if($_."所属" -eq "営業"){$_.flag = 1}}
ちょっと見ずらいのでインデントをちゃんとつけるとこんな感じ
$Datas | where{ if($_."所属" -eq "営業"){ $_.flag = 1 } }
これを実行するとこんな感じになります。
最後にファイルとして出力したいよって方は以下も追加
$Datas | Export-Csv -Path "C:\temp\Looptest.csv" -Encoding Default -NoTypeInformation
全部合わせるとこ~んな感じ
$Datas = Import-Csv -Path "C:\temp\Looptest.csv" -Encoding Default $Datas | where{ if($_."所属" -eq "営業"){ $_.flag = 1 } } $Datas | Export-Csv -Path "C:\temp\Looptest.csv" -Encoding Default -NoTypeInformation
こんな感じでWhere-Objectを利用した繰り返し処理も記述できます。
色んな方の記事を読んでいると繰り返し処理はforeachの方が早いって記事を見かけます!笑
ぜひ用途に応じて使い分けしてください。
- おまけ
せっかくなんで上記をforeachやforで書いたらどうなるのか記載しておきます。
まずはforeachパターン
以下のように記載します。
$Datas = Import-Csv -Path "C:\temp\Looptest.csv" -Encoding Default foreach($Data in $Datas){ if($Data."所属" -eq "営業"){ $Data.flag = 1 } } $Datas | Export-Csv -Path "C:\temp\Looptest.csv" -Encoding Default -NoTypeInformation
続いてforパターン
$Datas = Import-Csv -Path "C:\temp\Looptest.csv" -Encoding Default for($i = 0; $i -lt $Datas.Count; $i++){ if($Datas[$i]."所属" -eq "営業"){ $Datas[$i].flag = 1 } } $Datas | Export-Csv -Path "C:\temp\Looptest.csv" -Encoding Default -NoTypeInformation
とまあこんな感じでしょうか!
皆さんのレベルだと当たり前かもですが!終了条件で$Data.Countより$iが小さい場合としています。以下じゃだめだよ!配列は0から始まるから配列内の個数を終了条件の数字として比較すると1多くなっちゃうからね!笑
次回はPowerhsellから離れてMicrosoft365周りを書いていきたいと思います。
- 最後に!
Twitterでも情報発信したいと思いますので、興味があったらフォローしてください!
Powershellでの繰り返し処理(for)の使い方
こんにちは!
今月も早々にブログに着手できました。やったぜ!笑
何を書こうかネタ探しをしていたのですが、僕のブログの閲覧いただいた履歴をみるとこの数カ月で以下のブログを閲覧いただいている割合が大きく上がっていました。
上記ブログの内容はPowershellでForeachを利用してループ処理を行う方法についてでした。
これを閲覧いただいているってことは。。。みんなループしたいんだな!!笑
と謎の納得をしたため、今回は
「Powershellでの繰り返し処理(for)の使い方」
について記載していきたいと思います。
- forとforeachの違い
上記リンクに記載していた通り、foreachを利用するとデータの行数分処理を繰り返してくれていました。
forを利用する代表ケースとしては、開始条件や終了条件を指定したい場合です。
今回は一例として以下のCSVファイルに対して処理をしたいと思います。
下記のデータを「Looptest.csv」という名前でC:\tempに保存しています。
上記にて例えばD列(所属)が営業じゃなくなるまで繰り返し処理をしてみたいと思います。
※この内容は一例として実施しているので本当にfor利用する際はA列(No)が3から8まで処理みたいに利用するケースが多いと思います。今回は終了条件に文字列も利用できることを表現するために良くない例になってしまっています。ごめんなさい
今回は2行目から6行目のE列(Flag)に1を入力するように繰り返し処理をしたいと思います。
- forの基本構文
forの利用方法は
for(開始条件※初期値;終了条件;更新条件){繰り返す処理}
というように記載します。
利用の前に上記csvをimport-csvというコマンドレットにてメモリにロードするとどのようにみえるか確認します。
$Datas = Import-Csv -Path "C:\temp\Looptest.csv" -Encoding Default
$Datasという変数に格納します。
Datasの中にどのように入っているかというと
こんな感じです。
$Datasは配列として利用されており、例えば1行目だけ表示したい場合は
$Datas[0]
と記載すると1行目のみ表示可能です。
※配列は0番目から始まるので1行目の表示の際には内の数字が0となる点を注意してください。
それではまずは開始条件(初期値)です。
今回1行目から所属が営業ではなくなるまで繰り返しFlagに1を入力するようにします。
そのため、開始条件は配列の0番目から!
ということになるため、$i = 0としておきます。※変数名はなんでもOKです。
次に終了条件は所属が営業だったら処理!
としますので、$Datas[$i]."所属" -eq "営業"となります。
-eqは=を示しています。
Powershellでは比較演算子は以下のリンクのようになっています。
※比較演算子って比較する時の表記って意味ね
about_Comparison_Operators - PowerShell | Microsoft Docs
最後に更新条件です。
配列を1行目から2行名3行目と1行ずつ次の行へ遷移していきたいので、
$i++とします。
$i++は繰り返しを行うごとに$iに1を加算するという意味になります。
なので、1回目の処理では$iは0、2回目の処理の時は$iは1になります。
補足
$Datas[$i]とすると$iに入っている数字が代入されているため、初回は$Datas[0]を表現することとなります。$i++という更新条件をつけているため、繰り返しの2回目は$Datas[1]というように変化していきます。
また、$Datas[0]."所属"とすると下記の赤枠を表示する指定となります。
同様に$Datas[1]."所属"とすると
となります。
このように$Datasの変数にをつけて[]内も変数とする。
変数をfor分を利用して数字を1ずつ加算しながら$Datasの表示行も変数で指定し繰り返し処理を行っていきます。
Flagに値を代入する際は
$Datas[0].Flag = 1
とすることでFlag列の1行目に1を入力可能です。
そのため、今回は
$Datas[$i].Flag = 1
となります。
上記で色々な説明をしてきましたが、最終的なスクリプトはこんな感じです。
$Datas = Import-Csv -Path "C:\temp\Looptest.csv" -Encoding Default for ($i = 0; $Datas[$i]."所属" -eq "営業"; $i++) { $Datas[$i].Flag = 1 }
これを実行してから$Datas内をみると
こんな感じで1行目から順番に所属が営業の場合、Flagに1がはいりました。
あとは$Datasをファイルとして出力することで、csv自体を更新(上書き)することも可能です。
そこまでやりたいよって人は
スクリプトの6行目に以下を追記してください。
$Datas | Export-Csv -Path "C:\temp\Looptest.csv" -Encoding Default -NoTypeInformation
- まとめ(補足)
9行目のFlagに値が入らないのは1行目から順番に所属が営業だったら処理とするため、
6行目にて繰り返し処理が終了してしまい、9行目にたどり着かないのです。
※だから上記で記載したとおり例が悪い!笑 となるわけですね・・・・
こういうケースでも9行目にも入力する方法としてWhere-Objectみたいなものがあったりします!
次回はそれを書こうかな♪
for文やforeach文について記載してみましたが、みなさんはどちらを利用するケースが多いでしょうか?
両方とも便利なので使ったことないって方はぜひ使ってみてくださいね!
- 最後に!
Twitterでも情報発信したいと思いますので、興味があったらフォローしてください!
Microsoft365の機能(Attack Simulator)でフィッシングメール訓練をしてみる
こんにちは
前回のブログ更新の後、ブログをTweetしてくださりTwitterアカウントをフォローしてくださる方がいらっしゃいました!
僕は超単純なのでそれにテンションがあがって短いスパンで2個目のブログを書くことにしました!!笑
※フォローしてくださった皆様本当にありがとうございます。スマホに通知が来るたびに嬉しいな~って思っております。
情報交換させていただけるとなお嬉しいです。
ちょっと前からですが、弊社でもメール訓練を実施されることが多くなりました。
このブログをご覧のみなさんも受信したメールが見るべきメールなのか怪しいメールなのか訓練なのか悩んだご経験もあるのではないでしょうか。
※僕は送信されてきたメールアドレスのドメインの情報をとりあえず検索するっていう感じで毎回楽しんで?!?ます。
近年フィッシングメールやウイルスメールが多いので対策の一つとしてユーザーへの訓練をしたいって要望もちらほら聞きます。
なので!今回は「Microsoft365の攻撃シミュレーターを利用してフィッシングメール訓練を実施する」方法を記載していきます。
- 必要なライセンス
Attack Simulatorの利用には以下のライセンスが必要です。
・Microsoft Defender for Office365 Plan2(旧名称 Office365 ATP Plan2)
上記単体でもOKですし、上記を包括する以下でもOKです。
・Office365 E5
・Office365 A5
・Microsoft365 E5 Security
・Microsoft365 E5
詳しくは以下をどうぞ!
Microsoft Defender for Office 365 - Office 365 | Microsoft Docs
- 前提条件
- 訓練対象者に上記ライセンスが付与されていること(これは当たり前ですね)
- 訓練対象者のメールボックスがExchangeOnline上にあること(ExchangeServerとのハイブリッドでもNGなんです!)※ちなみにこれMicrosoft365の資格試験にもでたりするよ!←内緒だけど
- 訓練を開催する管理者のアカウントがMFA(多要素認証)設定されていること
- 訓練を開催する管理者のアカウントがセキュリティ管理者のRoleに属すること(もちろん全体管理者でもOK)
- 集計データはMicrosoft365内にて他ユーザーのデータと一緒に保存される
- 30日間のイベントを集計して処理を実施する
詳しく知りたい方はこちらをどうぞ
Microsoft Defender for Office 365 の攻撃シミュレータ - Office 365 | Microsoft Docs
- 利用可能な訓練(攻撃)
1.スピアフィッシング(資格情報収集)
→メールに添付されるURLをクリックしてMicrosoft365の資格情報を入力するかどうか
2.スピアフィッシング(添付ファイル)
→添付ファイルを開くかどうか
3.ブルートフォースパスワード
→辞書ファイルから推測されるパスワードでログオンチャレンジ
4.パスワードスプレー
→よく使用されるパスワードでログオンチャレンジ
今回は1を試していきたいと思います。
- 設定手順
まずは訓練開催者のアカウントにMFAを設定します。
今回僕の環境はすでにMFAが設定されているので若干画面が違います。ごめんなさい
また、全体管理者アカウントで実施するのでRole割り当ては実施していないです。
Microsoft365管理センターを開きAzure Active Directoryをクリック
AzureActiveDirectoryをクリックしユーザーをクリック
Multi-Factor Authenticationをクリック
訓練管理者のアカウントにチェックを入れ、「有効にする」をクリック
multi-factor authを有効にするをクリック
閉じるをクリック
下記URLにアクセスして、多要素認証をセットアップします。
ログインする際の多要素認証項目を下記から設定します。
ここまででMFA設定完了です。
Microsoft365管理センターにもどり「セキュリティ」をクリック
脅威の管理内の攻撃シミュレーターをクリック
スピアフィッシング(資格情報収集)の攻撃の開始をクリック
シミュレーションの開始をクリック
資格情報収集を選択して次へをクリック
シミュレーションの名前を入力します。
※今回は「メール訓練」としました。
ペイロード内から既存のペイロード(テンプレートみたいなもの)を利用してもOKですし新規でカスタム作成することもできます。
今回は新規で作成するのでペイロードの作成をクリック
メールを選択して次へをクリック
資格情報収集を選択して次へをクリック
ペイロードの名前を入力して次へをクリック
必要な情報を入力していきます。
名前やメールの差出人(実際に存在しなくてもOK)やメールの件名等
メールメッセージを入力し、「フィッシング詐欺リンク」をクリック
URL名を入力
リンクが本文に入ったら次へをクリック
そのまま次へをクリック
内容を確認して送信をクリック
完了をクリック
作成したペイロードを選択して次へをクリック
対象を選択し次へをクリック
ちなみにこんな選択も可能です。
今回は2ユーザーを対象としました。
期限日のみ設定して次へをクリック
内容を変更する場合は修正して次へをクリック
このまま次へをクリック
内容を確認し送信をクリック
完了をクリック
ここからは訓練者側です。
メールを確認すると先ほど作成したペイロードの内容にてメール受信が確認できます。
リンクをクリックすると以下の画面が表示されます。
※ペイロードにてテーマを[Document Recieved],ブランドを[Microsoft]に設定しています。
入力してみます。
すると先ほど設定した画面に遷移します。
Goto Trainingを押すと教育画面にとんでいきます。
ここまでがクライアント側!!
管理者側で確認してみます。
設定を実施した画面の作成したシミュレーション「メール訓練」をクリック
全体概要として資格情報を入れてしまった人がいるかどうかや
※全ユーザーの状況も確認可能です。
受信メールに対してどこまで操作してしまったかや
トレーニングしないといけなくなった人がトレーニングを実施したか等が確認できます。
- まとめ
今回攻撃シミュレーターを利用してメール訓練をやってみましたが、ライセンスの観点でそんなライセンスない!って方もいるのかな~って感じました。
メール訓練の費用+その他のメールセキュリティの合計金額とMicrosoft Defender for Office365の費用とどちらがコストメリットや機能メリットがでるのかを考えないといけないかなって思います。
次回のネタがまだ思いつかないけど、そろそろPowershellにしよっかなって思いました。
- 最後に!
Twitterでも情報発信したいと思いますので、興味があったらフォローしてください!