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

[玩转系统] 通过 PowerShell 的 Teams-Webhooks – 第 3 部分

作者:精品下载站 日期:2024-12-14 08:11:45 浏览:15 分类:玩电脑

通过 PowerShell 的 Teams-Webhooks – 第 3 部分


[玩转系统] 通过 PowerShell 的 Teams-Webhooks – 第 3 部分

Teams 自适应卡:
使用 PowerShell 进行证书监控

如果您是从未因证书过期而出现问题或停机的管理员之一,那么您要么非常幸运,要么您对证书管理掌握得非常好。在许多公司中,时不时地会出现证书过期的问题,只有在证书过期且无法再访问服务时才会检查其有效性。

为了防止这种情况再次发生在您身上,我将向您提供一个 PowerShell 脚本,用于检查服务器是否有过期的证书。诚然,读取证书的脚本相当无趣,几乎无关紧要。因为更令人兴奋和重要的是通知您证书到期的方式。在本系列的前面部分中,我向您展示了如何通过 PowerShell 轻松向团队发送通知或警报(您可以在此处阅读相关内容:第 1 部分、第 2 部分)。然而,我们始终关注纯粹的信息层面,这在很多情况下就足够了。在本文中,我想向您展示如何发送所谓的“自适应卡”。这些的优点是您可以向消息添加按钮,这为您提供了对警报做出反应的新的、优雅的可能性。

  • 你的服务器内存满了?没问题!通过 PowerShell 获取通知并实施按钮来扩展内存!您可以在咖啡机旁等待或送孩子上学时通过智能手机按下此按钮。

  • 您想自动将警报转换为票证吗?在 Teams 卡中添加一个按钮,允许您通过 HTTP 请求在票证系统中创建新条目,并添加 Teams 消息中的信息。
  • Azure 中的服务器意外停止?收到通知并通过在 Teams 中单击来重新启动它。

正如您所看到的,在许多用例中,消息的直接响应可能很有用。在本文中,我们构建一个脚本,用于读取各种服务器上的证书并检查它们是否会在接下来的 100 天内过期,并向 Teams 发送消息。此消息有一个按钮,可将我们直接带到 Windows 管理中心中相应服务器的证书设置,从而允许我们进行更改。

我们将设计的消息如下所示:

[玩转系统] 通过 PowerShell 的 Teams-Webhooks – 第 3 部分

带有按钮的消息示例

准备

同样,我们需要一个可以接收 WebHook 的 Teams 通道。 (在本系列文章的前面部分中,更详细地描述了配置)。如果您是铁杆玩家,您当然可以使用 JSON 设计 Teams 消息。然而,由于这是一个相当简单的要求,我们可以让我们的生活变得更加轻松:PSTeams 模块允许您使用简单的 PowerShell cmdlet 来设计卡,因此您不必用 JSON 来折磨自己。当然,在我们的例子中,仍然需要安装 Windows Admin Center;但是,如果您不使用 WAC,您当然可以自由选择对按钮警报做出何种反应。向我们显示服务器上将在未来 100 天内过期的所有证书的命令是:

Get-Childitem Cert: -Recurse -ExpiringInDays 100 | 
    Select-Object FriendlyName, Issuer, Thumbprint, NotBefore, NotAfter, PSParentPath

现在我们已经拥有开始设计 AdaptiveCard 所需的所有信息。脚本开头的代码如下所示:

# Array with Computers, that should be monitored
$TargetComputers = @("Server01")
# TeamsID - URL generated by Teams
$TeamsID = ""
# URL of Windows Admin Center
$WACURL = "<https://localhost:6516/>"

# ModuleCheck: Installs PSTeams if not available
if(-not (Get-Module -ListAvailable PSTeams)) {
    Install-Module -Name PSTeams -Force
}
else {
    Write-Verbose "PSTeams is already installed."
}

使用 PSTeams 设计团队卡

PSTeams 中的三个对象与我们相关:部分、事实和按钮。部分服务于逻辑和视觉划分,从属于它们的是事实和按钮。事实包含我们想要显示的有关团队的所有信息。按钮打开网站或以其他方式发出 HTTP 请求。

在我们的例子中,证书属性就是事实。证书的友好名称以及指纹等表示为事实并从属于一个部分。一个部分始终仅包含一个证书。团队消息始终仅涉及一台服务器,因此我们只需要整个卡中的一个按钮,这会将我们引导至 Windows Admin Center 中的服务器条目。这个按钮有它自己的部分。

