使用 Exchange 本地的 New-PSSession 失败“访问被拒绝”

使用 Exchange 本地的 New-PSSession 失败“访问被拒绝”

我有一个脚本,它通过连接到 Exchange 服务器(Windows 2012 R2 上的 Exchange 2013)的网页从 Web 服务器运行。Web 服务器运行的是 Windows 2012 R2。该脚本在连接到网站的用户的上下文中运行。

进行一些测试时会出现以下情况:

  • 以域用户身份连接到网站,运行脚本并提供提升的用户凭据(任何有权访问 Exchange 服务器的帐户):失败
  • 以提升权限的用户身份连接到网站,运行脚本并提供提升权限的用户凭据:成功
  • 使域用户成为原始服务器上的本地管理员,以该用户身份连接到网站并提供提升的用户凭据:成功

    连接到交换的代码如下所示:

    $pw = ConvertTo-SecureString $request['pass'] -AsplainText -Force
    $user = $request['login']
    $creds = New-Object System.Management.Automation.PSCredential($user,$pw)
    $onPremSession = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri "http://exchangeserver/PowerShell/" -Credential $creds -Authentication Kerberos
    

对象$request是脚本如何接收凭证以连接交换并正常工作,正如文本所证明的那样。

我认为这可能是第二跳问题,但这不能解释为什么当用户是运行脚本的服务器上的本地管理员时它会起作用?

唯一重要的事情是运行脚本的用户是否是其运行服务器上的本地管理员,只要提供有权访问交换的凭据,连接就会成功。

经过进一步调查,我认为我需要以某种方式在其发送的提升用户的上下文中运行 New-PSSession 命令,因为它在服务器上具有本地管理员权限,但我不确定如何实现这一点,因为我并没有从技术上调用脚本,所以我可以以提升的用户身份打开一个新的 Powershell.exe 实例。

我还应该补充一点,仅仅使用 shell 来执行此操作不是一个选择,该网站的目的是消除对用户连接到 powershell 远程实例并手动运行命令的依赖。

答案1

问题是,除非用户具有本地管理员权限,否则无法打开与另一台服务器的基于 kerberos 的会话,因此答案是在原始服务器上安装交换工具,然后使用提供的提升凭据打开基于 CredSSP 的会话并导入我需要的交换命令。

********** 编辑

根据下面的评论,我确实最终使用了 Invoke-Command 而不是 CredSSP 会话:

Invoke-Command -ComputerName "localhost" -EnableNetworkAccess -Credential $creds -ScriptBlock { 
  param($creds, $username) 
  & 'C:\Program Files\Microsoft\Exchange Server\V15\Bin\RemoteExchange.ps1' | out-null;
  Connect-OnPremExchange -ComputerName "exchangeserver" -Credential $creds;
  try{
    Enable-RemoteMailbox "$($username)" -RemoteRoutingAddress "$($username)@network.mail.onmicrosoft.com" | out-null
  }catch [Exception]{
    $errorFlag = "error"
  }finally{
  }
  return $errorFlag
} -ArgumentList $creds, $request['username']

还有一个有趣的注意事项是,虽然这适用于交换命令,但 Active Directory 轻量级服务不喜欢以同样的方式工作。当我尝试在本地主机上使用提升的凭据调用命令来添加 ADGroupMember 时,它无法联系服务器或识别 AD 正在运行,不过,通过 CredSSP 在本地主机上使用 New-PSSession 仍然可以工作。

答案2

请检查 Exchange 服务器(IIS)默认站点和分配的证书,可能存在丢失。

相关内容