(C#)创建远程电源外壳会话时出现"Access Denied"错误



我在C#和powershell方面有问题。我在服务器上运行了一个 ASP.net WebApi,我需要它来打开与 Exchange Microsoft远程 Powershell 会话,以便从会议室邮箱获取一些数据。我使用此代码连接:

PowerShell instance = PowershellHelper.Instance;
instance.AddScript("$passUnsafe = "" + Password + "";" +
"$pass = $passUnsafe | convertto-securestring -AsPlainText -Force;" +
"$UserCredential = new-object -typename System.Management.Automation.PSCredential -argumentlist "" + Username + "",$pass;" +
"if (!(Get-PSSession | Where { $_.ConfigurationName -eq "Microsoft.Exchange" })) { $Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential $UserCredential -Authentication Basic -AllowRedirection; }" +
"else { $Session = (Get-PSSession | Where { $_.ConfigurationName -eq "Microsoft.Exchange" })[0]; }" +
"Import-PSSession $Session -DisableNameChecking;");
PowershellHelper.Instance.Streams.Error.Clear();
instance.Invoke();

这在我的本地计算机上工作正常,但在远程服务器上则不行。脚本在尝试执行"New-PSSession"时崩溃,并出现以下错误:

[outlook.office365.com] Connecting to remote server outlook.office365.com failed with the following error message : Access is denied. For more information, see the about_Remote_Troubleshooting Help topic.

经过一些研究,我发现发生这种情况是因为不允许非管理员用户执行远程会话命令。如果我将 IIS 应用程序池用户添加到管理员组,它工作正常,但我希望尽可能避免这种情况。 有人说您可以将用户添加到内置的"远程管理用户"组中,但这对我不起作用。我什至尝试直接更改用户权限,授予其完全访问权限,但它也不起作用。仅当我将其添加到管理员组时,它才有效。似乎还有其他东西阻止了执行,或者 IIS 忽略了用户组。凭据很好。有谁知道是否有任何其他方法可以在没有管理员权限的情况下执行远程 powershell 命令?

上周,我在将基于 Web 的用户设置应用程序从其 Exchange 2010 目标迁移到 Exchange 2016 时遇到了此问题。最终,问题出在应用程序服务器上的权限问题。IIS APPPOOLDefaultAppPool标识正在尝试将值写入HKU:.DEFAULTSoftwareMicrosoftCurrentVersionWSMANClientConnectionCookies

我授予了IIS APPPOOLDefaultAppPool身份对 ConnectionCookies 密钥的完全控制权限,并且应用程序能够成功调用New-PSSession

我在一个名为Mike's Ramblings的博客上发现了这个决议(Blogspot(:http://codermike.blogspot.com/2016/06/new-pssession-access-denied.html

迈克发现了进程监视器的问题。我能够通过运行进程监视器、重现问题并搜索具有拒绝访问结果的任何事件来执行相同的操作。双击事件并单击"进程"选项卡将显示调用用户。

我仍然不明白为什么当我的应用程序使用具有服务帐户标识的专用应用程序池时,IIS APPPOOLDefaultAppPool标识会尝试创建此值。

用Mark Russinovich的话来说:"当有疑问时,Process Monitor。

根据Simon Li的评论,您可以使用以下PowerShell脚本为您的帐户授予远程PowerShell执行权限:

Set-User "XXXXX" -RemotePowerShellEnabled $true

https://learn.microsoft.com/en-us/powershell/exchange/exchange-server/control-remote-powershell-access-to-exchange-servers?view=exchange-ps

最新更新