Правильное использование <общих параметров активности> для 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
Другие вопросы по тегам