无法在 C# 中使用不同的帐户同时执行两个 Office 365 命令
Unable to execute two Office 365 commands simultaneously using different accounts in C#
我正在尝试使用 C# 同时查询两个不同 Office 365 帐户的用户。当尝试从两个 Powershell Windows 或通过代码连接并获取用户一个接一个帐户时,它工作正常。但是同时使用代码时不工作。
在检查时我发现从 C# 尝试时只生成一个日志文件。但是从 PowerShell window.
尝试时会生成两个不同的日志文件
日志文件夹位置:%userprofile%\appdata\Local\Microsoft\Office365\Powershell
这意味着当 运行 来自代码时,即使有两个运行空间,它也像 运行 单个 PowerShell window 一样工作。
主要方法代码:
Thread t1 = new Thread(() => connectandExec("admin@domain1.onmicrosoft.com", "Pwdd@123"));
Thread t2 = new Thread(() => connectandExec("admin@domain2.onmicrosoft.com", "Pwdd@123"));
t1.Start();
t2.Start();
连接并获取用户的方法:
public static void connectandExec(String userName, String password) {
InitialSessionState iss = InitialSessionState.CreateDefault();
iss.ImportPSModule(new String[] { "MSOnline" });
Runspace runspace = RunspaceFactory.CreateRunspace(iss);
runspace.Open();
PowerShell ps = PowerShell.Create();
ps.Runspace = runspace;
Command cmd = new Command("Connect-MsolService");
System.Security.SecureString pwd = new System.Security.SecureString();
foreach (Char c in password.ToCharArray()) {
pwd.AppendChar(c);
}
log("Connecting to : " + userName);
PSCredential pscred = new PSCredential(userName, pwd);
cmd.Parameters.Add("Credential", pscred);
ps.Commands.AddCommand(cmd);
ps.Invoke();
if (ps.Streams.Error.Count > 0) {
log("Error when connecting: " + userName);
foreach (ErrorRecord errRecord in ps.Streams.Error) {
log(userName + errRecord.ToString());
}
} else {
log("Connected to : " + userName);
}
ps.Commands.Clear();
try {
ps.Commands.AddScript("Get-MsolUser -All");
ICollection<PSObject> results = ps.Invoke();
if (ps.Streams.Error.Count > 0) {
log("Error when getting users: " + userName);
foreach (ErrorRecord errRecord in ps.Streams.Error) {
log(userName + errRecord.ToString());
}
} else {
foreach (PSObject obj in results) {
if (obj != null && obj.ToString() != "") {
Object val = obj.Members["UserPrincipalName"].Value;
if (val != null) {
log(userName + ":" + val.ToString());
}
}
}
}
} catch (Exception ex) {
log(userName + ":Exception during getUsers: " + ex.ToString());
}
}
您的代码正在尝试使用线程来做一些应该在不同 application domains 中完成的事情:"An application domain forms an isolation boundary for security"。
Office 365 库无疑会使用当前线程的应用程序域 - 而您只是使用属于同一应用程序域的两个线程,因此会出现混淆/失败。
我正在尝试使用 C# 同时查询两个不同 Office 365 帐户的用户。当尝试从两个 Powershell Windows 或通过代码连接并获取用户一个接一个帐户时,它工作正常。但是同时使用代码时不工作。
在检查时我发现从 C# 尝试时只生成一个日志文件。但是从 PowerShell window.
尝试时会生成两个不同的日志文件日志文件夹位置:%userprofile%\appdata\Local\Microsoft\Office365\Powershell
这意味着当 运行 来自代码时,即使有两个运行空间,它也像 运行 单个 PowerShell window 一样工作。
主要方法代码:
Thread t1 = new Thread(() => connectandExec("admin@domain1.onmicrosoft.com", "Pwdd@123"));
Thread t2 = new Thread(() => connectandExec("admin@domain2.onmicrosoft.com", "Pwdd@123"));
t1.Start();
t2.Start();
连接并获取用户的方法:
public static void connectandExec(String userName, String password) {
InitialSessionState iss = InitialSessionState.CreateDefault();
iss.ImportPSModule(new String[] { "MSOnline" });
Runspace runspace = RunspaceFactory.CreateRunspace(iss);
runspace.Open();
PowerShell ps = PowerShell.Create();
ps.Runspace = runspace;
Command cmd = new Command("Connect-MsolService");
System.Security.SecureString pwd = new System.Security.SecureString();
foreach (Char c in password.ToCharArray()) {
pwd.AppendChar(c);
}
log("Connecting to : " + userName);
PSCredential pscred = new PSCredential(userName, pwd);
cmd.Parameters.Add("Credential", pscred);
ps.Commands.AddCommand(cmd);
ps.Invoke();
if (ps.Streams.Error.Count > 0) {
log("Error when connecting: " + userName);
foreach (ErrorRecord errRecord in ps.Streams.Error) {
log(userName + errRecord.ToString());
}
} else {
log("Connected to : " + userName);
}
ps.Commands.Clear();
try {
ps.Commands.AddScript("Get-MsolUser -All");
ICollection<PSObject> results = ps.Invoke();
if (ps.Streams.Error.Count > 0) {
log("Error when getting users: " + userName);
foreach (ErrorRecord errRecord in ps.Streams.Error) {
log(userName + errRecord.ToString());
}
} else {
foreach (PSObject obj in results) {
if (obj != null && obj.ToString() != "") {
Object val = obj.Members["UserPrincipalName"].Value;
if (val != null) {
log(userName + ":" + val.ToString());
}
}
}
}
} catch (Exception ex) {
log(userName + ":Exception during getUsers: " + ex.ToString());
}
}
您的代码正在尝试使用线程来做一些应该在不同 application domains 中完成的事情:"An application domain forms an isolation boundary for security"。
Office 365 库无疑会使用当前线程的应用程序域 - 而您只是使用属于同一应用程序域的两个线程,因此会出现混淆/失败。