$Office365UPN = ""; $Office365Password = ""; #################################################################################################### # Function. #################################################################################################### function LoggerUtil.manageLogRetention( [string]$path, [int]$retentionDays ){ if ( ` !( $path ) -or ` !( $retentionDays ) ` ){ Write-Error -Message "Invalid argument." -Category InvalidArgument; throw $Error[0]; } if ( !( Test-Path ( $path ) ) ){ try{ New-Item -Path $path -Type Directory; }catch [exception]{ Write-Error -Message "Failed to create directory." -Category WriteError; throw $Error[0]; } } $logFileList = Get-ChildItem -Path $path -Recurse; if ( $logFileList ){ foreach ( $logFile in $logFileList ){ if ( $logFile.LastWriteTime.AddDays( $retentionDays ) -le ( Get-Date ) ){ Remove-Item -Path $logFile.FullName; } } } } function LoggerUtil.writeSimpleLog( [string]$path, [string]$fileName, [string]$content ){ if ( ` !( $path ) -or ` !( $fileName ) -or ` !( $content ) ){ Write-Error -Message "Invalid argument." -Category InvalidArgument; throw $Error[0]; } if ( !( Test-Path ( $path ) ) ){ try{ New-Item -Path $path -Type Directory; }catch [exception]{ throw $Error[0]; } } try{ Set-Content ` $content ` -Encoding default ` -Path ( Join-Path $path $fileName ) ` -Force ` -ErrorAction Stop; }catch [exception]{ throw $Error[0]; } } #################################################################################################### # Define common variables. #################################################################################################### $myParentDirectory = Split-Path -Parent $MyInvocation.InvocationName; $logPath = Join-Path $myParentDirectory "log"; $logFileName = ( ( Get-Date ).ToString( "yyyyMMddHHmmss" ) + ".txt" ); #################################################################################################### # Connect to Office365. #################################################################################################### try{ $convertedPassword = ConvertTo-SecureString $Office365Password -AsPlainText -force; $credObj = New-Object System.Management.Automation.PSCredential($Office365UPN, $convertedPassword ); $LiveCred = Get-Credential $credObj; Connect-MsolService -Credential $LiveCred; $Office365UtilConnection = $LiveCred; }catch [exception]{ LoggerUtil.writeSimpleLog ` $logPath ` $logFileName ` "Failed to connect Office365 by TenantInfo."; return; } #################################################################################################### # Manage log retention. #################################################################################################### LoggerUtil.manageLogRetention $logPath 30; #################################################################################################### # Get federated domains. #################################################################################################### $federatedDomainList = Get-MsolDomain | where{$_.Authentication -eq "Federated" }; if ( !( $federatedDomainList ) ){ LoggerUtil.writeSimpleLog ` $logPath ` $logFileName ` "Federated domain did not exist."; return; } #################################################################################################### # Set today's date to LastPasswordChangeTimestamp StsRefreshTokensValidFrom in Office365 users. #################################################################################################### $office365TargetUserList = @(); foreach ( $federatedDomain in $federatedDomainList ){ $office365TargetUserList += ( ` Get-MsolUser -All | ` where{ $_.UserPrincipalName -like ( "*" + $federatedDomain.Name ) } | ` where{ $_.LastPasswordChangeTimestamp -eq $null -or $_.StsRefreshTokensValidFrom -eq $null} ` ); } Get-MsolUser -All | where{ $_.UserPrincipalName -like ( "*" + $federatedDomain.Name ) } | where{ $_.LastPasswordChangeTimestamp -eq $null -or $_.StsrefreshTokensValidFrom -eq $null } if ( !( $office365TargetUserList ) ){ LoggerUtil.writeSimpleLog ` $logPath ` $logFileName ` "The target user did not exist."; return; } $successfulUserList = @(); $successfulObjectIdList = @(); $failedUserList = @(); foreach ( $office365TargetUser in $office365TargetUserList ){ try{ if ( $office365TargetUser -ne $null -and $office365TargetUser.LastPasswordChangeTimestamp -eq $null ){ Set-MsolUser ` -ObjectId $office365TargetUser.ObjectId ` -LastPasswordChangeTimestamp ( Get-Date ) ` -ErrorAction Stop; if( $successfulObjectIdList -notcontains $office365TargetUser.ObjectId ) { $successfulObjectIdList += $office365TargetUser.ObjectId; } } if ( $office365TargetUser -ne $null -and $office365TargetUser.StsrefreshTokensValidFrom -eq $null ){ Set-MsolUser ` -ObjectId $office365TargetUser.ObjectId ` -StsrefreshTokensValidFrom ( Get-Date ) ` -ErrorAction Stop; if( $successfulObjectIdList -notcontains $office365TargetUser.ObjectId ) { $successfulObjectIdList += $office365TargetUser.ObjectId; } } }catch [exception]{ $failedUserList += $office365TargetUser; continue; } } foreach ( $successfulObjectId in $successfulObjectIdList ) { $successfulUserList += Get-MsolUser -ObjectId $successfulObjectId; } #################################################################################################### # Export result as log. #################################################################################################### LoggerUtil.writeSimpleLog ` $logPath ` $logFileName ` ( ` "[Successful user]" + ` "`r`n" +` ( $successfulUserList | select DisplayName,UserPrincipalName,LastPasswordChangeTimestamp,StsrefreshTokensValidFrom | Format-Table -AutoSize | Out-String -Width 4096 ) + ` "`r`n" +` "`r`n" +` "[Failed user]" + ` "`r`n" +` ( $failedUserList | select DisplayName,UserPrincipalName,LastPasswordChangeTimestamp,StsrefreshTokensValidFrom | Format-Table -AutoSize | Out-String -Width 4096 ) ` );