Функция Powershell — вызов DLL, функция прерывается при добавлении параметров в мою функцию

#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 /… для подписи)