当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 使用 PowerShell 脚本发送电子邮件到 Office 365 并保存加密密码 |第 2 部分#2

作者:精品下载站 日期:2024-12-14 20:39:58 浏览:12 分类:玩电脑

使用 PowerShell 脚本发送电子邮件到 Office 365 并保存加密密码 |第 2 部分#2


在下面的文章中,我们将回顾如何编写和运行PowerShell脚本;它将寻址 Office 365 邮件服务器 (Exchange Online)。
在我们在上一篇文章中研究的场景中,我们回顾了一种情况,其中我们匿名寻址 Office 365 邮件服务器(不提供用户凭据)。
在当前场景中,我们希望实现更高级的配置。在当前的场景中,我们想在邮件通信中添加两个组件

1. Office 365 用户凭据

证明 Office 365 用户凭据的主要原因是,如果寻址 Office 365 邮件服务器的“元素”(PowerShell 脚本)被视为“已识别的用户\收件人”,则邮件服务器与该元素的关系如下:一个值得信赖的实体。

使用我们提供用户凭据的过程,使我们能够避免 PowerShell 脚本发送的电子邮件被识别为“有问题的邮件”的情况,因此,将被阻止或重定向到用户的垃圾邮件。

另一个优点是,当我们使用经过身份验证的会话时,我们可以将电子邮件发送给外部收件人,即不由 Exchange Online 服务器托管的收件人。

2.创建加密通信通道

我们将添加的额外安全层是,在当前场景中,我们希望在运行 PowerShell 脚本的桌面和 Office 365 邮件服务器之间使用安全通信链接。安全通信链路的实现是通过使用 TLS 协议来实现的。

通过使用TLS协议,我们可以确保发送电子邮件的主机和Office 365邮件服务器之间的通信通道是加密的。

在基于 Office 365 的环境中,当我们想要使用 TLS 寻址 Office 365 邮件服务器时,我们需要寻址主机名 - smtp.office365.com

PowerShell 脚本和用户凭据

在我们需要使用需要使用用户凭据的PowerShell脚本的场景中,我们可以选择以下三个选项之一:

1. 将密码写入 PowerShell 脚本的一部分

将密码添加到 PowerShell 脚本文件中 - 这是最简单的选项,但从安全角度来看,这是最糟糕的选项,因为密码以非加密格式保存在文本文件中。 (我们不会审查此选项)

2.运行 PowerShell 脚本时向我们提供电子凭据

在这种情况下,PowerShell 脚本包含一个“空变量”,其中将包含所需的用户凭据。

当我们运行 PowerShell 脚本时,将出现一个弹出窗口。
执行 PowerShell 脚本的人员需要提供所需的凭据。

有关用户凭据的信息将以加密格式保存在桌面 RAM 中,并在我们关闭 PowerShell 会话时“删除”。

从安全角度来看,这是一个更好的选择,因为凭据已加密。
此方法的主要缺点是,如果我们需要使用 Windows 任务计划程序等机制自动运行 PowerShell,我们不能使用此选项,因为我们需要一个“人为因素”来提供所需的凭据。

3. 将凭证保存在加密文件中

在此方法中,我们通过将凭据保存在存储在运行“发送电子邮件 PowerShell 脚本”的桌面上的加密文件中来提前提供所需的用户凭据。

在这种情况下,我们实施了一个两阶段的过程:

第 1 阶段 - 使用加密格式保存密码

在此步骤中,我们使用 PowerShell 命令来加密用户凭据。
如果我们想要更准确,我们将仅加密“密码”的一部分,而不是用户名。

我们需要向 PowerShell 提供“用户密码”,PowerShell 命令将获取该密码、加密密码并将其保存在文本文件中。

换句话说,这些信息是人类无法读取的。

[玩转系统] 使用 PowerShell 脚本发送电子邮件到 Office 365 并保存加密密码 |第 2 部分#2

第 2 阶段 - 创建“发送邮件 PowerShell 脚本”,该脚本将读取凭据

在第二阶段,我们创建一个“发送邮件 PowerShell 脚本”,它将使用安全通信通道(使用 TLS + 提供用户凭据)来寻址 Exchange Online 服务器。

我们需要为“发送邮件 PowerShell 脚本”提供加密密码文件的路径。

“发送邮件 PowerShell 脚本”将访问加密密码、读取信息并解密密码。

[玩转系统] 使用 PowerShell 脚本发送电子邮件到 Office 365 并保存加密密码 |第 2 部分#2

使用“发送邮件 PowerShell 脚本”的一般准则和要求

在运行“发送邮件 PowerShell 脚本”之前,我们需要确保满足以下要求:

1. PowerShell 控制台和 Set-ExecutionPolicy

默认情况下,PowerShell 控制台不允许运行 PowerShell 脚本。
如果我们过去没有使用 PowerShell 控制台来运行 PowerShell 脚本,我们需要将 PowerShell 控制台配置为“允许》 PowerShell脚本执行。

如果您需要阅读如何启用 PowerShell 脚本执行的说明,可以使用上一篇文章中的说明

2.网络防火墙和出站通信

基于端口 25 的 Exchange Online 服务器的通信通道。
我们需要验证我们的网络防火墙是否包含一条规则,使我们的桌面能够与 Office 365 邮件服务器实现 SMTP 会话(端口 25)。

3.动态与静态 IP 地址

如果您从使用“动态公共 IP 地址”(例如家庭网络)的桌面运行“发送电子邮件 PowerShell 脚本”,Office 365 邮件服务器(Exchange Online)将不会接受通信请求。

您将需要使用位于网络上的主机,该网络使用静态 IP 地址来表示内部主机。

场景描述

为了能够演示我们如何使用“发送电子邮件 PowerShell 脚本”通过 Office 365 邮件服务器 (Exchange Online) 发送
电子邮件,我们将使用以下场景:

组织信息

  • 我们的组织公共域名是 - o365info.com
  • 我们的邮件基础设施托管在 Office 365 (Exchange Online) 上。

用户凭据

我们将使用其凭据的 Office 365 收件人是 -[email protected]
源发件人和目标收件人

在我们的场景中,我们将使用以下收件人:

Office 365 邮件基础设施

在 Office 365 环境中,我们使用主机名 - smtp.office365.com 来寻址 Office 365 邮件服务器,该服务器通过使用 TLS 提供加密的通信通道。

  • 我们使用的通信端口是 25 (TLS)

注意:在非 Office 365 环境中使用“发送电子邮件 PowerShell 脚本”。该演示是在基于Office 365的环境下实现的。运行“发送电子邮件PowerShell脚本”的过程可以为任何现有的邮件基础设施实施。您所需要做的就是调整所需的参数,例如发件人电子邮件地址、邮件服务器主机名、端口号等。

[玩转系统] 使用 PowerShell 脚本发送电子邮件到 Office 365 并保存加密密码 |第 2 部分#2

方法 1 - 使用 TLS 会话和经过身份验证的会话通过 Office 365 邮件服务器发送电子邮件 |运行脚本时提供用户凭据

在下一节中,我们将回顾创建“发送邮件 PowerShell 脚本”的过程。

当前场景的主要特征是,我们将在 PowerShell 脚本执行时“实时”提供所需的用户凭据。

我们创建的“发送邮件 PowerShell 脚本”包含 PowerShell 命令,该命令将:

  • 显示我们用于提供所需凭据的“凭据窗口”。
  • 初始化与 Exchange Online 服务器的经过身份验证的 TLS 通信会话。

任务 1#2 - 创建“发送邮件 PowerShell 脚本”。

“发送邮件 PowerShell 脚本”是使用以下 PowerShell 语法创建的:

$cred = Get-credential
Send-MailMessage -From <sender E-mail address> -To <recipient E-mail address> -Subject “<text>” -Body “Text>” -SmtpServer <Mail server> -Credential $cred
-UseSsl -Port <Port number>

在我们的场景中,我们定义一个名为“$cred”的变量,它将用作用户提供的凭据的容器。

“$cred”变量将调用 PowerShell 命令 - Get-credential,该命令将用于显示凭据弹出窗口。

在我们的场景中,我们将使用带有以下参数的 PowerShell 命令语法:

$cred = Get-credential
Send-MailMessage -From [email protected] -To [email protected] -Subject "Test Email" -Body "Test SMTP Relay Service" -SmtpServer smtp.office365.com -Credential $cred -UseSsl -Port 25

在下面的屏幕截图中,我们可以看到 PowerShell 脚本的示例。

[玩转系统] 使用 PowerShell 脚本发送电子邮件到 Office 365 并保存加密密码 |第 2 部分#2

保存PowerShell脚本文件

下一步是将文本文件保存为 PowerShell 脚本。

我们使用记事本创建 PowerShell 脚本。
在我们的场景中,我们将 PowerShell 脚本命名为 - Sendmail.ps1

  1. 在“保存类型”部分中,选择选项“所有文件 (*.*)”。
  2. 另外推荐的选项是,使用 UTF-8 保存 PowerShell 脚本
    这不是强制要求,但是根据我的经验,在使用标准格式保存 PowerShell 脚本时,例如作为 ANSI,当我们尝试从 PowerShell 控制台运行 PowerShell 脚本时,我们可能会遇到问题。

