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

[玩转系统] 如何使用 Azure 自动化 - [完整指南]

作者:精品下载站 日期:2024-12-14 03:38:52 浏览:16 分类:玩电脑

如何使用 Azure 自动化 - [完整指南]


Azure 自动化是在云中运行 PowerShell 脚本的最流行的工具之一。例如,您不仅可以使用 Runbook 管理 Azure 环境,还可以管理 Microsoft Office 365 租户。

自动化是 IT 的关键部分,作为系统管理员,您应该努力实现大部分日常/手动任务的自动化。一开始编写脚本可能需要一些时间,但从长远来看会节省你很多时间。

在本文中,我将解释如何设置 Azure 自动化帐户以及如何在 Azure 中创建第一个 PowerShell Runbook。

Azure 自动化要求

开始在 Azure 中运行 PowerShell 脚本只有几个要求:

  • Azure 订阅(即用即付)
  • Azure 自动化帐户

您可以从 Azure 订阅的免费试用开始,但按量付费订阅也不是很贵。

建议

从 2023 年 9 月开始,我们无法再使用 RunAs 帐户。确保在此日期之前迁移 Runbook 以使用托管标识进行身份验证。阅读本文中有关托管身份的所有内容。

Azure 自动化定价

Azure 自动化的定价基于作业运行的分钟数。每次订阅,您每月可以免费获得 500 分钟的作业运行时间和 744 小时的观察者时间。

Job run time

500分钟

Watchers

744小时

为了给您提供一个想法,一个简单的脚本只需 1 分钟即可检查我的租户中所有用户的 MFA 状态。创建 SharePoint 团队网站并向其应用模板总共需要 30 秒。

因此,有了 500 分钟的免费时间,您应该能够自动化大部分日常任务 ? 并且每小时只需花费 0.12 美元。

Azure 自动化入门

要开始使用 Azure 自动化,我们需要创建一个 Azure 自动化帐户并安装正确的PowerShell 模块

  1. 登录 Azure 门户

    转到 https://portal.azure.com/ 并使用您的 Office 365 凭据登录。

  2. 转到自动化帐户服务

    使用搜索栏查找自动化帐户服务

    [玩转系统] 如何使用 Azure 自动化 - [完整指南]

  3. 创建新的自动化帐户

    单击创建创建一个新的自动化帐户。
    - 为您的自动化帐户命名
    - 选择您的订阅(免费试用或按需付费)
    - 创建或选择资源组

    创建资源组可能需要几分钟时间。

    [玩转系统] 如何使用 Azure 自动化 - [完整指南]

  4. 开设您的 Azure 自动化帐户

    创建后选择新的自动化帐户。

  5. 安装 PowerShell 模块

    在开始创建第一个 Runbook 之前,我们首先需要安装必要的 PowerShell 模块。

    选择模块,然后单击浏览库

    安装以下模块:

    - PnP.PowerShell
    - AzureAD
    - ExchangeOnlineManagement

    [玩转系统] 如何使用 Azure 自动化 - [完整指南]

我们现在已经创建了 Azure 自动化帐户,可以开始创建我们的第一个 Runbook。

使用 MFA 时在 Azure Runbook 中进行身份验证

Azure Runbooks 中的身份验证始终是一个挑战。您可以使用条件访问规则从 MFA 中排除 Azure 服务,但这需要您及时了解所有 IP 地址。

另一种选择是从 MFA 中排除服务帐户,但这不是最佳实践。服务帐户可能具有全局管理员权限,因此您希望正确保护这些帐户。

那么如何在 Azure Runbook 中向 AzureAD 或 Exchange Online 进行身份验证?好吧,我们可以使用 Azure 运行方式帐户。

在创建 Azure 自动化帐户期间,我们还自动创建了一个运行方式帐户。运行方式帐户使用自签名证书为 Azure Runbook、自动化和管理 Azure 资源管理器上的资源提供身份验证。

警告

从 2023 年 9 月开始,我们无法再使用 RunAs 帐户。确保在此日期之前迁移 Runbook 以使用托管标识进行身份验证。阅读本文中有关托管身份的所有内容。

笔记

该证书的有效期仅为一年。您需要确保在证书过期之前更新证书。

我们将为运行方式帐户分配正确的权限以访问 AzureAD、Exchange Online 和 SharePoint。首先,我们需要找到帐户的 objectId

  1. Azure 自动化帐户中选择作为帐户运行
  2. 记下服务主体对象 ID

[玩转系统] 如何使用 Azure 自动化 - [完整指南]

我们将一一添加正确的权限。您可以在我的 Github 上找到完整的脚本,该脚本将在一次运行中设置所有权限。

从 Azure Runbook 连接到 AzureAD

我们将首先授予我们的服务主体帐户访问 AzureAD 的正确权限。确保本地安装了 AzureAD 模块并打开 PowerShell。

