是否可以让C#在Azure应用服务中调用ExchangeOnlineManagement PowerShell Cmdlet?如果可以,如何调用?

vcirk6k6  于 2024-01-08  发布在  Shell
关注(0)|答案(1)|浏览(143)

我有一个自定义的C# Restful API,其中包括Microsoft Graph Nuget包,PowerShell SDK Nuget包等。我想以某种方式在Azure中托管此应用程序,最好是App Service。C#应用程序调用powershell ExchangeOnlineManagement,在我的笔记本电脑上运行良好,因为我以管理员身份运行提升的powershell并为所有用户安装了ExchangeOnlineManagement模块。
在Azure应用服务中,我打开了Kudu控制台,但我找不到以管理员身份运行它的方法。我有一个应用注册,它被授予使用Exchange/Office和Graph的权限,我加载了一个证书。C#API作为系统管理的身份运行,并使用证书连接到Exchange和Graph。因此,我需要作为系统管理的身份运行Kudu控制台Identity,然后运行Install-Module -Name ExchangeOnlineManagement -Scope CurrentUser。如何以托管身份运行Kudu?或者如何以管理员身份运行Kudu?
我看到一篇文章,其中有一位微软员工的回复,内容是关于使用一个applications.txt文件将软件包安装到Azure应用服务中,尽管这是针对Python的。
作为最后的手段,我可以考虑Docker/Kubernetes,或者使用Azure Function Apps来处理PowerShell的东西。
我的笔记本电脑上确实安装了ExchangeOnlineManagement,我可以将文件复制到App Service上或将其打包以从zip文件或其他文件运行吗?
C#应用程序是否可以运行Install-Module -Name ExchangeOnlineManagement -Scope CurrentUser,因为它已经作为托管标识运行,并且在重新启动后会持续存在吗?
是否可以使用ARM模板将ExchangeOnlineManagement PowerShell Cmdlet安装到App Service中?
参考资料https://learn.microsoft.com/en-us/answers/questions/1266111/install-powershell-module-in-azure-app-service
https://learn.microsoft.com/en-us/answers/questions/1350300/how-to-update-the-powershell-version-in-azure-app
我尝试研究以管理员身份运行Kudu Console的方法,并探索了所有菜单,但没有运气。我不知道如何以系统托管身份登录Azure Portal,并以托管身份运行Kudu Console for App Service。我还尝试研究将powershell模块安装到应用服务中的其他方法,也研究了使用应用服务之外的其他东西。

6vl6ewon

6vl6ewon1#

我最终在一个应用服务中做到了这一点,将powershell模块存储在代码旁边,并将其与二进制文件一起发送。因为这是我让它工作的唯一方法,这似乎是最好的方法。
所以我做了:

  • 我从here下载了nuget包
  • 已将其放置在项目的子文件夹中
  • 在C#代码中,我这样做了:
InitialSessionState iss = InitialSessionState.CreateDefault();
    var exchangeOnlinePowershellModulePath = System.IO.Path.Combine(AppContext.BaseDirectory,     $"Resources\\ExchangeOnlinePowershellModule\\ExchangeOnlineManagement.psd1");

    iss.ImportPSModule(new string[] { exchangeOnlinePowershellModulePath });
    iss.ExecutionPolicy = Microsoft.PowerShell.ExecutionPolicy.RemoteSigned;
    iss.ThrowOnRunspaceOpenError = true;

    Runspace runspace = RunspaceFactory.CreateRunspace(iss);
    runspace.Open();

    // Run the Connect-ExchangeOnline command in the runspace to create a connection with EXO.
    PowerShell ps = PowerShell.Create(runspace);
    ps.AddCommand("Connect-ExchangeOnline");
    ps.AddParameters(new Dictionary<string, object>
    {
        ["Organization"] = "contoso.onmicrosoft.com",
        ["CertificateFilePath"] = "C:\\Users\\Certificates\\mycert.pfx",
        ["CertificatePassword"] = GetPassword(),
        ["AppID"] = "a37927a4-1a1a-4162-aa29-e346d5324590"
    });
    Collection<PSObject> connectionResult = ps.Invoke();
    // Clear the connection commands before running cmdlets.
    ps.Commands.Clear();
    // Create a new command to execute an Exchange Online cmdlet.
    ps.AddCommand("Get-Mailbox");
    ps.AddParameter("Identity", "ContosoUser1");

字符串
上面的代码是微软最初发布的here的一个轻微的改编。

相关问题