Forzar cambio de contraseña para todos los usuarios en Microsoft 365

Puede forzar el cambio de contraseña para un usuario en el centro de administración de Microsoft 365. Sin embargo, si desea hacerlo para muchos usuarios, lo mejor es utilizar PowerShell. Esto se debe a que es extremadamente más rápido que revisar a los usuarios manualmente. En este artículo, aprenderá cómo forzar el cambio de contraseña para todos los usuarios en Microsoft 365 con PowerShell.

Instalar Microsoft Graph PowerShell

Ejecute Windows PowerShell como administrador e instale Microsoft Graph PowerShell.

Install-Module Microsoft.Graph -Force

Importante:Actualice siempre a la última versión del módulo Microsoft Graph PowerShell antes de ejecutar un cmdlet o script para evitar errores y resultados incorrectos.

Conéctese a Microsoft Graph PowerShell

Luego, conéctese a Microsoft Graph PowerShell utilizando los ámbitos siguientes.

Connect-MgGraph -Scopes "User.ReadWrite.All", "Directory.ReadWrite.All", "Directory.AccessAsUser.All"

Forzar cambio de contraseña para un solo usuario

Esto le mostrará al usuario un mensaje de cambio de contraseña después de iniciar sesión con su contraseña.

$userId = "[email protected]"

$params = @{
	passwordProfile = @{
		forceChangePasswordNextSignIn = $true
	}
}

Update-MgUser -UserId $userId -BodyParameter $params

ElActualiza tu contraseñaEl mensaje aparece después de que el usuario inicia sesión con su contraseña.

Cambiar contraseña y forzar el cambio de contraseña para un solo usuario

Esto cambiará la contraseña del usuario. Después de eso, deben usar esa contraseña para iniciar sesión. Recibirán un mensaje para actualizar su contraseña después de iniciar sesión.

$UserId = "[email protected]"

$params = @{
    passwordProfile = @{
        forceChangePasswordNextSignIn = $true
        password                      = "B%#X*4BUiHK3%3"
    }
}

Update-MgUser -UserId $userId -BodyParameter $params

Obligue a todos los usuarios a cambiar su contraseña en el próximo inicio de sesión.

Importante:Ponga el administrador UPNlínea1 por lo que queda excluido del guión.

$upnToExclude = "[email protected]"

# Get all users
$allUsers = Get-MgUser -All

foreach ($user in $allUsers) {
    if ($user.UserPrincipalName -ne $upnToExclude) {
        try {
            $userId = $user.Id
            $params = @{
                passwordProfile = @{
                    forceChangePasswordNextSignIn = $true
                }
            }
            Update-MgUser -UserId $userId -BodyParameter $params
            
            # Log successful update
            Write-Host "Successfully updated password profile for user: $($user.UserPrincipalName)" -ForegroundColor Green
        }
        catch {
            # Log error or failure
            Write-Host "Failed to update password profile for user: $($user.UserPrincipalName). Error: $_" -ForegroundColor Red
        }
    }
    else {
        Write-Host "Skipping user with UPN: $upnToExclude" -ForegroundColor Cyan
    }
}

Cambiar contraseña y forzar el cambio de contraseña para todos los usuarios

Forzar el cambio de contraseña para todos los usuarios. Una vez que inicien sesión con la nueva contraseña, se les solicitará que la cambien.

El script de PowerShell creará una contraseña aleatoria para cada usuario y la exportará a un archivo CSV.Restablecer contraseña.csvenC:Temperatura.

RELACIONADO:Cómo forzar la eliminación de contactos en Microsoft 365 con PowerShell

Importante:Ponga el administrador UPNlinea 1por lo que queda excluido del guión.

$upnToExclude = "[email protected]"
$CSVExportPath = "C:tempPasswordReset.csv"
$PasswordLength = 12

