不相信人咬不到肚脐的,咬破肚脐去死如何? 收藏本站
登陆 / 注册 搜索

阅读: 3.8K   回复: 3

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

soarcloud 「龙战于野」 2016-8-2 15:29 |显示全部楼层

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

本帖最后由 soarcloud 于 2016-8-2 21:28 编辑
. d+ l3 j5 `9 Q' B$ m5 B3 q3 }. v( c5 q; }$ \3 j
  PowerShell可以设计的大而全,重新实现一切;也可以像现在一样设计成胶水语言,利用现有的资源。特别是,与.Net、COM和WMI三大豪门的联姻,使得PowerShell必将在Windows世界里大放光彩。
* Y. q4 z4 k, G% N" d( M' l) Q- a# [( }/ q6 P- Y  X% g
与新锐.Net联姻
7 T. T! D6 T# {; g4 p  在Windows的世界里,.Net代表着现在和将来,是新生力量。与.Net联姻,就意味着榜上了粗腿,迈上了快车道。号称基于.Net Framework,那么使用.Net的基类就易如反掌。基本步骤如下:1、添加类所在程序集;2、创建类的实例;3、调用实例的函数或者属性。以StringBuilder类为例,代码如下:
/ x7 I- w+ Q0 s- Q. u! y- Q) C9 o7 K
复制代码# x0 w, ~! f" g# X  Z/ N- U( {5 B
Add-Type -AssemblyName mscorlib
) [7 ^, ?9 O! Z: q0 b$ T$str = New-Object System.Text.StringBuilder" m; m/ s5 G$ n; K6 |: s
$str.Append("Hello")
6 l3 X, `0 r0 G0 M0 _. h" w$str.ToString()
, |7 }8 x. M0 t复制代码* z. j; {2 V% p# B
其结果是输出Hello字符串。9 f, d  ?4 S7 A4 ~7 Y& d
  其实最让人开心的,是PowerShell能够使用自定义的.Net类库。这意味着我们的产品或者工具都能在PowerShell中继续有效。基本步骤是:写一个类库,编译成DLL,导入到PowerShell会话中,然后所定义的函数和属性都可以使用了。示例如下:
/ e6 |# x9 q3 V; I5 I& R首先写好代码,编译成DLL,假设路径是D:\PowerShellDemo\PowerShellDemo.dll。
% {8 n; q. u  j2 u2 D3 C复制代码- _7 ?  B0 _5 s
using System;& C8 f  K: s! V5 E- n, c
namespace PowerShellDemo- r3 G5 k' j0 K! S" L
{) X  @0 `" O! Z6 z) |/ t$ G$ H
    public class PowerShellDemo
8 U, \9 L$ s  Z& I! P    {
; k) {0 H5 U9 w* i) F- D        public void Greet()
' X* e8 S: D# F0 ?' D9 D( I3 ]( M        {
+ R: h; I' J9 q! p& T            Console.WriteLine("Hello!");
" z( R+ R' l4 `: i. z7 T0 [9 @+ l' N        }. C* W# n  p2 \7 z
    }
2 j9 Z1 U$ C- E9 ]1 K}
& F" n) w5 U& O6 z1 S复制代码! k( j9 o1 }# Q# g
然后将其导入到PowerShell会话中,并使用其函数或者属性。* L5 Q( ~8 s8 t. I& c! {! i
Add-Type –Path “D:\PowerShellDemo\PowerShellDemo.dll”0 h' F% g5 D- S: j( j
$obj = New-Object PowerShellDemo.PowerShellDemo2 N" B$ s& M1 P, i) C2 t0 O
$obj.Greet()! c5 I3 t* \/ I1 z$ S0 N+ u/ n  u9 `; y
以上调用的输出是Hello字符串.- |7 X: \2 J8 |. @
  如此容易就能使用.Net的托管程序集,必然为它招徕一大票簇拥。" R+ ^9 ~( N) k  b* o
与贵族COM为伍
' `2 q1 o9 @1 n0 N+ U; _$ ^COM就像没落的贵族一样,虽然过气,但那个范儿还在。作为遗产,它们还在放光发热。PowerShell没有嫌弃它,而是选择与他们兼容。这也让现在依旧战斗在Native C++的程序员颇为欣慰。PowerShell对COM的访问方式是通过其ProgID来进行。示例如下:6 Z* l- N0 y* V  c
复制代码
5 y. @3 r. Z; s( {( W$ie = New-Object -ComObject InternetExplorer.Application$ R, z" R- Q% X) |6 W
$ie.Visible = $true, F9 I) P1 K! {* r8 P1 D, i
$ie.Navigate(“www.bing.com”)- {  x- _3 }4 y: ~
$ie.Quit()
" [5 a0 {0 ~( {! x1 `  o复制代码& T/ o/ J; W% M9 H( P8 z% X- l* U
以上这个示例演示了对IE的启动、显示、导航和退出等操作,非常简便。与COM的良好关系,也让PowerShell操作一些系统接口变得简单而其直接。这绝对是个加分的设计。 # K9 j$ q+ n2 g8 I5 s/ t
与实力派WMI结盟
$ N& Q* q" r* `! x, A  WMI是访问本机和域内标准资源的强大武器,接管了WMI的资源访问,PowerShell也从此迈入豪门。它没有做多余的工作,只是轻巧的通过几个WMIObejct命令,就拥有了WMI的一整套访问机制。对于域内其他机器的访问,甚至不用利用PowerShell的远程基础结构。访问WMI的示例如下:! k* i0 p% {- G# ?$ [6 [2 y
Get-WmiObject -Namespace "root\cimv2" -Class Win32_Process
2 @7 r; T1 P1 x5 V. v1 M6 s5 Z' {  这个命令的功能跟Get-Process一样,获取本机上正在运行的进程,只是它们得到的结果的形式有一点点小的区别。真正的区别在于当从远程计算机上获取进程信息时,Get-Process必须用Invoke-Command命令,在PowerShell远程基础结构下运行,而Get-WmiObject命令只需加上-ComputerName参数即可。这份从容,是从WMI娘家带来的。7 ~1 D5 d9 t8 B5 V* F( D! X
  擅用WMI,必将大大提高访问本机和远程系统资源的效率。不管你信不信,反正我是信了!
) Z. Z) [5 R4 b4 j% k) e5 L" M结语. i4 R( y/ l5 w4 J" w+ M) m
  不管是建立在.Net的基础上,还是兼容COM,再或者是以WMI的方式访问资源,PowerShell一心想成为多面胶,成为大众而非小众的朋友。作为IT人士的你,有没有别粘(电)到?
: D2 @8 b# y, D/ B+ {- x4 N8 `) g6 k3 K5 d0 k6 X- \8 @- K( I8 {
: h4 G! }' Q5 M* C
- N' i0 C! K4 K) S5 a$ N8 p


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

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

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

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

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

本版积分规则

关于本站|大事记|小黑屋|古黑论 网站统计

GMT+8, 2020-11-29 05:53 , Processed in 0.029886 second(s), 22 queries , Redis On.

© 2015-2020 GuHei.Net

Powered by Discuz! X3.4

快速回复 返回列表