所以现在我们必须从数组“$TargetComputers”中查询所有服务器 - 我们使用 foreach 循环来执行此操作,以便我们可以从相应的服务器获取相应的证书数据之后直接:

$scriptBlock = {
    Get-ChildItem Cert:\LocalMachine -Recurse -ExpiringInDays 100 |
        Select-Object FriendlyName, Issuer, Thumbprint, NotBefore, NotAfter, PSParentPath
}

foreach ($computer in $TargetComputers) {
    # Getting all certificates of specified computer, that will expire in the next 100 days
    [array]$ExpiringCerts = Invoke-Command -ComputerName $computer -Credential $cred -ScriptBlock $scriptBlock
}

$ExpiringCertificates 变量现在包含将在接下来的 100 天内过期的所有证书。现在您必须如上所述将此信息分发到不同的部分。为此,创建一个空数组,我们将其逐个填充。在已经描述的 ForEach 循环中,我们创建另一个 ForEach 循环,它迭代所有证书,为每个证书创建一个新部分,用事实(即当前证书的属性)填充此部分,然后将新创建的部分添加到该部分大批。所以最后,我们现在有了一个包含所有信息的数组(分为多个部分),并且可以将其直接发送到 Teams。但在此之前,我们创建最后一个部分,其中包含 Windows 管理中心的按钮。我们修改按钮为每个服务器调用的链接,因为在 URL 中我们可以定义应在管理中心打开哪台计算机/服务器。所以我们的代码现在看起来像这样:

# Array with Computers, that should be monitored
$TargetComputers = @("Server01")
# TeamsID - URL generated by Teams
$TeamsID = ""
# URL of Windows Admin Center
$WACURL = "<https://localhost:6516/>"


# ModuleCheck: Installs PSTeams if not available
if(-not (Get-Module -ListAvailable PSTeams)) {
  Install-Module -Name PSTeams -Force
}
else {
  Write-Verbose "PSTeams is already installed."
}


# Iterating through every computer in $TargetComputers
foreach ($computer in $TargetComputers) {
    # Getting all certificates of specified computer, that will expire in the next 100 days
    [array]$ExpiringCerts = Invoke-Command -ComputerName $computer -Credential $cred -ScriptBlock {
        Get-ChildItem Cert:\LocalMachine -Recurse -ExpiringInDays 100 |
            Select-Object FriendlyName, Issuer, Thumbprint, NotBefore, NotAfter, PSParentPath
    }


    # Checking, whether there are any certificates expiring in the specified timespan before proceeding
    if ($ExpiringCerts.Count -gt 0){


        # Creating Sections with embedded Facts (Certificate Information) for Teams
        $Sections = @()
        foreach ($cert in $ExpiringCerts) {
            $facts = @()
            $cert |
                Get-Member |
                Where-Object MemberType -eq NoteProperty |
                ForEach-Object {
                    $facts += New-TeamsFact -Name $_.Name -Value "**$($cert.($_.Name))**"
                }
            $Sections += New-TeamsSection -ActivityDetails $facts
        }


        # Gets server-URL within Windows Admin Center and Teams-Button to access it
        $WACURLServer = $WACURL + "servermanager/connections/server/" + $computer + "/tools/certificates"
        $Button = New-TeamsButton -Name 'Edit Certificates' -Link $WACURLServer -Type 'ViewAction'
        $Section = New-TeamsSection -Buttons $Button


        # Send Card
        $Sections += $Section
        $Count = $ExpiringCerts.count
        Send-TeamsMessage -URI $TeamsID -Color Red -Sections $Sections `
            -MessageTitle "Alert: $count Certificates on $computer expire within the next 100 days!" 

    }
}

结论

因此,现在当我们运行此代码并且机器上有过期证书时,我们会得到上面显示的团队卡。您现在只需几分钟就可以为您的证书创建自己的警报 ?


附加说明:
如果组织中的所有证书都是通过中央 CA 颁发的,则更有意义的做法是不要向每个单独的服务器查询其证书,而是在 CA 上运行中央查询。给出的 100 天并不是我的建议,因为这个数字在我看来太大了。我选择 100 天只是为了演示目的,无论如何都会有一些点击。我认为,建议监测时间为 15-30 天,当然,这应该根据环境的不同进行不同的评估。

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

取消回复欢迎 发表评论:

关灯