# www.alitajran.com/generate-secure-random-passwords-powershell/
function Get-RandomPassword {
    param (
        # The length of each password which should be created.
        [Parameter(Mandatory = $true)]
        [ValidateRange(8, 255)]
        [Int32]$Length,

        # The number of passwords to generate.
        [Parameter(Mandatory = $false)]
        [Int32]$Count = 1,

        # The character sets the password may contain.
        # A password will contain at least one of each of the characters.
        [String[]]$CharacterSet = @(
            'abcdefghijklmnopqrstuvwxyz',
            'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
            '0123456789',
            '!$%&^.#;'
        )
    )

    # Generate a cryptographically secure seed
    $bytes = [Byte[]]::new(4)
    $rng = [System.Security.Cryptography.RandomNumberGenerator]::Create()
    $rng.GetBytes($bytes)
    $seed = [System.BitConverter]::ToInt32($bytes, 0)
    $rnd = [Random]::new($seed)

    # Combine all character sets for random selection
    $allCharacterSets = [String]::Concat($CharacterSet)

    try {
        for ($i = 0; $i -lt $Count; $i++) {
            $password = [Char[]]::new($Length)
            $index = 0

            # Ensure at least one character from each set
            foreach ($set in $CharacterSet) {
                $password[$index++] = $set[$rnd.Next($set.Length)]
            }

            # Fill remaining characters randomly from all sets
            for ($j = $index; $j -lt $Length; $j++) {
                $password[$index++] = $allCharacterSets[$rnd.Next($allCharacterSets.Length)]
            }

            # Fisher-Yates shuffle for randomness
            for ($j = $Length - 1; $j -gt 0; $j--) {
                $m = $rnd.Next($j + 1)
                $t = $password[$j]
                $password[$j] = $password[$m]
                $password[$m] = $t
            }

            # Output each password
            Write-Output ([String]::new($password))
        }
    }
    catch {
        Write-Host "Error: $_" -ForegroundColor Red
    }
}

# Get all users
$allUsers = Get-MgUser -All

$Report = [System.Collections.Generic.List[Object]]::new()

foreach ($user in $allUsers) {
    if ($user.UserPrincipalName -ne $upnToExclude) {
        try {
            $userId = $user.Id
            # Generate a random password
            $newPassword = Get-RandomPassword -Length $PasswordLength
            $params = @{
                passwordProfile = @{
                    forceChangePasswordNextSignIn = $true
                    password                      = $newPassword
                }
            }
            Update-MgUser -UserId $userId -BodyParameter $params
            # Log successful update and add to CSV data
            Write-Host "Successfully updated password for user: $($user.UserPrincipalName) with new password." -ForegroundColor Green
            $ReportLine = [PSCustomObject]@{
                UserPrincipalName = $user.UserPrincipalName
                NewPassword       = $newPassword
            }
            $Report.Add($ReportLine)
        }
        catch {
            Write-Host "Failed to update password for user: $($user.UserPrincipalName). Error: $_" -ForegroundColor Red
            $ReportLine = [PSCustomObject]@{
                UserPrincipalName = $user.UserPrincipalName
                NewPassword       = "Failed to update"
            }
            $Report.Add($ReportLine)
        }
    }
    else {
        Write-Host "Skipping user with UPN: $upnToExclude" -ForegroundColor Cyan
    }
}

# Export data to CSV
$Report | Export-Csv "$CSVExportPath" -NoTypeInformation -Encoding utf8
Write-Host "Passwords have been successfully exported to $CSVExportPath" -ForegroundColor Cyan

¡Eso es todo!

Nota:Si desea saber si el usuario ha cambiado su contraseña u obtener alguna otra información valiosa sobre la contraseña, puede consultar el script de PowerShell.Exportar informe de contraseñas de usuarios de Microsoft 365.

Conclusión

Aprendió cómo forzar el cambio de contraseña para todos los usuarios en Microsoft 365 con PowerShell. Con los comandos y scripts correctos, podrá actuar inmediatamente.

¿Disfrutaste este artículo? También te puede interesar Exportar informe de usuarios inactivos de Microsoft 365. No olvides seguirnos y compartir este artículo.

Related Posts