从 Web API 连接并运行 PowerShell 命令

Posted

技术标签:

【中文标题】从 Web API 连接并运行 PowerShell 命令【英文标题】:Connect and run PowerShell command from Web API 【发布时间】:2021-11-14 07:28:14 【问题描述】:

我正在尝试从 Web Api 运行 PowerShell 命令。我得到的只是这个错误 术语“Get-MailUser”未被识别为 cmdlet、函数、脚本文件或可执行程序的名称。 我可以从 PowerShell 7 命令运行相同的代码,并且运行良好。我在项目中使用 Microsoft PowerShell SDK,显示级别为 7.1。 任何帮助将不胜感激!

这是我正在使用的代码。

          if (powershell == null)
            
                using (Runspace runspace = RunspaceFactory.CreateRunspace())
                
                    runspace.Open();
                    powershell = PowerShell.Create();
                    powershell.Runspace = runspace;

                    PSCommand command = new PSCommand();
                    command.AddCommand("Set-ExecutionPolicy").AddArgument("RemoteSigned");
                    command.AddCommand("New-PSSession");
                    command.AddCommand("Import-Module").AddParameter("Name", "PowerShellGet");
                    command.AddCommand("Install-Module").AddParameter("Name", "ExchangeOnlineManagement").AddParameter("Force");
                    command.AddCommand("Import-Module").AddParameter("Name", "ExchangeOnlineManagement");
                    command.AddCommand("Connect-ExchangeOnline").AddParameter("CertificateThumbPrint", "mythumbprint")
                                                                   .AddParameter("AppId", "my app id")
                                                                   .AddParameter("Organization", "mycompany.onmicrosoft.com");
                    command.AddCommand("Get-MailUser").AddParameter("Identity", "myemailaddress");

                    powershell.Commands = command;
                    // Collection<PSObject> results = powershell.Invoke();
                    var t1 = powershell.Invoke<PSSession>();
                
            
        

【问题讨论】:

Get-MailUser 是ExchangePowerShell 模块的一部分。您正在安装具有 Get-EXOMailbox cmdlet 的 ExchangeOnlineManagement 模块。 你需要在不同的命令之间调用AddStatement() @Theo 啊啊啊...是的。这可行,但使用该模块我无法添加/更新邮箱或联系人,只能获取它们。这就是 Powershell SDK nuget。使用桌面版本,我可以整天添加/更新。回到绘图板:( 【参考方案1】:

当您连续调用AddCommand 时,您实际上是在编写一个管道 - 因此在 PowerShell 中等效于您的代码:

Set-ExecutionPolicy RemoteSigned |New-PSSession |Import-Module -Name PowerShellGet |Install-Module -Name ExchangeOnlineManagement -Force |Import-Module -Name ExchangeOnlineManagement |Connect-ExchangeOnline -CertificateThumbPrint mythumbprint -AppId "my app id" -Organization mycompany.onmicrosoft.com |Get-MailUser -Identity myemailaddress

...这可能不是你想要的。

记得在命令之间调用AddStatement()

command.AddCommand("Install-Module").AddParameter("Name", "ExchangeOnlineManagement").AddParameter("Force");
command.AddStatement();
command.AddCommand("Import-Module").AddParameter("Name", "ExchangeOnlineManagement");
command.AddStatement();
// ... and so forth

【讨论】:

解决了 cmdlet not found 问题。我尝试了 Get-MailUser 和 Get-EXOMailbox,都没有结果返回。如果我从我的计算机上运行这个脚本,它运行良好。也许我的命令不正确?内联Set-ExecutionPolicy RemoteSigned Install-Module -Name ExchangeOnlineManagement -Force Import-Module ExchangeOnlineManagement Import-Module -Name PowerShellGet Connect-ExchangeOnline -CertificateThumbPrint "mythimb" -AppID "my app id" -Organization "my company.onmicrosoft.com" Get-EXOMailbox

以上是关于从 Web API 连接并运行 PowerShell 命令的主要内容,如果未能解决你的问题,请参考以下文章

在 Visual Studio 2010 中调试时无法从 Web API 配置中读取连接字符串

使用 Oauth2/OpenID 连接构建 Web-API

如何在不卸载powershell的情况下,有效禁用/启用powershel

csharp 这将从本地Web服务器获取x509证书。我用它来建立从Web应用程序到Web上的API的连接

powershell PowerShel便利ツール

Self Host web api并从单元测试项目访问它