使用powershell 2.0中的ews

时间:2017-02-10 07:34:25

标签: powershell ews-managed-api

尝试执行以下代码时出错:

$dll = "C:\Program Files\Microsoft\Exchange\Web Services\2.0\Microsoft.Exchange.WebServices.dll"

import-module -Name $dll

$exc = new-object Microsoft.Exchange.WebServices.Data.ExchangeService

错误:

New-Object : Could not load file or assembly 'System.Core, Version=3.5.0.0, Cul
ture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies. The
system cannot find the file specified.
At D:\scripts\get_mails.ps1:5 char:18
+ $exc = new-object <<<<  Microsoft.Exchange.WebServices.Data.ExchangeService
    + CategoryInfo          : NotSpecified: (:) [New-Object], FileNotFoundExce
   ption
    + FullyQualifiedErrorId : System.IO.FileNotFoundException,Microsoft.PowerS
   hell.Commands.NewObjectCommand

我们在安装了.net framework 4.5.2(现已升级到4.6.1)的Windows Server 2008 r2上运行了这个。正在使用的powershell版本是v2.0

我们应该能够通过powershell 2.0使用托管api吗?

3 个答案:

答案 0 :(得分:0)

好像它需要.net 3.5。 程序集版本“Version = 3.5.0.0”表示它。

答案 1 :(得分:0)

对于加载程序集,您应该使用:

[Reflection.Assembly]::LoadFile("C:\Program Files\Microsoft\Exchange\Web Services\2.0\Microsoft.Exchange.WebServices.dll")

导入模块需要加载psm1文件。我不认为这是加载程序集的方式。

点击链接:

Load Dot Net Assemblies

Using C sharp

learn-to-use-the-exchange-web-services-with-powershell/

希望它有所帮助。

答案 2 :(得分:0)

我认为问题在于您尝试加载需要.net运行时&gt; = 3.5的程序集。如果您在PowerShell 2.0中运行$PSVersionTable,那么您将获得以下内容:

Name                           Value
----                           -----
CLRVersion                     2.0.50727.5485
BuildVersion                   6.1.7601.17514
PSVersion                      2.0
WSManStackVersion              2.0
PSCompatibleVersions           {1.0, 2.0}
SerializationVersion           1.1.0.1
PSRemotingProtocolVersion      2.1

导致EWS程序集加载失败的CLR版本。

要解决此问题,您可以创建一个批处理文件,该文件将创建一个调用PowerShell 2.0并使用较新的CLR运行时的配置文件。

这是批处理文件:

@echo off
:: https://stackoverflow.com/questions/7308586/using-batch-echo-with-special-characters
if exist %~dp0powershell.exe.activation_config goto :run
echo.^<?xml version="1.0" encoding="utf-8" ?^>                 > %~dp0powershell.exe.activation_config
echo.^<configuration^>                                        >> %~dp0powershell.exe.activation_config
echo.  ^<startup useLegacyV2RuntimeActivationPolicy="true"^>  >> %~dp0powershell.exe.activation_config
echo.    ^<supportedRuntime version="v4.0"/^>                 >> %~dp0powershell.exe.activation_config
echo.  ^</startup^>                                           >> %~dp0powershell.exe.activation_config
echo.^</configuration^>                                       >> %~dp0powershell.exe.activation_config
:run
:: point COMPLUS_ApplicationMigrationRuntimeActivationConfigPath to the directory that this cmd file lives in
:: and the directory contains a powershell.exe.activation_config file which matches the executable name powershell.exe
set COMPLUS_ApplicationMigrationRuntimeActivationConfigPath=%~dp0
%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe %*
set COMPLUS_ApplicationMigrationRuntimeActivationConfigPath=

powershell.exe更改为powershell_ise.exe以使用.net 4 CLR运行时启动ISE。

另请参阅我的SO answer在PowerShell中使用EWS