#powershell #dll
#powershell #dll
Вопрос:
У меня есть функция, которая вызывается из другого сценария powershell. При жестком кодировании моих значений функция работает должным образом. Но когда я меняю свои значения на параметры, моя функция выдает ошибку, говоря, что метод с этими перегрузками не существует в dll.
Извлечение из скрипта, который запускает функцию:
Import-Module "C:UsersmyuserDesktopUtils.ps1" -Force
sampleFunction
Функция использования с логикой:
function sampleFunction {
$ProjectId = "xyz";
$ClientID = "qdbe"
$loginURL = "https://login.microsoftonline.com"
$tenantdomain = "mytenant"
$AADuserName = "myusername"
$AADpassword = ConvertTo-SecureString -String "supersecret" -AsPlainText -Force
[string[]] $Scopes = "https://lcsapi.lcs.dynamics.com/.default"
# Load the MSAL assembly -- needed once per PowerShell session
[System.Reflection.Assembly]::LoadFrom((Get-ChildItem "C:UsersmyUserMSALlibmicrosoft.identity.client4.18.0libnet45/Microsoft.Identity.Client.dll").fullname) | out-null
$global:app = $null
$ClientApplicationBuilder = [Microsoft.Identity.Client.PublicClientApplicationBuilder]::Create($ClientID)
[void]$ClientApplicationBuilder.WithAuthority($("$loginURL/$tenantdomain"))
$global:app = $ClientApplicationBuilder.Build()
$AquireTokenParameters = $global:app.AcquireTokenByUsernamePassword($Scopes,$AADusername,$AADpassword)
$authResult = "";
try {
$authResult = $AquireTokenParameters.ExecuteAsync().GetAwaiter().GetResult()
}
catch {
$ErrorMessage = $_.Exception.Message
Write-Host "Found Error:" $ErrorMessage
}
$myvar = $authResult
#Do stuff with my access token
}
Это работает так, как ожидалось.
Но я не хочу, чтобы мои значения были жестко закодированы, я хочу передать их в функцию. Итак, я изменил свою функцию, чтобы принимать параметры. Но это прерывает мой $global:app.AcquireTokenByUsernamePassword($Scopes,$AADusername,$AADpassword)
вызов
Вызов:
sampleFunction -ClientID $ClientID -tenantdomain $Tenantdomain -AADuserName $Username -AADpassword $AADpassword -ProjectId $ProjectId
Логические:
function sampleFunction {
param (
[string]$ProjectId,
[string]$ClientID,
[string]$tenantdomain,
[string]$AADuserName,
[string]$AADpassword
)
$loginURL = "https://login.microsoftonline.com"
$encryptedPassword = ConvertTo-SecureString -String -AsPlainText -Force
[string[]] $Scopes = "https://lcsapi.lcs.dynamics.com/.default"
# Load the MSAL assembly -- needed once per PowerShell session
[System.Reflection.Assembly]::LoadFrom((Get-ChildItem "C:UsersmyUserMSALlibmicrosoft.identity.client4.18.0libnet45/Microsoft.Identity.Client.dll").fullname) | out-null
$global:app = $null
$ClientApplicationBuilder = [Microsoft.Identity.Client.PublicClientApplicationBuilder]::Create($ClientID)
[void]$ClientApplicationBuilder.WithAuthority($("$loginURL/$tenantdomain"))
$global:app = $ClientApplicationBuilder.Build()
$AquireTokenParameters = $global:app.AcquireTokenByUsernamePassword($Scopes,$AADusername,$encryptedPassword)
$authResult = "";
try {
$authResult = $AquireTokenParameters.ExecuteAsync().GetAwaiter().GetResult()
}
catch {
$ErrorMessage = $_.Exception.Message
Write-Host "Found Error:" $ErrorMessage
}
$myvar = $authResult
#Do stuff with my access token
}
Но теперь мой код завершается ошибкой со следующей ошибкой:
Cannot find an overload for "AcquireTokenByUsernamePassword" and the argument count: "3".
At C:UsersmyUserDesktopUtils.ps1:205 char:5
$AquireTokenParameters = $global:app.AcquireTokenByUsernamePasswo ...
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CategoryInfo : NotSpecified: (:) [], MethodException
FullyQualifiedErrorId : MethodCountCouldNotFindBest
Я трижды проверил, что все мои переменные содержат ожидаемое значение через отладчик. переданные значения верны.
- $ Scopes все еще жестко закодирован
- $encryptedPassword является допустимым
- Безопасная строка $AADusername является допустимой строкой
Комментарии:
1. Какова сигнатура типа
AcquireTokenByUsernamePassword
параметров? Обратите внимание, что когда PowersShell сообщает, что не может найти перегрузку с указанными параметрами, это иногда означает, что он нашел более одного кандидата, но не смог выбрать между ними…2. Кроме того, вам нужно ввести здесь переменную пароля?
$encryptedPassword = ConvertTo-SecureString -String -AsPlainText -Force
3. @mclayton IEnumerable<строка>, string, SecureString. Если я удаляю параметры из функции, вызов работает корректно с теми же значениями. (см. learn.microsoft.com/en-us/dotnet/api /… для подписи)