[玩转系统] 使用 PowerShell 脚本发送电子邮件到 Office 365 并保存加密密码 |第 2 部分#2

在我们的场景中,我们将 PowerShell 脚本保存在位于 C: 驱动器中名为 - script 的文件夹中。

[玩转系统] 使用 PowerShell 脚本发送电子邮件到 Office 365 并保存加密密码 |第 2 部分#2

任务 2#2 - 运行“发送邮件 PowerShell 脚本”

我们将使用以下命令从 PowerShell 控制台运行 PowerShell 脚本:

1. 通过导航到 PowerShell 脚本所在的路径来访问 PowerShell 脚本。
在我们的场景中,PowerShell 脚本位于 C:\script 文件夹中。

键入以下命令:

cd c:\script

2.运行PowerShell脚本

要执行 PowerShell 脚本,我们可以编写脚本的全名 - Sendmail.ps1 或使用 PowerShell 自动完成 功能。

例如,要调用 PowerShell 脚本,我们需要编写以下字符 - .\ ,输入 PowerShell 脚本的第一个字母 (“s“) 并点击 Tab键。

“点击”TAB 键后,PowerShell 控制台将自动完成 PowerShell 脚本名称的其余部分。

[玩转系统] 使用 PowerShell 脚本发送电子邮件到 Office 365 并保存加密密码 |第 2 部分#2

在下面的屏幕截图中,我们可以看到,当我们尝试运行“发送邮件 PowerShell 脚本”时,会出现一个“凭据窗口”。

我们需要提供所需的凭据,然后才可以; PowerShell 脚本将继续到发送所需电子邮件的阶段。

[玩转系统] 使用 PowerShell 脚本发送电子邮件到 Office 365 并保存加密密码 |第 2 部分#2

在下面的屏幕截图中,我们可以看到电子邮件已成功发送到目标收件人。

[玩转系统] 使用 PowerShell 脚本发送电子邮件到 Office 365 并保存加密密码 |第 2 部分#2

方法 2 - 使用 TLS 会话和经过身份验证的会话通过 Office 365 邮件服务器发送电子邮件 |使用保存的加密用户凭据

在这种情况下,我们希望实现一个解决方案,其中 PowerShell 脚本将能够访问存储在文件中的预定义凭据。

用户凭据将使用加密的文本文件保存。

我们需要完成的任务如下:

  1. 获取我们将处理的邮件服务器的主机名

如前所述,在基于 Office 365 的环境中,我们用于创建经过身份验证的 TLS 会话的主机名是 - smtp.office365.com

  1. 执行 PowerShell,将我们的密码保存在加密文件中
  2. 创建一个 PowerShell 脚本,该脚本将使用加密的凭据并包含所需的参数,例如发件人电子邮件地址、收件人电子邮件地址、邮件服务器名称、邮件服务器端口号、用户凭据等。
  3. 运行“发送电子邮件 PowerShell 脚本”,并验证电子邮件是否已成功发送到目标收件人。

任务 1#3 - 使用 PowerShell 命令加密包含密码的文本文件

为了能够加密用户凭据,我们将使用两个 PowerShell 命令的组合

  1. 获取用户密码

我们将使用 PowerShell 命令:

- Read-Host -Prompt "" -AsSecureString
  1. 第二个 PowerShell 命令将获取前一个命令的输入并执行以下任务:
  2. 创建一个新的文本文件。
  3. 将密码保存到文本文件中。
  4. 加密密码。

我们将使用 PowerShell 命令:

- ConvertFrom-SecureString | Out-File "Path"

完整的 PowerShell 命令语法示例如下:

Read-Host -Prompt "<text>" -AsSecureString | ConvertFrom-SecureString | Out-File "Path"

在我们的场景中,我们将使用带有以下参数的 PowerShell 命令:

  • 文本文件将被命名为 - credtxt
  • 将创建 cred.txt 并将其保存在以下路径中 - C:\users\administrator
Read-Host -Prompt "Enter your tenant password" -AsSecureString | ConvertFrom-SecureString | Out-File "C:\users\administrator\cred.txt"

在下面的屏幕截图中,我们可以看到在 PowerShell 控制台中使用该命令的示例:

[玩转系统] 使用 PowerShell 脚本发送电子邮件到 Office 365 并保存加密密码 |第 2 部分#2

结果出现提示,要求输入密码

[玩转系统] 使用 PowerShell 脚本发送电子邮件到 Office 365 并保存加密密码 |第 2 部分#2

在下面的屏幕截图中,我们可以看到密码保存到名为 cred.txt 的文件中。

