Заставьте аутентификацию Azure работать без запроса пароля - PullRequest
0 голосов
/ 24 января 2019

У меня есть сценарий PowerShell, который подключается к Azure, а затем загружает данные.Сценарий отлично работает с человеческим взаимодействием, но я пытаюсь запустить его как запланированную задачу.В настоящее время каждый раз, когда скрипт запускается, он запрашивает учетные данные пользователя.Я изменяю «Всегда» на «Никогда», и кажется, что учетные данные не сохраняются в течение какого-либо промежутка времени.

$clientId = "<CLIENTIDHERE>" # PowerShell clientId
$redirectUri = "<REDIRECTURIHERE>"
$MSGraphURI = "https://graph.microsoft.com"

$authority = "https://login.microsoftonline.com/$tenantId"
$authContext = New-Object "Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext" -ArgumentList $authority
$authResult = $authContext.AcquireToken($MSGraphURI, $clientId, $redirectUri, "Always")
$token = $authResult.AccessToken

В идеале учетные данные должны передаваться на основе учетных данных, запущенных в запланированной задаче.,Если это не вариант, по крайней мере, я надеюсь ввести имя пользователя и пароль в скрипт и заставить скрипт отправить эти учетные данные для аутентификации.Как выполнить аутентификацию в Azure без вывода сообщений?

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Я смог понять это.Первоначальный код аутентификации, который я представил, использовал всплывающее окно, специфичное для Azure, чтобы получить ваши учетные данные.Используя следующую ссылку [1], я преобразовал код в метод PowerShell Get-Credential.Оттуда я использовал информацию в этой ссылке [2] (Пример 7), чтобы настроить метод Get-Credential для извлечения из простого текста вместо всплывающего окна.

Теперь пароли в виде простого текста неидеально, но для наших нужд это было достаточно хорошо.

$clientId = "<CLIENTIDHERE>" # PowerShell clientId
$redirectUri = "REDIRECTURIHERE"
$MSGraphURI = "https://graph.microsoft.com"
$authority = "https://login.microsoftonline.com/$tenantId"
$authContext = New-Object "Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext" -ArgumentList $authority

$User = "<USERNAMEHERE>"
$PWord = ConvertTo-SecureString -String "<PASSWORDHERE>" -AsPlainText -Force
$Credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User, $PWord

$AADCredential = New-Object "Microsoft.IdentityModel.Clients.ActiveDirectory.UserCredential" -ArgumentList $credential.UserName,$credential.Password

$authResult = $authContext.AcquireToken($MSGraphURI, $clientId, $AADCredential)
$token = $authResult.AccessToken

[1] https://blogs.technet.microsoft.com/cloudlojik/2017/09/05/using-powershell-to-connect-to-microsoft-graph-api/

[2] https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.security/get-credential?view=powershell-6

0 голосов
/ 24 января 2019

Вы можете проверить сценарий, предоставленный Богданом Гаврилом из этой темы .

#Require -Version 5.0
using namespace Microsoft.IdentityModel.Clients.ActiveDirectory

$adalDll = [Reflection.Assembly]::LoadFile("<path_to>\Microsoft.IdentityModel.Clients.ActiveDirectory.dll")

$ADAuthorityURL = "https://login.windows.net/common/oauth2/authorize/"
$resourceURL = "https://analysis.windows.net/powerbi/api"
$AADuserName = "foo"
$AADpassword = "bar"

Write-Host "Retrieving the AAD Credentials...";

$credential = New-Object UserPasswordCredential($AADuserName, $AADpassword);
$authenticationContext = New-Object AuthenticationContext($ADAuthorityURL);
$authenticationResult = [AuthenticationContextIntegratedAuthExtensions]::AcquireTokenAsync($authenticationContext, $resourceURL, $AADClientID, $credential).Result;

$ResultAAD = $authenticationResult.AccessToken;
...