Enviar de manera segura y eficiente nuevas cuentas y contraseñas a múltiples usuarios por correo electrónico

Para un proyecto en curso, tenía el requisito de enviar información sobre nuevas cuentas y contraseñas a los usuarios de una organización. Afortunadamente, algunas personas del lado del cliente (nombremente Paul Derbyshire y Lewis Davey) habían experimentado una situación similar antes y tenían un script que pude personalizar, para crear una solución basada en pwpush.com y el módulo PowerShell PwPoSh.

La solución permite enviar a los usuarios su información de inicio de sesión y un enlace a pwpush.com para recuperar su contraseña (eliminando el riesgo de enviar contraseñas en un correo electrónico).

El resultado final será un correo electrónico que se verá como el de la imagen:

Cuando el usuario abre el enlace de la contraseña, tendrá la siguiente pantalla que le ofrecerá copiar su contraseña.

Nota: También tuve que configurar Exchange Online para permitir la autenticación SMTP (para solucionar el error 550 5.7.520 de acceso denegado).

Puede crear su propio script basado en el siguiente (también teníamos inscripción de MFA y proporcionamos soporte a través de un canal de Teams):

Install-Module -Name PwPoSh
Import-Module -Name PwPoSh

#SENDER LOGIN DETAILS
$sendermailaddress = "Sender Email Address"
$senderpassword = "Sender Password"
$SecurePWD = ConvertTo-SecureString -Force -AsPlainText $senderpassword
$Credentials = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $sendermailaddress, $SecurePWD

##MESSAGE VARIABLES
$CompanyName = "Name of your company"

##Launch File Browser
Add-Type -AssemblyName System.Windows.Forms
$FileBrowser = New-Object System.Windows.Forms.OpenFileDialog -Property @{Filter = 'CSV Files (*.CSV)|*.CSV'}
$null = $FileBrowser.ShowDialog()

##Get data from selected file and cache in var
$UserAccCSV = $FileBrowser.FileName
$UserAccounts = Import-Csv $UserAccCSV

#foreach ( $user in $UserAccounts )
#{
#$user.pwpush = Publish-Password $user.password
#}


foreach ( $user in $UserAccounts )
{
    $FirstName = $user.name    
    $EmailAddress = $user.email
    $UserPassword = Publish-Password $user.password
    $Recipient = $user.recipient    

$Content = @'
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Email</title>
  <style>
    /* Font Definitions */
    @font-face {
      font-family: "Cambria Math";
      panose-1: 2 4 5 3 5 4 6 3 2 4;
    }
    @font-face {
      font-family: Calibri;
      panose-1: 2 15 5 2 2 2 4 3 2 4;
    }
    @font-face {
      font-family: Tahoma;
      panose-1: 2 11 6 4 3 5 4 4 2 4;
    }
    /* Style Definitions */
    body {
      margin: 0;
      font-family: "Calibri", sans-serif;
      font-size: 11pt;
      line-height: 1.5;
      color: #000;
    }
    a:link, a:visited {
      color: #0563C1;
      text-decoration: underline;
    }
    /* Additional Styles */
    .message {
      margin: 20px 0;
    }
    .message strong {
      font-weight: bold;
    }
  </style>
</head>
<body>
  <p>Hi $FirstName,</p>
  <div class="message">
    <p>We have created your $CompanyName account.</p>
    <p>E-mail Address: <a href="mailto:$EmailAddress">$EmailAddress</a></p>
    <p>E-mail Password: $UserPassword</p>
    <p><strong>THIS PASSWORD LINK WILL EXPIRE IN 7 DAYS - PLEASE ACTION NOW.</strong></p>
  </div>
  <div class="message">
    <p>On first sign-in, you will need to set up MFA using an authenticator app or mobile phone. As soon as you have logged in, please immediately change your password.</p>
  </div>
  <div class="message">
    <p>Do not reply to this email as the mailbox is not monitored. If you have any queries, please direct them to:</p>
    <ul>
      <li>Email for the M365 Migration teams’ channel <a href="mailto:[email protected]">[email protected]</a></li>
      <li>Or post a message in Teams in "M365 Migration"</li>
    </ul>
  </div>
</body>
</html>
'@
$CWCN = $Content.Replace('$CompanyName', $CompanyName)
$CWCNAFN = $CWCN.Replace('$FirstName', $FirstName)
$CWCNAFNAEM = $CWCNAFN.Replace('$EmailAddress', $EmailAddress)
$CWCNAFNAEMAP = $CWCNAFNAEM.Replace('$UserPassword', $UserPassword)

Send-MailMessage -SmtpServer 'smtp.office365.com' -UseSsl -Credential $Credentials -Subject "$CompanyName account - log in details" -To $Recipient -From $sendermailaddress -Port 587 -BodyAsHtml $CWCNAFNAEMAP
}

El archivo .csv debe contener los siguientes campos: contraseña, nombre, destinatario, correo electrónico (consulte la imagen a continuación para obtener más detalles).