首先连接到 Azure AD 并将服务主体对象 ID 替换为你自己的对象 ID。

# Connect to Azure AD
Connect-AzureAD

# Get the Service Principal based on the object Id
$servicePrincipalObjectId = "6dgw124-0000-1111-1337-abc123def456"

如果您只需要从 AzureAD 读取数据,则可以为服务主体授予目录读取者角色。

Add-AzureADDirectoryRoleMember -ObjectId (Get-AzureADDirectoryRole | where-object {$_.DisplayName -eq "Directory Reader"}).Objectid -RefObjectId $servicePrincipalObjectId

另一种选择是使其成为全局管理员,以便它可以完全管理您的 Active Directory:

Add-AzureADDirectoryRoleMember -ObjectId (Get-AzureADDirectoryRole | where-object {$_.DisplayName -eq "Company Administrator"}).Objectid -RefObjectId $servicePrincipalObjectId

您可以使用以下 cmd 列出租户中的所有可用角色

Get-AzureADDirectoryRole

现在,您可以使用 PowerShell Runbook 中的以下代码连接到 AzureAD。

# Get the service principal connection details
$spConnection = Get-AutomationConnection -Name AzureRunAsConnection

# Connect AzureAd
Connect-AzureAD -TenantId $spConnection.TenantId -ApplicationId $spConnection.ApplicationID -CertificateThumbprint $spConnection.CertificateThumbprint | No-Output

# Test connection:
"User count:" 
(Get-AzureADUser).count

从 Azure Runbook 连接到 Exchange Online

需要执行一个额外步骤来授予服务主体帐户对 Exchange Online 的访问权限。我们必须为其授予 Exchange 管理员角色和适当的 API 权限。

# Connect to Azure AD
Connect-AzureAD

# Get the Service Principal based on the object Id
$servicePrincipalObjectId = "6dgw124-0000-1111-1337-abc123def456"

# Assign the Exchange Administrator Role
Add-AzureADDirectoryRoleMember -ObjectId (Get-AzureADDirectoryRole | where-object {$_.DisplayName -eq "Exchange Administrator"}).Objectid -RefObjectId $servicePrincipalObjectId

如果您的租户中没有 Exchange 管理员角色,则可以使用以下代码启用它:

if (Get-AzureADDirectoryRole | where-object {$_.DisplayName -eq "Exchange Administrator"} -eq $null) { 
	Enable-AzureADDirectoryRole -RoleTemplateId (Get-AzureADDirectoryRoleTemplate | Where-Object {$_.DisplayName -eq "Exchange Administrator"}).Objectid
}

对于 Exchange Online API 权限,我们可以使用以下代码:

# Get the Office 365 Exchange Online App
$EXOApp = (Get-AzureADServicePrincipal -Filter "AppID eq '00000002-0000-0ff1-ce00-000000000000'")
$servicePrincipal = Get-AzureADServicePrincipal -ObjectId $servicePrincipalObjectId

# Get the roles
$permission = $EXOApp.AppRoles | Where-Object { $_.Value -eq 'Exchange.ManageAsApp' }

# Create the permission object
$apiPermission = [Microsoft.Open.AzureAD.Model.RequiredResourceAccess]@{
    ResourceAppId  = $EXOApp.AppId ;
    ResourceAccess = [Microsoft.Open.AzureAD.Model.ResourceAccess]@{
        Id   = $permission.Id ;
        Type = "Role"
    }
}
$Application = Get-AzureADApplication | Where-Object {$_.AppId -eq $servicePrincipal.AppId}
$Application | Set-AzureADApplication -ReplyUrls 'http://localhost'
$Application | Set-AzureADApplication -RequiredResourceAccess $apiPermission

您现在需要做的就是授予管理员同意我们分配的权限。

  1. 打开您的Azure Active Directory
  2. 选择应用注册
  3. 点击所有应用程序并选择您的自动化帐户
  4. 转到 API 权限
  5. 点击授予管理员同意

[玩转系统] 如何使用 Azure 自动化 - [完整指南]

现在,您可以使用以下 PowerShell 代码在 Azure Runbook 中连接到 Exchange Online

# Get the service principal connection details
$spConnection = Get-AutomationConnection -Name AzureRunAsConnection

# Set your tenant name
$tenantName = "contoso.onmicrosoft.com"

# Connect to ExchangeOnline
Connect-ExchangeOnline -CertificateThumbprint $spConnection.CertificateThumbprint -AppId $spConnection.ApplicationID -Organization $tenantName

# Test connection
(Get-ExoMailbox).count

从 Azure Runbook 连接到 SharePoint/PnPOnline

如果要在 Azure Runbook 中使用 PnPOnline,则需要授予对 SharePoint API 甚至 Graph 的访问权限。

