リア充死ね! 收藏本站
登陆 / 注册 搜索

阅读: 5.5K   回复: 3

[# 系统基础] PowerShell入门(九):访问.Net程序集、COM和WMI(转)

[复制链接]
soarcloud 「龙战于野」 2016-8-2 15:29 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

本帖最后由 soarcloud 于 2016-8-2 21:28 编辑 8 L/ Y+ q+ c5 c; J
0 @0 Q! D8 B' l. m( k. m$ G! j
  PowerShell可以设计的大而全,重新实现一切;也可以像现在一样设计成胶水语言,利用现有的资源。特别是,与.Net、COM和WMI三大豪门的联姻,使得PowerShell必将在Windows世界里大放光彩。
4 w% s: A! P7 \( P: u/ N& a, k
) n) ~6 s3 p- m0 ?. W+ v& ^9 ~与新锐.Net联姻
9 F) E3 Z. H- q3 }; e  在Windows的世界里,.Net代表着现在和将来,是新生力量。与.Net联姻,就意味着榜上了粗腿,迈上了快车道。号称基于.Net Framework,那么使用.Net的基类就易如反掌。基本步骤如下:1、添加类所在程序集;2、创建类的实例;3、调用实例的函数或者属性。以StringBuilder类为例,代码如下:5 B0 K9 C: v3 C5 l- d' U7 i% u

+ y: P/ Z2 z* t复制代码
5 ]/ t/ \7 e/ T5 P  Q4 ]Add-Type -AssemblyName mscorlib& r2 z* W. J' W8 Y3 J# O+ ^
$str = New-Object System.Text.StringBuilder/ H* |2 w! P8 R; m; x% z
$str.Append("Hello")
3 V& l5 y; g2 E. [$str.ToString()7 b4 Y. }+ ]+ l! @) m9 v. L
复制代码) }! f# L' h" a3 P
其结果是输出Hello字符串。0 K0 o; ?/ i+ l" y& r
  其实最让人开心的,是PowerShell能够使用自定义的.Net类库。这意味着我们的产品或者工具都能在PowerShell中继续有效。基本步骤是:写一个类库,编译成DLL,导入到PowerShell会话中,然后所定义的函数和属性都可以使用了。示例如下:
6 ~2 c- y1 v) v$ Y! W# D首先写好代码,编译成DLL,假设路径是D:\PowerShellDemo\PowerShellDemo.dll。& p  S# q) c8 l$ T
复制代码2 L: @4 Z' F7 K0 w# N
using System;5 s/ L  L: f5 O$ u( a3 W8 N1 V
namespace PowerShellDemo! s: R+ G; `) g1 k; n1 L: t
{! T& i! d! ~$ g4 I# J: r  v& k
    public class PowerShellDemo' \' q9 q! b- ?
    {6 O8 e9 J! H9 t+ H3 ^
        public void Greet()
- C6 m1 ~$ a2 [        {) A' g  d# t. ~3 b4 J
            Console.WriteLine("Hello!");
3 G. b6 A4 O1 {" `" D        }
3 t  J3 g* C! @    }  ]2 i! f* c5 e) c! S! Z' p
}$ p) D' b% J, X# s
复制代码
, n7 i3 }1 `' h; G; S然后将其导入到PowerShell会话中,并使用其函数或者属性。9 Y5 e! V7 K1 ~2 L9 N% T& m
Add-Type –Path “D:\PowerShellDemo\PowerShellDemo.dll”3 K7 d6 |: \6 U) A
$obj = New-Object PowerShellDemo.PowerShellDemo
4 y" c+ u7 B+ g" B  ?' `$obj.Greet()
4 Q. w5 \6 a, \2 M$ [8 s以上调用的输出是Hello字符串.3 A, g) t8 n: N" t  O, h4 L7 |' E
  如此容易就能使用.Net的托管程序集,必然为它招徕一大票簇拥。
  m- r% l+ x) }5 Q与贵族COM为伍
