Мы используем модуль 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();
}
}
Я думаю, это не работает, когда выполняется в параллельном режиме, но я не понимаю, почему.