问题描述
我想为任何用户提供通过我的网站连接到Powershell Azure Active Directory模块并在其Microsoft租户中执行一些管理操作的能力。我正在使用的代码是:
InitialSessionState iss = InitialSessionState.CreateDefault2();
iss.ImportPSModule(new[] { "MSOnline" });
var shell = PowerShell.Create(iss);
var connectCmd = new Command("Connect-MsolService");
shell.Commands.AddCommand(connectCmd);
var results = shell.Invoke();
但在Invoke
之后出现以下错误:
当应用程序不在UserInteractive模式下运行时,显示模式对话框或表单是无效操作。指定ServiceNotification或DefaultDesktopOnly样式以显示来自服务应用程序的通知
当我在PowerShell ISE中以以下方式运行PowerShell代码时,情况并非如此:
Import-Module MSOnline
Connect-MsolService
在C#代码中,我不想将凭据作为参数传递给Connect-MsolService
cmdlet,而是从用户以交互方式收集它,以便它也与启用了MFA的帐户一起使用。
注意:用户将与部署在Web服务器上的网站进行交互,并且永远不会直接登录服务器。嵌入在C#中的Powershell代码也将在Web服务器上运行。
到目前为止,我的互联网搜索无济于事。有没有办法让这个工作?请分享任何提示,想法和解决方案。
解决方法
您的代码正在Web服务器(作为Web应用程序)上运行,而不是在使用它的客户端上运行-将尝试在服务器上打开弹出窗口-因此出现错误!
自从您提到您将无法通过凭据。
您可以使用访问令牌进行身份验证的另一个选项。
memset
您正在使用C#,因此可以利用MSAL(Microsoft身份验证库)执行交互式登录并获取令牌。您可以参考unless the compiler optimizes malloc
+ memset(...,...)
to calloc
了解更多信息。
获取的令牌可以随后传递到powershell Commandlet以执行必要的操作。