[玩转系统] 使用 PowerShell 脚本发送电子邮件到 Office 365 并保存加密密码 |第 2 部分#2

在下面的屏幕截图中,我们可以看到创建的加密文本文件的内容。

[玩转系统] 使用 PowerShell 脚本发送电子邮件到 Office 365 并保存加密密码 |第 2 部分#2

任务 2#3 - 创建“发送邮件 PowerShell 脚本”

在此阶段,我们创建“发送邮件 PowerShell 脚本”,其中包括两部分:

第 1 部分 - 用户凭据

在这一部分中,我们定义了三个变量。

  • $AdminName - 用于在 Exchange Online 服务器之前进行身份验证的用户的 Office 365 UPN 名称。
  • $Pass - 包含访问加密密码文件并“获取”密码的 PowerShell 命令的变量。
  • $Cred - 一个变量,用于存储包含用户名+密码的凭据

注意:变量名称只是我使用的任意名称。您可以定义适合您需要的其他变量名称。

我们使用的 PowerShell 命令语法是:

$AdminName = "UPN Name"
$Pass = Get-Content "<Path>" | ConvertTo-SecureString
$Cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $AdminName, $Pass

在我们的场景中,我们将使用带有以下参数的 PowerShell 命令:

$AdminName = "[email protected]"
$Pass = Get-Content "C:\users\administrator\cred.txt" | ConvertTo-SecureString
$cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $AdminName, $Pas

第 2 部分 - 发送邮件 PowerShell 命令

“发送邮件 PowerShell 脚本”的第二部分包括 PowerShell 命令,这些命令将初始化与 Exchange Online 服务器的经过身份验证的 TLS 通信。

我们使用的 PowerShell 命令语法是:

Send-MailMessage -From <sender E-mail address> -To <recipient E-mail address> -Subject "<text>" -Body "Text>" -SmtpServer <Nail server> -Credential <credentials> -UseSsl -Port <Port number>

在我们的场景中,我们将使用带有以下参数的 PowerShell 命令:

Send-MailMessage -From [email protected] -To [email protected] -Subject "Test Email" -Body "Test SMTP Relay Service" -SmtpServer smtp.office365.com -Credential $cred -UseSsl -Port 25

在下面的屏幕截图中,我们可以看到“完整”发送邮件PowerShell脚本的示例,其中包括两部分。

[玩转系统] 使用 PowerShell 脚本发送电子邮件到 Office 365 并保存加密密码 |第 2 部分#2

不要关注“第二部分”,其中包括将与 Exchange Online 服务器执行经过身份验证的 TLS 会话的 PowerShell 命令:

[玩转系统] 使用 PowerShell 脚本发送电子邮件到 Office 365 并保存加密密码 |第 2 部分#2

  • 发件人(数字 1) - 我们将使用电子邮件地址 - [email protected]
    代表发件人电子邮件地址。
  • 收件人(数字 2) - 我们将使用电子邮件地址 - [email protected]
    代表目标收件人电子邮件地址。
  • 主题(数字 3)——这是电子邮件主题的文本。
  • 正文(数字 4)- 这是将出现在电子邮件“正文”上的文本
  • SmtpServer(数字 5)——这是我们要寻址的邮件服务器的主机名或 IP 地址。在我们的场景中,我们希望将 Exchange Online 服务器称为“邮件服务器”。服务器”。我们将提供主机名smtp.office365.com
  • 凭据(数字 6) - 此命令使用包含用户凭据(用户名 + 密码)的 $cred 变量。
  • UseSSL(数字 7) - 定义 TLS 会话而不是默认 SMTP 会话的 PowerShell 命令。
  • 端口(数字 8)——这是将“侦听”我们的通信请求的邮件服务器的端口号。在 Office 365 环境中,Exchange Online 将使用端口 25 进行侦听。请注意,我们使用端口 25 进行 TLS 通信,我们不需要使用标准 TLS 端口号,例如 587。

保存PowerShell脚本文件

假设我们将所有必需的 PowerShell 命令添加到编辑器中,下一步是将文本文件保存为 PowerShell 脚本。
在我们的场景中,我们将 PowerShell 脚本命名为 - Sendmail-Encrypted.ps1

  1. 在“保存类型”部分中,选择选项“所有文件 (*.*)”。
  2. 另外推荐的选项是使用 UTF-8 保存 PowerShell 脚本
    这不是强制性要求,但是根据我的经验,当使用标准格式(例如 ANSI)保存 PowerShell 脚本时,当我们尝试从 PowerShell 控制台运行 PowerShell 脚本时,可能会遇到问题。

