尝试在本地远程连接Exchange服务器时出现“访问被拒绝”错误

9

我正在尝试建立一个PowerShell会话,以在本地主机上运行几个Exchange命令来与Exchange服务器进行通信。但是我一直收到以下错误:

New-PSSession : [<HOSTNAME>] Connecting to remote server <HOSTNAME> failed with the following error message
: Access is denied. For more information, see the about_Remote_Troubleshooting Help topic.
At line:1 char:12
+ $session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri 'h ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OpenError: (System.Manageme....RemoteRunspace:RemoteRunspace) [New-PSSession], PSRemotin
   gTransportException
    + FullyQualifiedErrorId : AccessDenied,PSSessionOpenFailed

我的代码是从微软Technet文章中复制粘贴的。它可以用于远程机器,但是每当我将目标定向到本机时,就会出现上述错误。

到目前为止,我尝试过以下方法:

  1. 查看了关于远程故障排除的帮助主题,但其中与访问被拒绝错误相关的内容都没有奏效。
  2. 使用与接收到访问被拒绝错误相同的凭据定位到远程计算机。(成功连接)
  3. 验证我的PowerShell会话是否以管理员身份运行。(是的)
  4. 验证Exchange管理Shell能够成功启动。(是的)
  5. 尝试不使用凭据来查看是否可以正常工作。(没有)
  6. 检查了net usenet session,以确保我没有出现奇怪的多个具有相同凭据的连接问题。(我没有看到任何指示)
  7. 在引起问题的脚本中尝试了这个方法,并手动在powershell控制台中输入命令进行了尝试。(两种方式都得到了相同的结果。一致性太棒了)
  8. 在多个系统上尝试过。(在每个地方都有相同的结果)

一些快速注释:

这是在Windows Server 2012上运行的Exchange 2013。这只是一个基本安装,只是一个测试环境,数据很少,除了安装和启用远程之外几乎没有配置。
使用的凭据是域管理员的,该管理员也具有必要的Exchange权限,可以执行所需的任何操作。也就是说,只要我针对的机器不是我正在运行的机器,我就没有任何问题,而连接方式并没有发生任何其他变化。此外,这是一个测试域,域管理员的访问权限没有受到任何限制或调整,因此应该完全访问所有内容。
我输入的具体命令是:
$cred = Get-Credential
$session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri 'http://<HOSTNAME>/Powershell' -Credential $cred

我应该能够像这样连接到本地主机吗?还是说它不支持?

我现在完全不知所措。任何帮助,即使只是指点方向,都将不胜感激。

编辑:我应该补充一下,我尝试使用与上面相同的命令从另一台机器连接到此本地主机,而且没有出现任何问题。因此,我认为这不是本地配置问题。


您已经验证了您的域管理员可以访问服务器吗?我问这个问题是因为我认为他们需要特殊权限才能远程连接到Exchange,而且我认为您只能从Exchange内部执行此操作。 - Luke
@Luke 是的。我使用我的域管理员凭据登录到服务器。此外,从另一台计算机上,我能够使用这些域凭据远程访问此计算机。即计算机A安装了Exchange。我使用域凭据登录到计算机A(在上面的示例中是本地主机),但无法通过PowerShell从A远程访问Exchange。但是,从在同一个域内的计算机B上,我可以使用相同的凭据远程访问计算机A上的Exchange。另外,如果我尝试使用我的管理员凭据从计算机A远程访问计算机C(也安装了Exchange),它是有效的。 - Jgraum
好的,所以它只在从A到A时无法工作...防火墙开着吗?虽然你解释的方式可能不是问题的原因... - Luke
@Jgraum 在计算机A上运行Set-Item -force WSMan:\localhost\Client\TrustedHosts –Value * - Jan Chrbolka
简单猜测,您在登录账户上设置了密码吗? - Phanxs Phanxs
2个回答

2
所以,上周末我偶然发现了解决方案。它似乎与正在使用的身份验证有关。我将"-Authentication"参数留空,打算让New-PSSession命令确定最佳方法。
显然,这会默认选择“Negotiate”身份验证方法,该方法会针对远程计算机选择Kerberos,否则会选择NTLM(至少是我观察到/假设的行为)。请参阅这篇Microsoft描述中的身份验证方法。
指定特定的身份验证方法("Kerberos"和"Basic"都可以,"Negotiate"不行,我没有进一步尝试)可以清除问题,并允许我连接到本地交换实例。
因此,与其这样:
$session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri 'http://<HOSTNAME>/Powershell' -Credential $cred

做这个:
$session = New-PSSession -Authentication Kerberos -ConfigurationName Microsoft.Exchange -ConnectionUri 'http://<HOSTNAME>/Powershell'  -Credential $cred

为什么那个有效?我一点也不知道。我会留给比我更懂的人来解释。

0

如果您只是想在当前计算机上创建一个会话,请省略URI。

$cred = Get-Credential
$session = New-PSSession -ConfigurationName Microsoft.Exchange -Credential $cred

这将在本地主机上创建一个新的会话,您可以连接并根据需要利用它。


尝试了这个,让我更接近了。会话已创建,但由于某种原因,它没有我需要运行的命令。我不完全确定为什么,因为我认为配置名称是使这些命令可用的原因。我想我可能只需要检测一下我是否在定位我的本地主机,并加载 snapin(microsoft.blah.blah.blah.Powershell.E2010),以此方式访问命令。 - Jgraum
我认为你可能想得太多了,而且忽略了你链接的那篇文章的重点。整个过程是为了访问Exchange cmdlets 如果您没有在本地计算机上安装Exchange PowerShell工具,而您已经安装了它。对于本地使用,您应该有一个指向Exchange管理控制台或类似物的快捷方式,它将创建一个已加载并可用的Exchange cmdlets的powershell会话。 - TheMadTechnician
我可能没有正确解释我的预期用途。我正在编写一个脚本,自动运行一系列命令来操作指定的交换服务器。它将从外部应用程序运行,我不希望出现控制台。因此...据我所知,我需要在本地机器上创建一个pssession。然而,我上周晚些时候找到了一个解决方案,我很快会在这里发布它作为答案。 - Jgraum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接