C#注册PowerShell Snapin

  最近一段在邮件系统模拟登录检测服务器状态的程序,邮件系统用的是微软的Exchange 2007.主要是通过抓包分析其中的数据,进而使用HttpWebRequest模拟请求,获取响应,再将响应与预期进行比对,从而判断服务器状态(过段发些总结上来)。而使用Exchange 2007自带的test-owaconnectivity也是可以对服务器状态进行判断的,那个就是使用powershell了。

  Powershell,这个东西我不懂,临时上阵,参考了其他的一个文章模拟注册了一个snapin,特将经过记录于此,聊作首篇技术博文。吼吼!

  首先简单介绍下总的步骤:

  1.创建一个类库.

  2.添加上两个引用System.Configuration.Install 和 System.Management.Automation

  3.编写cs代码,编译。

    4.使用InstallUtil.exe注册编写的snapin

  5.在powershell环境中测试结果。

特别说明:

  a.System.Management.Automation没有放到GAC中,位置在:C:\Program Files\Reference Assemblies\Microsoft\WindowsPowerShell\v1.0

  b.如果是在win7中,使用cmd注册的是一定要以管理员运行,否则将出错,详见后面说明。

  代码如下:

 

 1 using System;
2 using System.Management.Automation;
3 using System.ComponentModel;
4
5 namespace PSSnapinSample
6 {
7 ///<summary>
8 /// 特别提示:
9 /// 1.由于使用的是.NET 2.0中的注册,因而需要采用2.0,使用高版本会报错。
10 /// 更正第一条:使用3.5或者更高版本也不会报错,开始报错是由于权限的关系
11 /// 2.由于需要使用的dll:System.Management.Automation的位置不在GAC中,
12 /// 添加引用的时候采用了两种方式进行了测试:A.添加系统中的,B.在项目中创建一个Lib文件夹,引用文件夹中的
13 /// 经过测试,两者均可以达到要求
14 /// 验证的步骤:
15 /// 1.生成的文件需要先使用.net 2.0中的InstallUtil.exe进行注册
16 /// 2.使用powershell中的添加PSSnapin进行添加(可以先使用命令Get-PSSnapin -Registered获取PSSnapin的名称)
17 /// 3.执行Info-MyOwn命令输出结果
18 /// Date: NOV.4,2011
19 /// Author: wsf
20 ///</summary>
21
22 [RunInstaller(true)]
23 public class MyOwnSnapin : PSSnapIn
24 {
25 public MyOwnSnapin()
26 : base()
27 {
28
29 }
30
31 public override string Name
32 {
33 get { return "MyOwnSnapin"; }
34 }
35
36 public override string Vendor
37 {
38 get { return "YIFAN"; }
39 }
40
41 public override string VendorResource
42 {
43 get
44 {
45 return "PSSnapSample,YIFAN";
46 }
47 }
48
49 public override string Description
50 {
51 get { return "This is a demo,create by YIFAN"; }
52 }
53 }
54
55 [Cmdlet("Info", "MyOwn")]
56 //千万记得两个中间不要加上空格 暂时还不清楚加入了空格后应该如何处理
57 //在PSSnapin中执行的命令入下:info-myown
58 //关于类名:进行了简单测试似乎没任何影响
59 public class ExcuteShell : Cmdlet
60 {
61 private string args;
62
63 [Parameter(Position = 0)]
64 [ValidateNotNullOrEmpty]
65 public string Args
66 {
67 get { return args; }
68 set { args = value; }
69 }
70
71 protected override void ProcessRecord()
72 {
73 if ((args != null) && args.Length > 0)
74 {
75 Console.WriteLine("Hello World:" + args);
76 }
77 }
78 }
79 }



  编译生成了dll后,为了方便注册,本人将生成的dll与pdb文件copy到了c盘根目录下。

  非管理员运行cmd时:

  

执行结果:

  可以看到出错了,出错的原因是UAC问题。

采用管理员身份运行cmd时:

  

  进入powershell中验证是否注册成功:

  

  测试注册的snapin:

  成功了!

    注:本人环境:WIN7 Ultimate,Visual studio 2008

  PS:本文参考了http://www.cnblogs.com/CNSytemCenter/archive/2009/12/31/1636955.html

    


 


posted on 2011-11-04 21:29  wsf-yifan  阅读(804)  评论(3编辑  收藏  举报

导航