% [' V% o! v, vCOM就像没落的贵族一样,虽然过气,但那个范儿还在。作为遗产,它们还在放光发热。PowerShell没有嫌弃它,而是选择与他们兼容。这也让现在依旧战斗在Native C++的程序员颇为欣慰。PowerShell对COM的访问方式是通过其ProgID来进行。示例如下:
2 w4 E  Q# n0 Y2 }复制代码
+ y# C  T7 q) Z' e! U/ ]" K' h0 k$ie = New-Object -ComObject InternetExplorer.Application9 q# g$ U$ O0 U1 R  N/ s* K) n
$ie.Visible = $true
% }6 o# t1 f! n8 O; B9 x* t$ie.Navigate(“www.bing.com”)0 q* B9 T, X% |* @* b/ I; W
$ie.Quit()
9 m+ G0 s, a& u. o' Y复制代码& j4 U, k, p, R
以上这个示例演示了对IE的启动、显示、导航和退出等操作,非常简便。与COM的良好关系,也让PowerShell操作一些系统接口变得简单而其直接。这绝对是个加分的设计。 ! T. R& _1 I# k* _6 i
与实力派WMI结盟
6 C/ F4 ?3 W% g5 Q+ Q; O  WMI是访问本机和域内标准资源的强大武器,接管了WMI的资源访问,PowerShell也从此迈入豪门。它没有做多余的工作,只是轻巧的通过几个WMIObejct命令,就拥有了WMI的一整套访问机制。对于域内其他机器的访问,甚至不用利用PowerShell的远程基础结构。访问WMI的示例如下:7 B9 c9 @  j" v! {0 l, d
Get-WmiObject -Namespace "root\cimv2" -Class Win32_Process
$ t1 t% w6 {. w2 a" j  这个命令的功能跟Get-Process一样,获取本机上正在运行的进程,只是它们得到的结果的形式有一点点小的区别。真正的区别在于当从远程计算机上获取进程信息时,Get-Process必须用Invoke-Command命令,在PowerShell远程基础结构下运行,而Get-WmiObject命令只需加上-ComputerName参数即可。这份从容,是从WMI娘家带来的。
; l1 T: B! v6 \+ R# v  擅用WMI,必将大大提高访问本机和远程系统资源的效率。不管你信不信,反正我是信了!
" z& p% j/ E" k3 Z2 l% t结语" B- t: b. n+ n) ^1 o
  不管是建立在.Net的基础上,还是兼容COM,再或者是以WMI的方式访问资源,PowerShell一心想成为多面胶,成为大众而非小众的朋友。作为IT人士的你,有没有别粘(电)到?
4 D8 n: M  \7 r# ^$ R, p# F; w$ i3 m$ F; E6 L$ K, L5 x' q
% ?( `' \4 s% K" o6 R

! q: @9 e6 Z0 s. w( ]! |+ j
上一篇
下一篇
帖子热度 5480 ℃

左岸云烟 「出类拔萃」 2018-5-1 15:56 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

曾梦想仗剑走天涯,因太穷放弃了计划#j328:
安心的味道 「锋芒初露」 2018-5-4 21:58 来自手机 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

看了楼主的帖子,不由得精神为之一振,自觉七经八脉为之一畅,七窍倒也开了六巧半,自古英雄出少年,楼主年纪轻轻,就有经天纬地之才,定国安邦之智,古人云,卧龙凤雏得一而安天下,而今,天佑我大中华,沧海桑田5000年,中华神州平地一声雷,飞沙走石,大舞迷天,朦胧中,只见顶天立地一金甲天神立于天地间,这人英雄手持双斧,二目如电,一斧下去,混沌初开,二斧下去,女娲造人,三斧下去,小生倾倒.得此大英雄,实耐之幸也,民之福也,怎不叫人喜极而泣.......古人有少年楼主说为证,少年之楼主如红日初升,其道大光;河出伏流,一泻汪洋;潜龙腾渊,鳞爪飞扬;乳虎啸谷,百兽震惶;鹰隼试翼,风尘吸张;奇花初胎,皇皇;干将发硎,有作其芒;天戴其苍,地履其黄;纵有千古,横有八荒;小生对楼主之仰慕如滔滔江水连绵不绝,海枯石烂,天崩地裂,永不变心.
您需要登录后才可以回帖 登录 | 免费注册  

本版积分规则

快速回复 返回列表