当前位置:  编程技术>.net/c#/asp.net

c# 调用Powershell 操作Exchange2010的方法介绍

    来源: 互联网  发布时间:2014-08-30

    本文导语:  c# 调用Powershell 操作Exchange2010的方法介绍,有需要的朋友可以参考下。 服务器为win2008+exchange2010,希望利用.net来统计用户邮箱现状。 有很多介绍通过powershell来操作exchenage的文章,但是实际应用中问题还是有不少。 第一步 引用...

c# 调用Powershell 操作Exchange2010的方法介绍,有需要的朋友可以参考下。

服务器为win2008+exchange2010,希望利用.net来统计用户邮箱现状。
有很多介绍通过powershell来操作exchenage的文章,但是实际应用中问题还是有不少。

第一步

引用操作powershell的dll,System.Management.Automation.dll。

这里会遇到的问题是版本的问题,由于服务器是win2008,自带的powershell是2.0版本,而开发机包括很多网上的帮助都是引用的C:Program Files (x86)Reference AssembliesMicrosoftWindowsPowerShell3.0System.Management.Automation.dll ,造成在部署到测试环境后无法工作。后来在同事win7的机器上找到2.0的版本引用后解决。

第二步

加载管理exchange2010的Snap-ins。

注意这里加载Snap-ins不能把他当成cmdlets命令来执行,虽然不报错,加载语句为
 

代码如下:
RunspaceConfiguration rsConfig = RunspaceConfiguration.Create();
PSSnapInException snapInException = null;
PSSnapInInfo info = rsConfig.AddPSSnapIn("Microsoft.Exchange.Management.PowerShell.E2010", out snapInException);
Runspace myRunSpace = RunspaceFactory.CreateRunspace(rsConfig);
myRunSpace.Open();

第三步
现在基础都准备完毕了,可以写cmdlet命令了,完整的语句如下:
 

代码如下:

RunspaceConfiguration rsConfig = RunspaceConfiguration.Create();
PSSnapInException snapInException = null;
PSSnapInInfo info = rsConfig.AddPSSnapIn("Microsoft.Exchange.Management.PowerShell.E2010", out snapInException);
Runspace myRunSpace = RunspaceFactory.CreateRunspace(rsConfig);
myRunSpace.Open();
Pipeline pipeLine = myRunSpace.CreatePipeline();