我使用一些权限来自动创建 SharePoint 网站并应用具有默认文件夹的模板。您可能不需要所有权限,但这为您提供了设置它们的想法。

# Get Office 365 SharePoint Online App
$spApp = (Get-AzureADServicePrincipal -Filter "AppID eq '00000003-0000-0ff1-ce00-000000000000'")

# Get the roles
# All sites full control
$spSitesControl = $SPApp.AppRoles | Where-Object { $_.Value -eq 'Sites.FullControl.All' }

# User read write
$spUserControl= $SPApp.AppRoles | Where-Object { $_.Value -eq 'User.ReadWrite.All' }

# TermStore
$spTermControl= $SPApp.AppRoles | Where-Object { $_.Value -eq 'TermStore.ReadWrite.All' }

# NOTE: If you format the code below nicely, and copy-paste it, it will make typeID from the Id attribute :s

$spPermission = [Microsoft.Open.AzureAD.Model.RequiredResourceAccess]@{
    ResourceAppId  = $spApp.AppId ;
    ResourceAccess = [Microsoft.Open.AzureAD.Model.ResourceAccess]@{Id   = $spSitesControl.Id;Type = "Role";},
				[Microsoft.Open.AzureAD.Model.ResourceAccess]@{Id   = $spUserControl.Id;Type = "Role";},
				[Microsoft.Open.AzureAD.Model.ResourceAccess]@{Id   = $spTermControl.Id ;Type = "Role";}
}

$Application = Get-AzureADApplication | Where-Object {$_.AppId -eq $servicePrincipal.AppId}
$Application | Set-AzureADApplication -ReplyUrls 'http://localhost'
$Application | Set-AzureADApplication -RequiredResourceAccess $spPermission

同样,您需要授予管理员同意权限:

  1. 打开您的Azure Active Directory
  2. 选择应用注册
  3. 点击所有应用程序并选择您的自动化帐户
  4. 转到 API 权限
  5. 点击授予管理员同意

要连接到 PnPOnline,您可以在 Azure Runbook 中使用以下代码:

# Get the service principal connection details
$spConnection = Get-AutomationConnection -Name AzureRunAsConnection

# Connect to PnPOnline
Connect-PnPOnline -ClientId $spConnection.ApplicationID -Url "https://contoso.sharepoint.com" -Tenant contoso.onmicrosoft.com -Thumbprint $spConnection.CertificateThumbprint

# Test connection
(get-pnptenantsite).count

我还需要访问 Graph,因此也添加了 API 权限:

#
# Get Graph App
#
$graphApp = (Get-AzureADServicePrincipal -Filter "AppID eq '00000003-0000-0000-c000-000000000000'")

# Group read write
$graphGroupControl = $graphApp.AppRoles | Where-Object { $_.Value -eq 'Group.ReadWrite.All' }

# User read write
$graphUserControl = $graphApp.AppRoles | Where-Object { $_.Value -eq 'User.ReadWrite.All' }

# NOTE: If you format the code below nicely, and copy-paste it, it will make typeID from the Id attribute :s
$graphPermission = [Microsoft.Open.AzureAD.Model.RequiredResourceAccess]@{
    ResourceAppId  = $graphApp.AppId ;
    ResourceAccess = [Microsoft.Open.AzureAD.Model.ResourceAccess]@{Id   = $graphGroupControl.Id;Type = "Role";},
				[Microsoft.Open.AzureAD.Model.ResourceAccess]@{Id   = $graphUserControl.Id;Type = "Role";}
}

$Application = Get-AzureADApplication | Where-Object {$_.AppId -eq $servicePrincipal.AppId}
$Application | Set-AzureADApplication -ReplyUrls 'http://localhost'
$Application | Set-AzureADApplication -RequiredResourceAccess $graphPermission

再次在 Azure AD 中授予管理员同意。

如果您已连接 PnPOnline,那么您可以轻松获取访问令牌以连接到 Graph:

# User Graph
$accessToken = Get-PnPAccessToken

$header = @{
  "Content-Type" = "application/json"
  Authorization = "Bearer $accessToken"
}

# Get users to test Graph
Invoke-RestMethod -Uri "https://graph.microsoft.com/v1.0/users/" -Method Get -Headers $header

Azure Active Directory 中所有权限的结果应如下所示:

[玩转系统] 如何使用 Azure 自动化 - [完整指南]

您还可以将 Azure 门户中的权限添加到您的服务主体帐户。如果您不知道要查找的确切权限名称,这可能会更方便。

在 Azure 活动目录中:

  1. 选择应用注册
  2. 点击所有应用程序并选择您的自动化帐户
  3. 转到API权限
  4. 点击添加权限
  5. 选择您需要的API,例如 SharePoint
  6. 选择应用程序权限并选择您需要的权限。