[玩转系统] 使用 PowerShell 脚本发送电子邮件到 Office 365 并保存加密密码 |第 2 部分#2

在我们的场景中,我们将“发送电子邮件 PowerShell 脚本”保存在我们在驱动器 C: 中创建的 script 文件夹中

[玩转系统] 使用 PowerShell 脚本发送电子邮件到 Office 365 并保存加密密码 |第 2 部分#2

任务 3#3 - 运行“发送邮件 PowerShell 脚本”

我们将使用以下命令从 PowerShell 控制台运行“发送邮件 PowerShell”:

  1. 通过导航到 PowerShell 脚本所在的路径来访问 PowerShell 脚本。
    在我们的场景中,PowerShell 脚本位于 C:\script 文件夹中。

键入以下命令:

cd c:\script
  1. 运行 PowerShell 脚本

要执行 PowerShell 脚本,我们可以编写
脚本的全名 - Sendmail-Encrypted.ps1 或使用 PowerShell 自动完成功能。

例如,要调用PowerShell脚本,我们需要编写以下字符 - .\ ,输入PowerShell脚本的第一个字母(“s”)并点击Tab 键。

“敲击”TAB键后,PowerShell控制台将自动自行完成PowerShell脚本名称的其余部分。

[玩转系统] 使用 PowerShell 脚本发送电子邮件到 Office 365 并保存加密密码 |第 2 部分#2

为了验证电子邮件是否成功发送,我们将使用 OWA 邮件客户端登录到管理邮箱。

在下面的截图中,我们可以看到电子邮件已成功发送到目标收件人

[玩转系统] 使用 PowerShell 脚本发送电子邮件到 Office 365 并保存加密密码 |第 2 部分#2

使用 Windows 任务计划程序运行 PowerShell 脚本

在下面的部分中,我将回顾一下该过程,其中我们可以使用 Windows 内置组件 - Windows 任务计划程序来定期运行 PowerShell 脚本。

在我们的场景中,我们希望使用我们在上一节中学习如何创建的“发送邮件 PowerShell 脚本”,以便该脚本每天发送电子邮件。

为了能够满足这个要求,我们将创建一个新的窗口任务调度程序任务。

计划任务将每天运行一次,并执行以下任务 - “调用”将运行“发送电子邮件 PowerShell 脚本”的操作系统 PowerShell 组件。

在我们想要运行 PowerShell 脚本的场景中,我们需要“告诉”计划任务我们保存 PowerShell 脚本的路径是什么。

创建 Windows 任务计划程序任务

  • 启动 Windows 任务计划程序

[玩转系统] 使用 PowerShell 脚本发送电子邮件到 Office 365 并保存加密密码 |第 2 部分#2

  • 右键单击名为 - 任务计划程序库的文件夹
  • 选择选项 - 创建基本任务...

[玩转系统] 使用 PowerShell 脚本发送电子邮件到 Office 365 并保存加密密码 |第 2 部分#2

  • 写入计划任务的名称

[玩转系统] 使用 PowerShell 脚本发送电子邮件到 Office 365 并保存加密密码 |第 2 部分#2

  • 在我们的场景中,我们选择选项 - 每日

[玩转系统] 使用 PowerShell 脚本发送电子邮件到 Office 365 并保存加密密码 |第 2 部分#2

  • 指定任务运行的时间

[玩转系统] 使用 PowerShell 脚本发送电子邮件到 Office 365 并保存加密密码 |第 2 部分#2

  • 选择选项 - 启动程序

[玩转系统] 使用 PowerShell 脚本发送电子邮件到 Office 365 并保存加密密码 |第 2 部分#2

  • 在名为“程序/脚本:”的部分中写入 - PowerShell
  • 在名为“添加参数(可选):”的部分中,添加 PowerShell 脚本的路径

[玩转系统] 使用 PowerShell 脚本发送电子邮件到 Office 365 并保存加密密码 |第 2 部分#2

  • 单击完成保存计划任务

[玩转系统] 使用 PowerShell 脚本发送电子邮件到 Office 365 并保存加密密码 |第 2 部分#2

在下面的屏幕截图中,我们可以看到一个新任务添加到现有任务列表中

[玩转系统] 使用 PowerShell 脚本发送电子邮件到 Office 365 并保存加密密码 |第 2 部分#2

如果您想测试创建的计划任务,您可以右键单击特定任务并选择选项 - 运行

[玩转系统] 使用 PowerShell 脚本发送电子邮件到 Office 365 并保存加密密码 |第 2 部分#2

当前系列的下一篇文章

使用 PowerShell 脚本向 Office 365 发送电子邮件 |第 1 部分#2

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