«Перед вызовом любых других командлетов необходимо вызвать командлет Connect-AzureAD». Модуль AzureAd C# - PullRequest
0 голосов
/ 28 апреля 2020

Мы используем модуль AzureAd и иногда у нас появляется такая ошибка: «Вы должны вызвать командлет Connect-AzureAD перед вызовом любых других командлетов».

Когда мы отправляем команду, мы всегда подключаемся. 7 раз в 10, это работает, но иногда у нас есть «Вы должны вызвать командлет Connect-AzureAD перед вызовом любых других командлетов».

Код здесь:

public void ChangeMailboxPassword(string "test@test.fr", string "P@55w0rd!")
{
    var secureString = new SecureString();
    foreach (var c in password) secureString.AppendChar(c);
    Office365PowerShellService.ExecuteAzureAdCommand("Set-AzureADUserPassword",
        new List<Parameter>
        {
            new Parameter("ObjectId", email),
            new Parameter("Password", secureString),
            new Parameter("ForceChangePasswordNextLogin", false),
        });
}

public List<PSObject> ExecuteAzureAdCommand(string name, List<Parameter> parameters)
{
    return ExecuteModuleCommand(new List<ExchangeCommand> { new ExchangeCommand(name, parameters) });
}

private List<PSObject> ExecuteModuleCommand(List<ExchangeCommand> exchangeCommands, string script = null)
{
    var initialSessionState = InitialSessionState.CreateDefault();
    initialSessionState.ImportPSModule(new[] { "AzureAD" });
    using (var runspace = RunspaceFactory.CreateRunspace(initialSessionState))
    using (var powerShell = PowerShell.Create())
    {
        runspace.Open();
        powerShell.Runspace = runspace;
        var secureString = new SecureString();
        foreach (var c in PowerShellPassword) secureString.AppendChar(c);
        var credential = new PSCredential(PowerShellUserName, secureString);
        powerShell.AddCommand("Connect-AzureAD");
        powerShell.AddParameter("Credential", credential);
        powerShell.Invoke();
        powerShell.Commands.Clear();
        foreach (var exchangeCommand in exchangeCommands)
        {
            powerShell.AddCommand(exchangeCommand.Name);
            foreach (var parameter in exchangeCommand.Parameters)
            {
                if (parameter.Value == null)
                    powerShell.AddParameter(parameter.Name);
                else
                    powerShell.AddParameter(parameter.Name, parameter.Value);
            }

            if (exchangeCommand.Arguments.Count > 0)
            {
                powerShell.AddArgument(exchangeCommand.Arguments);
            }
        }

        if (script != null) powerShell.AddScript(script);

        var psObjects = powerShell.Invoke();

        runspace.Close();
        return psObjects?.ToList();
    }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...