自动化 – 服务管理自动化提示/窍门 – Leveraging InlineScript and $Using:Variable with PowerShell Workflow

原文地址:https://blogs.technet.com/b/privatecloud/archive/2013/08/27/automation-service-management-automation-tip-trick-leveraging-inlinescript-and-using-variable-with-powershell-workflow.aspx

最近发布的 SMA 博客文章自动化 – Service Management Automation Runbook 聚焦 – Exchange 通讯组列表创建引发了一个问题,因此有必要撰写一篇博客文章解答这个问题。了解在 SMA 中执行操作的原因及操作内容的基本活动部分与我们通过示例提供的知识演化同样重要。一些概念已在上面引用的文章中进行过简要介绍,接下来我要进行深入探讨,为需要了解进一步详细信息的用户提供更多阅读资源。


我们要尝试解答的问题是什么?

问: Stijn 提问:我想知道为什么要使用内联脚本的 $pscomputername 和 $pscredential 参数。在 inlinescript 活动中,使用的是 $using 作用域修饰符访问变量 exchangeserver 和 credentials,

能否详细说明一下?谢谢

更具体地说明

为什么要使用远程处理功能多达两次?

一次用于在 Exchange Server 中执行 inlinescript,接着又为同一 Exchange Server 创建会话?

首先 – 感谢您的提问!由于 PowerShell 工作流是一项新功能,详细使用方法往往不是很明确,同时由于 SMA 使用 PowerShell 工作流,我们的示例均为说明如何在 SMA 领域中利用工作流实现端到端自动化。这些类型的问题很好,也是充分理解问题的关键。

答: 在本文中,我们将围绕为什么在我们的示例中使用 InlineScript 和  $Using:Variable 配置获取所需的数据深入介绍一些细节问题。我将会使用本文自动化 – Service Management Automation Runbook 聚焦 – Exchange 通讯组列表创建作为参考阐释有关详细信息,以便促进解决上面提出的原始问题。

初始化变量

在顶级进程 Runbook (Build-Exchange-Distribution-List),我们对可在处理子例程 Runbook 过程中使用的部分变量进行了实例化。下面引用的两个变量用于通过 InlineScript 将我们的示例解决方案直接连接至 Exchange Server。

001 002 $PSCredName = "Contoso Creds" $ExchangeServer = "EX01"

注意       $PSCredName 实际引用的是字符串  "Contoso Creds" ,该字符串是在 SMA 数据库中创建/存储的 SMA Credential 对象的名称,可通过 SMA Runbook 中提供的名称进行利用,以便简化凭据管理过程。 $ExchangeServer 显然是指我们将要连接的 Exchange Server (EX01)。

调用子 Runbook 时利用初始化变量

Following the example provided in the post, we execute a subroutine我们按照本文提供的示例,执行名为 Create-Exchange-Distribution-List 的子例程 Runbook,从而执行逻辑以便从我们的进程 Runbook Build-Exchange-Distribution-List 创建 DL。

001 002 003 $DLCreated = Create-Exchange-Distribution-List –DistributionListName `     $DistributionListName -DLOU $DLOU -DomainFQDN $DomainFQDN `     -ExchangeServer $ExchangeServer -PSCredName $PSCredName

SMA 子例程 Runbook 的参数

更进一步,深入介绍子例程 Runbook (Get-Exchange-Distribution-List),接着我们将利用顶级变量(定义为向子例程 Runbook 发送的参数),与下面的例子类似:

001 002 003 004 005 006  param( [string]$ExchangeServer, [string]$DomainFQDN, [string]$DistributionListName, [string]$PSCredName )

接着在子例程 Runbook 中,利用 SMA cmdlet Get-AutomationPSCredential,并利用(按名称) $PSCredName 检索凭据,并将它们存储在凭据变量中,供该 Runbook 针对此会话进行使用。

001 $PSUserCred = Get-AutomationPSCredential -Name $PSCredName

现在,以子例程 Runbook Get-Exchange-Distribution-List 为例,我们需要确定是否实际存在 Exchange DL(至少是此 Runbook 的一项功能)。为此,我们利用存储的凭据 ( $PSUserCred) 与 Exchange Server ( $ExchangeServer) 进行连接以便执行快速检查,然后返回调用 Runbook 的相应结果。

利用 SMA Runbook 中的 InlineScript 运行非工作流脚本

InlineScript由此进入。我们需要利用 InlineScript ,因此可以运行非工作流执行命令获取结果,然后将数据返回至工作流。执行此操作的目的在于,与系统(在我们的示例中是指 Exchange Server)建立远程连接,处理我们的请求,获取我们的数据,然后传回工作流。

001 002 003 004 005 006 007 008 009 010 011 012 workflow Get-Exchange-Distribution-List {     .     .     $DLData = InlineScript {     .     .     } -psComputerName $ExchangeServer -psCredential $PSUserCred $DLData }

注意     我们利用工作流变量作为 InlineScript 的参数。

$Using:Variable 呢 – 它是什么?

InlineScript 中,如果我们要使用工作流变量(参数、凭据),需要利用 $Using:Variable 选项,该选项将指示 InlineScript 使用工作流中的变量。

下面的示例利用  $Using:PSUserCred 访问存储的凭据变量,以便在与 InlineScript 中的 Exchange Server 进行连接时重用。

001 002 003 $GetDLConn = New-PSSession -ConfigurationName Microsoft.Exchange `  -ConnectionUri $ConnectionURI -Authentication Kerberos ` -Credential $Using:PSUserCred

注意     注意  $  的定义位置。它将移动到 Using 之前,而不是位于字符串的 PSUserCred 部分。

Microsoft Exchange 远程管理需要我们创建 PSSession(配置名称为 "Microsoft.Exchange")。我们发现,InlineScript 不允许执行此类型的 PSSession,因此我们与 Exchange Server 建立了远程 InlineScript 连接,然后利用 Microsoft.Exchange PSSession 在 Invoke-Command 中执行 cmdlet。

为确保不留下任何痕迹,我们会先使用 Remove-PSSession 清除会话,再返回至 InlineScript,然后返回至工作流。

 

001 Remove-PSSession $GetDLConn

这样,将可以返回以下内容 

001 $DLData

此时将会返回对象及相关信息(我们执行  Get-ExchangeDistributionGroup Exchange PowerShell CMDLET。如果发现我们的通讯组列表,将提供数据;如果没有未发现,返回数据则返回 NULL)。


小结

本文详细介绍了一些相关具体细节。希望大家可以在此找到答案 :);如果未能解答疑问,请要求提供更详细地说明。由于 SMA 其实使用的是 PowerShell v3 工作流,我们提供了一些 URL 供大家参考:

在工作流中运行 Windows PowerShell 命令 
嘿,脚本作者们!博客( PowerShell 工作流文章)

有关 SMA 的更多信息、提示/窍门和示例解决方案,请查阅自动化跟踪系列未来发布的其他博客文章!

下次再见,祝大家在自动化技术道路中一帆风顺!