PowerShellでパスワード有効期限切れ間近のOffice365ユーザーを出力する
Macでメールアプリを使っている人とか、WindowsでBeckyやThunderBirdだけ使っている人とかって期限切れ通知がでないんですよね・・・。
で有効期限が切れてメールが使えない!といってくるので、予防策として期限が迫っているユーザリストを作成してみることにしました。
PowerShellからOffice365へ接続するための準備
まずはPowerShellからOffice365系のコマンドが実行できるようにします。
管理者権限でPowerShellを起動し、下記コマンドを入力します。
途中のプロンプトはYを押して進めます。
Install-Module -Name MSOnline 続行するには NuGet プロバイダーが必要です PowerShellGet で NuGet ベースのリポジトリを操作するには、'2.8.5.201' 以降のバージョンの NuGet プロバイダーが必要です。NuGet プロバイダーは 'C:\Program Files\PackageManagement\ProviderAssemblies' または 'C:\Users\***\AppData\Local\PackageManagement\ProviderAssemblies' に配置する必要があります。'Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force' を実行して NuGet プロバイダーをインストールすることもできます。今すぐ PowerShellGet で NuGet プロバイダーをインストールしてインポートしますか? [Y] はい(Y) [N] いいえ(N) [S] 中断(S) [?] ヘルプ (既定値は "Y"): y
スクリプトを作成する
パスワードファイルの準備
タスクスケジューラから実行させたいため、コマンドだけでOffice365へログインできるようにします。
PowerShellで下記コマンドを実行します。
$cred = Get-Credential ログインプロンプトが表示されるので、Office 365の管理者ユーザのIDとパスワードを入力する $cred.Password | ConvertFrom-SecureString | Set-Content .\pw.dat
下記のようなスクリプトを作成しました。
#認証処理 $password = cat .\pw.dat | ConvertTo-SecureString $cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList <管理者のメールアドレス>,$password Connect-MsolService -Credential $cred #パスワードポリシーを取得する $PasswordPolicy = Get-MsolPasswordPolicy -DomainName <対象ドメインを指定> $GetUser = Get-MsolUser -All | Select-Object -ExpandProperty UserPrincipalName $currentTime = Get-Date #CSVファイルを作成する $file = 'out.csv' Remove-Item $file Write-Output "姓,名,email,有効期限,残り日数" | Add-Content $file -Encoding UTF8 foreach ($User in $GetUser){ $UserPrincipal = Get-MsolUser -UserPrincipalName $User $PasswordExpirationDate = $UserPrincipal.LastPasswordChangeTimestamp.AddDays($PasswordPolicy.ValidityPeriod) $strOutput = $UserPrincipal.LastName + "," + $UserPrincipal.FirstName + "," + $UserPrincipal.UserPrincipalName + "," + $PasswordExpirationDate.ToString("yyyy/MM/dd HH:mm:ss") #今日の日付と有効期限の日付さを計算する $duration = New-TimeSpan $currentTime $PasswordExpirationDate $strOutput = $strOutput + "," + $duration.Days #有効期限が残り14日のユーザーを出力させる if($duration.Days -le 14 -and $duration.Days -ge 0 ){ Write-Output $strOutput | Add-Content $file -Encoding UTF8 } } Start-Sleep -s 3 #Sortする $csvData = Import-Csv $file $SortData = $csvdata | Sort-Object -Property 残り日数 $SortData | Export-Csv sort.csv -Encoding UTF8 $sortCsv = Import-Csv sort.csv #Mail $o365user = '<認証用ユーザーのメールアドレス>' $o365pass = $env:O365MAILPASS $from = '<メールの送信元として表示するメールアドレス>'; $to = '<送信先のメールアドレス>' $subject = 'o365 パスワード期限間近ユーザ一覧' $body = $sortCsv |ft| Out-String $msg = New-Object System.Net.Mail.MailMessage($from, $to, $subject, $body); $SMTPClient = New-Object Net.Mail.SmtpClient("smtp.office365.com", 587) ; $SMTPClient.EnableSsl = $true; $SMTPClient.Credentials = New-Object System.Net.NetworkCredential($o365User, $o365Pass); $SMTPClient.send($msg);
エラー処理入れてないのであれですが、初回実行時にはout.csvがないとエラーになると思います。
処理追加しようと思って忘れてました(笑)
パスワードの期限が14日を切ったユーザが一覧として出力されます。
if文の条件式にて-ge 0としているのは、期限が切れてしまったユーザが表示されてしまいノイズになってしまうので、14以下0以上としています。
メール送信処理部分
SMTP認証を行うため、Office 365ユーザのメールアドレスとパスワードが必要になります。
そのため環境変数のO365MAILPASSという名前で認証用のパスワードを設定しました。
$env:O365MAILPASSは、上記で設定した環境変数から認証用のパスワードを取得しています。
コード内に記述するのが嫌だったのでこの手法をとっています。
タスクスケジューラーに登録する
登録法は@ITの記事にて詳しく解説されているのでこちらをご参照ください。
私はPowerShellファイルを直接プログラム/スクリプトに指定して見事にはまりました(笑)
実行結果
こんな感じでメールが送信されてきます。
姓 名 email 有効期限 残り日数 - - ----- ---- ---- ユーザ1 [email protected] 2018/11/22 00:47:28 1 ユーザ2 [email protected] 2018/11/24 02:08:44 3 ユーザ3 [email protected] 2018/11/26 00:09:23 5 ユーザ4 [email protected] 2018/11/26 04:34:46 5
Teamsへも投稿
途中でTeamsへも投稿したらいいんじゃないか?と思い立ちWebhookも設定してみました。
が、、、日本語が文字化けしてしまいました・・・。色々試してみたのですが解決できず・・・
解決策教えてください・・・。こんなことになってしまいました↓