[玩转系统] 如何使用 Azure 自动化 - [完整指南]

在 Azure 自动化 Runbook 中使用变量

在开始创建第一个 Runbook 之前,我们首先要了解一下变量的使用。您可以在自动化帐户中定义可在 Runbook 中使用和更改的全局变量。您可以创建不同类型的变量,并且它们也可以加密。

如果您在 Azure 自动化帐户中向下滚动,您将在共享资源下找到变量。

  1. 打开变量
  2. 点击添加变量
  3. 给你的变量一个名称
  4. 选择类型(字符串、布尔值、日期时间、整数、未指定)
  5. 输入值
  6. 选择是否加密

[玩转系统] 如何使用 Azure 自动化 - [完整指南]

创建 Azure Runbook

设置 Azure 自动化帐户并分配所有权限后,我们可以开始创建第一个 Runbook。

在您的 Azure 自动化帐户中,您将找到Runbook。您的帐户中已有一些教程操作手册,但我们将创建一个新的操作手册。

  1. 单击创建运行手册
  2. 给您的操作手册起一个有意义的名称
  3. 选择 PowerShell 作为 Runbook 类型,并可能选择描述 Runbook 功能的说明。
  4. 点击创建

[玩转系统] 如何使用 Azure 自动化 - [完整指南]

在此示例中,我们将创建一个 Runbook,为除几个应用程序帐户之外的所有用户禁用 SMTP 身份验证。如果您想了解有关保护 Office 365 租户的更多信息,请务必阅读这些提示。

您的新 Runbook 打开后基本上是一个空白的 PowerShell 脚本。在左侧,您将找到可用 CMDLet 的概述、Runbook 列表(您可以从 Runbook 中触发其他 Runbook)和资产。

资产可以是您在自动化帐户、连接、存储的凭据和证书中声明的变量。

要禁用 SMTP 身份验证,我们将连接到 Exchange Online。为此,我们需要 Azure 运行方式连接和我添加到变量中的租户名称。

[玩转系统] 如何使用 Azure 自动化 - [完整指南]

如果您按照开头所述设置了权限,我们现在可以使用以下代码连接到 Exchange Online:

# Get the automation account and tenant name
$spConnection  = Get-AutomationConnection -Name 'AzureRunAsConnection'
$tenantName    = Get-AutomationVariable -Name 'tenantName'

# Connect to ExchangeOnline
Connect-ExchangeOnline -CertificateThumbprint $spConnection.CertificateThumbprint -AppId $spConnection.ApplicationID -Organization $tenantName

$exclusions = @("sa_signatureTool",
                "sa_otherImportantTool"
                )

$mailboxes = Get-CASMailbox | Where-Object {$_.SmtpClientAuthenticationDisabled -ne $true -and $_.Identity -notin $exclusions}

$mailboxes

foreach ($mailbox in $mailboxes) {
    try {
        Set-CASMailbox -Identity $mailbox.Identity -SmtpClientAuthenticationDisabled $true

        [PSCustomObject]@{
            UserPrincipalName  = $mailbox.Identity
            SmtpClientAuthenticationDisabled = $true
        }
    }
    catch {
        [PSCustomObject]@{
            UserPrincipalName = $mailbox.Identity
            SmtpClientAuthenticationDisabled = $false
        }
    }
}

# Close the connection
Disconnect-ExchangeOnline -Confirm:$false

在发布 Runbook 之前,您可以先在测试窗格中对其进行测试。这在编辑现有 Runbook 时非常有用,您可以在发布之前测试您的编辑,从而保持实时版本正常运行。

Azure 自动化计划

您可以安排 Runbook,使其按照设定的时间间隔自动运行。发布运行手册后,单击链接到计划

[玩转系统] 如何使用 Azure 自动化 - [完整指南]

单击链接计划到您的 Runbook,为您的 Azure Runbook 选择(或创建)计划。一个计划可用于 Azure 自动化帐户中的多个 Runbook。

我们必须创建第一个时间表:

  1. 点击添加时间表
  2. 为您的日程安排一个名称
  3. 设置开始日期和时间
  4. 使其重复出现(或仅运行一次)
  5. 点击创建

[玩转系统] 如何使用 Azure 自动化 - [完整指南]

创建计划后,单击“确定”将计划应用到您的 Runbook。如果需要,您可以将多个计划添加到 Runbook。

您的 Runbook 现在应该根据您创建的计划自动运行。您将在 Runbook 的概述屏幕中看到作业的概述。

总结

创建 Runbook 时,请务必确保在作业完成后关闭连接。否则,您可能最终会使用所有与 Exchange Online 的连接。

我希望本文可以帮助您开始创建 Azure Runbook 和/或设置 Office 365 身份验证。

如果您有任何疑问,请在下面发表评论。

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

取消回复欢迎 发表评论:

关灯