PowerShellでパスワード有効期限切れ間近のOffice365ユーザーを出力する

目次

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も設定してみました。
が、、、日本語が文字化けしてしまいました・・・。色々試してみたのですが解決できず・・・
解決策教えてください・・・。こんなことになってしまいました↓

参考URL

あわせて読みたい
[Office365]PowerShellを使った自動化を行う際のTIPS いろんなアイデンティティ管理系製品やサービスの実験の記録しています。
日々徒然
PowerShellでのOffice365自動接続 Office365へは、ブラウザを使ったアクセスの他、PowerShellを利用してもログインすることができま…

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次