У меня есть приложение, которое требует, чтобы веб-сайт мог сделать HTTP-вызов, который включает и регистрируется на виртуальной машине Azure. Я пытаюсь сделать это с помощью функции PowerShell Azure Function. Я могу успешно включить/выключить ВМ с помощью функции, используя:
$secpasswd = ConvertTo-SecureString $env:SP_PASSWORD -AsPlainText -Force;
$mycreds = New-Object System.Management.Automation.PSCredential ($env:SP_USERNAME, $secpasswd)
Add-AzureRmAccount -ServicePrincipal -Tenant $env:TENANTID -Credential $mycreds;
$context = Get-AzureRmContext;
Set-AzureRmContext -Context $context;
# Start VM
Start-AzureRmVM -ResourceGroupName myResourceGroup -Name myDevice | Out-String
Но я получаю ошибки отказа в разрешении при попытке войти в ВМ. Я пробовал следующие методы:
$password = ConvertTo-SecureString "myPassword" -AsPlainText -Force
$cred= New-Object System.Management.Automation.PSCredential ("myUsername", $password )
#Enter-PSSession -ConnectionUri https://<public_ip> -Credential $cred -SessionOption (New-PSSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck) -Authentication Negotiate
и
$Server="<public_ip>"
$User="myUsername"
$Password="myPassword"
cmdkey /generic:TERMSRV/$Server /user:$User /pass:$Password
mstsc /v:$Server
При входе в систему с помощью стандартного графического интерфейса Remote Desktop мне также нужно отклонить запрос на сертификат. Что мне нужно сделать для автоматического входа в систему с помощью Azure Function?
На ВМ установлена Windows 10.
EDIT: Я настроил порты, создал локальный сертификат и убедился, что WinRM настроен для удаленного управления на ВМ, а также что он прослушивает HTTPS. Однако, когда я пытаюсь выполнить команду на локальной машине:
Enter-PSSession -ComputerName 52.166.161.93 -Credential $cred -UseSSL -SessionOption $so
Я получаю ошибку:
Enter-PSSession : Connecting to remote server 52.166.161.93 failed со следующим сообщением об ошибке: Клиент не может подключиться к назначению, указанному в запросе. Убедитесь, что служба на работает и принимает запросы. Обратитесь к журналам и документацию по службе WS-Management, запущенной на месте назначения. назначения, чаще всего IIS или WinRM. Если местом назначения является WinRM, выполните следующую команду на месте назначения для анализа и настройки службы WinRM: "winrm quickconfig". Для получения дополнительной информации см. в справочной теме about_Remote_Troubleshooting.
EDIT: Я проверил, что порт открыт и доступен из Azure Function с помощью
New-Object Net.Sockets.TcpClient "<public-ip>", 5986
Мне никогда не удавалось заставить Invoke-Command работать для виртуальной машины Azure RM. В конечном итоге рабочее решение, которое теперь успешно реализовано, использует Invoke-AzureRmVMRunCommand в учетной записи службы автоматизации Azure. Примечание для заинтересованных сторон. В настоящее время функции Azure Powershell поддерживают только AzureRM версии 1, которая не поддерживает Invoke-AzureRmVMRunCommand (даже как импортированный модуль), но автоматизация Azure работает очень хорошо.
Используя свои учетные данные, укажите имя виртуальной машины как часть имени пользователя. т.е. если имя вашего компьютера - vm1, а ваш пользователь - myusername, ваши учетные данные будут выглядеть следующим образом:
$cred= New-Object System.Management.Automation.PSCredential ("vm1\myUsername", $password )
Во-первых, вы убедились, что ваши правила NSG разрешают входящий WINRM трафик на эту машину?
Также, ваша команда Enter-PsSession неверна. Ваш -connectionURI должен быть только публичный IP или имя машины, никаких https, а затем вы должны использовать флаг -useSSL.
.Вы должны включить сервис winrm на вашей ВМ Azure, также, если вы хотите войти из функции Azure, вы должны установить прослушивание сервиса winrm на 5986(https). Http не работает.
Во-первых, вы должны открыть порт 5986 на брандмауэре VM и Azure NSG.
Во-вторых, вам нужно создать cert.
Третье, настроить WinRM на прослушивание на 5986.
Больше информации об этом, пожалуйста, смотрите в этом блоге.
.