string cmd ="Get-Mailbox -ResultSize Unlimited | Get-MailboxStatistics | Select LegacyDN, DisplayName,StorageLimitStatus,@{name="TotalItemSize(MB)";expression={[math]::Round(($_.TotalItemSize.Split("(")[1].Split("")[0].Replace(",","")/1MB),2)}},@{name="TotalDeletedItemSize(MB)";expression={[math]::Round(($_.TotalDeletedItemSize.Split("(")[1].Split(" ")[0].Replace(",","")/1MB),2)}},ItemCount,DeletedItemCount | Sort "TotalItemSize (MB)" -Descending | Export-CSV "c:\All Mailboxes.csv" -NoTypeInformation  -Encoding UNICODE";

Command myCommand = new Command(cmd,true);
pipeLine.Commands.Add(myCommand);
Collection commandResults = pipeLine.Invoke();

foreach (PSObject obj in commandResults)
{
 Console.WriteLine(obj.ToString());
}

这里有几个小问题需要说明一下,
1. 在第10行Command myCommand = new Command(cmd,true) 第二个参数的意思是说这是命令脚本,而不是单单的cmdlet命令,我这里传的是脚本

2.在使用Export-CSV导出csv文件的时候会有编码问题,通过-Encoding UNICODE参数转换编码

3.获取结果是通过PSObject的Properties["列名"]来获取的

我这里把结果导出后利用上篇所说的Logparser来进行二次处理,powershell还是有点慢。
附Get-MailboxStatistics 的返回值说明

StorageLimitStatus   此值指示邮箱的配额状态。使用以下值:
BelowLimit   邮箱大小小于问题警告配额。
IssueWarning   邮箱大小大于或等于问题警告配额,但小于禁止发送配额。
ProhibitSend   邮箱大小大于或等于禁止发送配额,但小于禁止发送接收配额。
MailboxDisabled   邮箱大小大于或等于禁止发送接收配额。
TotalItemSize 和 ItemCount   这些值指示邮箱中当前项目的大小和数量。TotalItemSize 的值是邮箱的大小。此值与为邮箱配置的邮箱配额进行比较。
TotalDeletedItemSize 和 DeletedItemCount   这些值不指示“已删除邮件”文件夹中的项目的大小和数量。相反,它们指示邮箱中隐藏的“可恢复的项目”文件夹中的项目的大小和数量。“可恢复的项目”文件夹也称作“垃圾站”。项目通过以下方式之一进入“可恢复的项目”文件夹:
从“已删除邮件”文件夹中删除项目。
使用 Shift+Delete 永久删除邮箱项目。
“可恢复的项目”文件夹的大小不计入邮箱的大小中。“可恢复的项目”文件夹具有自己单独的不可配置的配额,这些配额由分配给邮箱的邮箱计划进行设置。这些配额是 RecoverableItemsQuota 和 RecoverableItemsWarningQuota。

注意:
“可恢复的项目”文件夹中的项目默认情况下保留 14 天,然后由 Microsoft Exchange 清除。在 用于企业的 Microsoft Office 365 中,当邮箱处于诉讼保留状态时,将不会清除“可恢复的项目”文件夹,此文件夹中的项目将无限期保留。

参考链接:
Using Exchange Management Shell Commands With Managed Code http://msdn.microsoft.com/en-us/library/bb332449.aspx


    
 
 

您可能感兴趣的文章:

  • C#调用CMD命令实例
  • C# 中调用 MySQL 存储过程的示例代码
  • c# 调用Surfer软件,添加引用的具体操作方法
  • C#调用SQL语句时乘号的用法
  • C# 调用 MySQL 存储过程的代码
  • C#中事件的动态调用实现方法
  • C++调用C#的DLL实现方法
  • C# 登录窗体与窗体调用
  • C# 调用C++写的dll的实现方法
  • c# 调用批处理(bat)的实现代码
  • c#和javascript函数相互调用示例分享
  • C#同步和异步调用方法实例
  • C# Winform 调用系统接口操作 INI 配置文件的代码
  • C# 调用 MySQL 存储过程的代码 iis7站长之家
  • c#调用qq邮箱smtp发送邮件(修正版)
  • c#调用qq邮箱smtp发送邮件(修改版)
  • C# Winform调用WEB Service API的示例代码
  • c#调用vc写的ocx控件示例
  • C#线程间不能调用剪切板的解决方法
  • 解析C#中委托的同步调用与异步调用(实例详解)
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 在Python中使用SWIG调用C和C++程序
  • Linux添加系统调用时如何调用C语言库函数
  • sessionbean调用entitybean的时候还需要像Client一样远程调用对象吗??
  • system()调用 与 ioctl()调用
  • linux中为什么系统调用比普通函数调用更费时间?
  • 如何在LINUX下用一个普通文件调用一个自己编写的调用系统的文件
  • 可不可以用java调用其他语言的编译结果?(好象asp调用com那样)
  • 为什么我的BEAN 在WIN2000中调用没有问题,但在LINUX中调用有问题
  • 为什么守护进程调用调用getlogin会失败呢?
  • 用RMI进行远程对象调用的时候,可不可以实现多个调用远程对象的并发操作
  • 关于jsp调用javabean的问题!调用是成功了,但是有小问题!
  • ioctl中能不能调用generic_file_read呀?我一调用就不动了
  • LINUX下系统调用是不能中断的,要怎么改造成可以中断系统调用?
  • 请问用javaScript或vbScript可否调用页面上Applet的public函数?如何调用?
  • 请问在jsp中调用外部的类,与jsp调用javabean有何区别??
  • 调用数学函数,需要调用哪个函数库?
  • 调用system(“命令”)和函数调用之间有什么不同?效率?
  • 请问如何在Java中调用一个VB所写的DLL?如何调用这个Dll的方法?如何取得和设置这个Dll的属性值?谢谢!
  • 脚本1调用脚本2,脚本2必须输入回车,如何在调用过程中自动输入回车
  • 请问linux中的系统调用号是如何跟系统调用表对应起来的
  • 我的APPLET在Jbuilder5中,可以调用EJB对象,但是移植到网页上却不能调用EJB对象!是何缘故,值得研究!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3