EWS无法在Powershell中工作
因此,我设置了相同的Exchange Web服务示例: 作为控制台应用程序运行的C版本:EWS无法在Powershell中工作,powershell,exchange-server,exchangewebservices,Powershell,Exchange Server,Exchangewebservices,因此,我设置了相同的Exchange Web服务示例: 作为控制台应用程序运行的C版本: class Program { static void Main(string[] args) { var es = new ExchangeService(ExchangeVersion.Exchange2010_SP2) { TraceEnabled = true, UseDefaultCredentials
class Program
{
static void Main(string[] args)
{
var es = new ExchangeService(ExchangeVersion.Exchange2010_SP2)
{
TraceEnabled = true,
UseDefaultCredentials = true,
Url = new Uri("https://mail.myServer.com/EWS/Exchange.asmx")
};
ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, errors) => true;
var inboxId = new FolderId(WellKnownFolderName.Inbox);
Folder inboxFolder = null;
try
{
inboxFolder = Folder.Bind(es, inboxId);
} catch(Exception e)
{
Console.Out.WriteLine(e.Message);
}
if (inboxFolder == null)
{
Console.Out.WriteLine("FAILED");
return;
}
Console.Out.WriteLine("Total stuff: [{0}]", inboxFolder.TotalCount);
Console.In.ReadLine();
}
}
Powershell版本:
clear
# Load EWS Managed API
Import-Module "C:\Program Files\Microsoft\Exchange\Web Services\2.2\Microsoft.Exchange.WebServices.dll";
$EWSService = new-object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2010_SP2)
$EWSService.traceenabled = $true
$EWSService.UseDefaultCredentials = $true
$EWSService.Url = New-Object Uri("https://mail.myServer.com/EWS/Exchange.asmx")
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = { $true };
$InboxID = new-object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox)
Try {$InboxFolder = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($EWSservice,$InboxID)}
Catch [Exception] {
Write-Host $_.Exception.Message
}
两者都运行在同一台机器上,同一个用户。控制台应用程序连接并返回数据。powershell版本得到了一条非常有用的消息:
The request failed. The underlying connection was closed: An unexpected error occurred on a send.
检查异常不会提供任何额外的信息。两个版本都引用相同的EWS托管api。有人知道为什么会这样吗?我想我看到了问题所在
# Load EWS Managed API
Import-Module "C:\Program Files\Microsoft\Exchange\Web Services\2.2\Microsoft.Exchange.WebServices.dll";
这不是Powershell模块
我使用Add Type在EWS脚本中加载该.dll,如下所示:
Add-Type -Path 'C:\Program Files\Microsoft\Exchange\Web Services\2.2\Microsoft.Exchange.WebServices.dll'
根据Johnyjob的消息使用
## Code From http://poshcode.org/624
## Create a compilation environment
$Provider=New-Object Microsoft.CSharp.CSharpCodeProvider
$Compiler=$Provider.CreateCompiler()
$Params=New-Object System.CodeDom.Compiler.CompilerParameters
$Params.GenerateExecutable=$False
$Params.GenerateInMemory=$True
$Params.IncludeDebugInformation=$False
$Params.ReferencedAssemblies.Add("System.DLL") | Out-Null
$TASource=@'
namespace Local.ToolkitExtensions.Net.CertificatePolicy{
public class TrustAll : System.Net.ICertificatePolicy {
public TrustAll() {
}
public bool CheckValidationResult(System.Net.ServicePoint sp,
System.Security.Cryptography.X509Certificates.X509Certificate cert,
System.Net.WebRequest req, int problem) {
return true;
}
}
}
'@
$TAResults=$Provider.CompileAssemblyFromSource($Params,$TASource)
$TAAssembly=$TAResults.CompiledAssembly
## We now create an instance of the TrustAll and attach it to the ServicePointManager
$TrustAll=$TAAssembly.CreateInstance("Local.ToolkitExtensions.Net.CertificatePolicy.TrustAll")
[System.Net.ServicePointManager]::CertificatePolicy=$TrustAll
## end code from http://poshcode.org/624
而不是
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = { $true };
我不是EWS方面的专家,但[System.Net.ServicePointManager]::ServerCertificateValidationCallback={$true};看起来不合适。我只看到在使用AutoDiscover查找Exchange服务器时使用此选项,但您已经在URI中硬编码了服务器名称。从我对其使用的理解来看,这用于在服务器使用未签名证书时忽略证书错误。即使我在这方面错了,代码在.NET中工作,而不是在powershell中,因此无论哪种方式,回调都不应该是问题,只是为了确保我尝试了这两种方法。我今天也遇到了同样的问题。我注意到标准Windows PowerShell控制台和SharePoint 2013 PowerShell控制台中的行为有所不同。特别是,所描述的解决方案适用于Windows PowerShell,但不适用于SharePoint one。请注意,链接似乎已断开,我从谷歌缓存中提取了该页面。非常感谢您的建议。不幸的是,当我绑定这个解决方案时,我得到了相同的错误。