Правильное использование <общих параметров активности> для Inlinescript в PowerShell Workflow
У меня есть рабочая книга Azure Automation Powershell Workflow, которую я хочу запустить на сервере Hybrid Runbook Worker в рамках этапа восстановления после сбоя Azure Site Recovery.
На высоком уровне Runbook использует соединение Azure Run AS для сбора частного IP-адреса одной из виртуальных машин, которая будет переключена при сбое. Сохраняет этот IP-адрес, а затем записывает его в запись STATIC A в DNS Active Directory, настроенную в среде.
> ПРИМЕЧАНИЕ. Я обещаю, что есть веская причина, по которой мы это делаем. Я понимаю, что сама машина, когда она запускается в AD, обновит свою личную запись DNS-имени, это отдельная запись A, на которую мы хотим указать IP-адрес отказавшего сервера. Мы не используем CNAME из-за определенной проблемы с приложением, которое размещает этот сервер.
Поэтому я должен обновить эту запись. Ниже вы найдете скрипт, который это делает. Приведенный ниже скрипт работает без сбоев, когда я запускаю его на Hybrid Runbook Server, когда я захожу на сервер с соответствующими учетными данными (mydomain \ asrscripts).
workflow VisionWebFailover-Test
{
inlineScript {
$connectionName = 'AzureRunAsConnection'
try
{
# Get the connection "AzureRunAsConnection "
$servicePrincipalConnection=Get-AutomationConnection -Name $connectionName
"Logging in to Azure..."
Add-AzureRmAccount `
-ServicePrincipal `
-TenantId $servicePrincipalConnection.TenantId `
-ApplicationId $servicePrincipalConnection.ApplicationId `
-CertificateThumbprint $servicePrincipalConnection.CertificateThumbprint
}
catch {
if (!$servicePrincipalConnection)
{
$ErrorMessage = "Connection $connectionName not found."
throw $ErrorMessage
} else{
Write-Error -Message $_.Exception
throw $_.Exception
}
}
$rg = "RG03ASR" #ResoureGroup where ASR Machines will come up
$vmName = "ASRJUMP01" #VMname of the VM I need to get the IP from for updating in DNS
Write-output "Getting IP"
$ip = (Get-AzureRmNetworkInterface | Where-Object {($_.VirtualMachine.id).Split("/")[-1] -like $vmname}).IpConfigurations.PrivateIpAddress #find the primary nic and store it's IP address
Write-Output "Returned VM IP"
Write-Output $ip
#PowerShell to be executed locally
Import-Module dnsserver
$hostname = 'customArecord'
$zonname = 'mydomain.com'
$DNSServer = 'MYDNSServer.mydomain.com'
#Grab the existing DNS record and store it in the variable $oldobj
$oldobj = Get-DnsServerResourceRecord -Name $hostname -ZoneName $zonname -RRType A -ComputerName $DNSServer
Write-Output $oldobj
#Copy the DNS record into $newobj
$newobj = $oldobj.Clone()
#Change the value of the IP address in $newobj to equal the IP address assigned to the visionwebdev server in Azure
[System.Net.IPAddress]$NewIP = [System.Net.IPAddress]($ip)
$newobj.RecordData.IPv4Address = $NewIp
Write-Output $NewIP "this is the new IP that will be updated to DNS"
write-output $newobj
#Here is where we actually apply the change to the DNS record
Set-DnsServerResourceRecord -ZoneName $zonname -OldInputObject $oldobj -NewInputObject $newobj -Computername $DNSServer -passthru
Write-Output "DNS entry updated, replication may take 15 minutes"
}
Каждый шаг в приведенном выше коде успешно выполняется до тех пор, пока не достигнет оператора Set-DNSServerResourceRecord, и завершится с ошибкой "Отказ в разрешении", показанной ниже. Это когда я запускаю задание с портала Azure Automation. Когда я запускаю его локально в окне, вошедшем в систему как пользователь, он работает правильно.
Set-DnsServerResourceRecord : Failed to update record customArecord.mydomain.com.
At VisionWebFailover-Test:27 char:27
+
+ CategoryInfo : PermissionDenied:(customArecord.mydomain.com:root/Microsoft/...rResourceRecord)
[Set-DnsServerResourceRecord], CimException
+ FullyQualifiedErrorId : WIN32 5,Set-DnsServerResourceRecord
> Я думаю, что мне нужно использовать в конце моего блока InlineScript, чтобы заставить код выполняться на DNS-сервере в определенном пользовательском контексте, который я хочу. Хотя я действительно хочу, чтобы команды выполнялись в гибридном рабочем модуле Runbook в определенном пользовательском контексте.
В документации about_inlinescript говорится, что она принимает https://docs.microsoft.com/en-us/powershell/module/psworkflow/about/about_inlinescript?view=powershell-5.1
и дает мне такой пример
InlineScript {<script block>} <ActivityCommonParameters>
Общие параметры действий определяются этим документом https://docs.microsoft.com/en-us/powershell/module/psworkflow/about/about_activitycommonparameters?view=powershell-5.1
Он ссылается на два параметра, которые я хочу использовать -PSComputerName
а также -PSCredential
Я строю объект учетных данных, как это
$secpasswd = ConvertTo-SecureString "MyAwesomePassword" -AsPlainText -Force
$mycreds = New-Object System.Management.Automation.PSCredential ("MYDOMAIN\asrscripts", $secpasswd)
Я даже вытащил актив из автоматизации с помощью
$domainCred = Get-AutomationPSCredential -Name 'asrscripts'
Когда я запускаю свой код и пытаюсь имитировать пример, добавляя -PSComputername или -PSCredential к концу InlineScript, я получаю ошибки.
At line:94 char:7 + -PSComputerName 'MYDNSServer' -PSCredential $domainCred + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Cannot find the '-PSComputerName' command. If this command is defined as a workflow, ensure it is defined before the workflow that calls it. If it is a command intended to run directly within Windows PowerShell (or is not available on this system), place it in an InlineScript: 'InlineScript { -PSComputerName }'
Если я последую совету вышеупомянутой ошибки и поставлю -PSComputerName и -PSCredential ВНУТРИ блока InlineScript, я получу ошибку, что не может найти аргументы для Set-DNSServerResourceRecord для -PSComputerName и -PSCredential
> Я не знаю, что я делаю не так
- На сервере Runbook у меня установлены все соответствующие модули Powershell.
- Он присоединен к домену.
- Он добавляется в качестве доверенного узла на DNSServer, который также является контроллером домена
- Пользователь, которого я хочу запустить в контексте, это MYDOMAIN\asrscripts, он добавляется как артефакт учетных данных Azure Automation Credential.
- Если я пытаюсь изменить пользователя RUNAS для гибридного рабочего на CUSTOM и выбрать свой артефакт asrscripts, задание зависает, и НИКОГДА не запускается. Он остается в очереди, пока не приостановится. Я получаю сообщение об ошибке в системном журнале событий, что пользователь не может пройти проверку подлинности.
- Я исчерпал документ по удаленному устранению неполадок ниже
Об удаленном устранении неполадок - https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_remote_troubleshooting?view=powershell-5.1 устранения?view=powershell- 5.1
Надеюсь, кто-то там может помочь. Спасибо!
1 ответ
"Не удается найти команду -PSComputerName" предлагает синтаксическую ошибку, вызванную неправильным форматированием кода. PowerShell испытывает затруднения, интерпретируя это как параметр, и считает, что это отдельная команда. Не могли бы вы показать, как именно применять этот параметр к InlineScript? Например, вы получите эту ошибку, если сделаете это:
InlineScript {
...
}
-PSComputerName MyComputer
Вместо этого вам нужно сделать:
InlineScript {
...
} -PSComputerName MyComputer
или же:
InlineScript {
...
} `
-PSComputerName MyComputer