只要有你,我便无所不能。 收藏本站
登陆 / 注册 搜索

阅读: 4.5K   回复: 3

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

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

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

本帖最后由 soarcloud 于 2016-8-2 21:28 编辑
" J2 Y: y8 S3 q( S" r% m/ M: H! D' }' ^' m! q1 M
  PowerShell可以设计的大而全,重新实现一切;也可以像现在一样设计成胶水语言,利用现有的资源。特别是,与.Net、COM和WMI三大豪门的联姻,使得PowerShell必将在Windows世界里大放光彩。6 J' y, N9 i% ]. q1 P
& {# g# V: W( p, E' W
与新锐.Net联姻
3 B( B! b$ r" M2 S  在Windows的世界里,.Net代表着现在和将来,是新生力量。与.Net联姻,就意味着榜上了粗腿,迈上了快车道。号称基于.Net Framework,那么使用.Net的基类就易如反掌。基本步骤如下:1、添加类所在程序集;2、创建类的实例;3、调用实例的函数或者属性。以StringBuilder类为例,代码如下:
3 _- v) {9 W: z& f; F0 i
# I" I9 y" x0 }: z# D  ^4 W复制代码( j$ X7 a8 z$ V( N! E
Add-Type -AssemblyName mscorlib
0 c9 A1 g. W# f: ]3 d* p$str = New-Object System.Text.StringBuilder
5 I/ m0 j+ G+ R6 l- h$str.Append("Hello")
, k/ ?  O& q. z/ ?$str.ToString()) O5 L4 t. x' r( P8 I2 m# i
复制代码& d6 I3 l3 ^4 }& U
其结果是输出Hello字符串。; H3 x* B' k) `/ T6 ~; O# x# s
  其实最让人开心的,是PowerShell能够使用自定义的.Net类库。这意味着我们的产品或者工具都能在PowerShell中继续有效。基本步骤是:写一个类库,编译成DLL,导入到PowerShell会话中,然后所定义的函数和属性都可以使用了。示例如下:2 d4 b. z3 c& m4 G+ @; q
首先写好代码,编译成DLL,假设路径是D:\PowerShellDemo\PowerShellDemo.dll。
% y% H: Q8 ]: w  Y复制代码
, w  d) v$ Y+ e0 k) Z& {using System;
* O. s$ ?% N$ ]9 C6 {% \namespace PowerShellDemo
9 B  d0 |2 k( p" s1 E+ z* a0 H! X1 x3 W2 \/ p{' L( c0 p5 @0 o" M( q4 Z" ]
    public class PowerShellDemo9 x) c, \4 d- h4 Q. [6 {+ E
    {  k& n" }! t6 _7 j! M, W
        public void Greet()
9 ~1 a2 F0 h5 @- {- u- z: b: @        {
0 Q/ S+ t/ Q! r$ I$ b            Console.WriteLine("Hello!");2 m; ], u6 K, N0 E% d/ g
        }
$ {9 G- t) N" o    }
* p  z- w* @' E$ }* u}7 A" p1 `4 M; r# g; d
复制代码
1 y9 ?* R: A) T3 |+ Y, J6 Y9 {5 I( y8 O然后将其导入到PowerShell会话中,并使用其函数或者属性。
+ E, X2 c& e) W- N& _! KAdd-Type –Path “D:\PowerShellDemo\PowerShellDemo.dll”% N6 S0 i% D7 a9 B8 n
$obj = New-Object PowerShellDemo.PowerShellDemo6 P" e# b" G6 E( l. j4 @; @; y' R
$obj.Greet()7 f- S. L, J! G2 j
以上调用的输出是Hello字符串.
5 V6 q3 ~8 ^. S* }  如此容易就能使用.Net的托管程序集,必然为它招徕一大票簇拥。
. [7 L% z2 b, F& [* z与贵族COM为伍# Q6 t7 x+ P3 R) X% P7 ^3 v
COM就像没落的贵族一样,虽然过气,但那个范儿还在。作为遗产,它们还在放光发热。PowerShell没有嫌弃它,而是选择与他们兼容。这也让现在依旧战斗在Native C++的程序员颇为欣慰。PowerShell对COM的访问方式是通过其ProgID来进行。示例如下:1 Y' v. K  g) c
复制代码
- a- X; B1 S1 a, d( h( F" F$ie = New-Object -ComObject InternetExplorer.Application
0 u3 P. h& f" S, L% W$ie.Visible = $true4 h, B3 Z7 P' Q
$ie.Navigate(“www.bing.com”)
' v) L# `7 Y  x' z1 s. @$ie.Quit()
% h* E# s  s/ p  _% j- W) Z0 |# W复制代码1 z* D$ R$ a( J% p& A# s" J& p
以上这个示例演示了对IE的启动、显示、导航和退出等操作,非常简便。与COM的良好关系,也让PowerShell操作一些系统接口变得简单而其直接。这绝对是个加分的设计。
+ i  a& Y  T8 o% C) \, ]4 T  p1 D  B与实力派WMI结盟$ J1 E* U. r7 V7 N: O0 [6 c
  WMI是访问本机和域内标准资源的强大武器,接管了WMI的资源访问,PowerShell也从此迈入豪门。它没有做多余的工作,只是轻巧的通过几个WMIObejct命令,就拥有了WMI的一整套访问机制。对于域内其他机器的访问,甚至不用利用PowerShell的远程基础结构。访问WMI的示例如下:
. J1 Q0 l' d: r8 j/ ^( x# DGet-WmiObject -Namespace "root\cimv2" -Class Win32_Process
) c; }1 W* F7 s; ^; Z  这个命令的功能跟Get-Process一样,获取本机上正在运行的进程,只是它们得到的结果的形式有一点点小的区别。真正的区别在于当从远程计算机上获取进程信息时,Get-Process必须用Invoke-Command命令,在PowerShell远程基础结构下运行,而Get-WmiObject命令只需加上-ComputerName参数即可。这份从容,是从WMI娘家带来的。+ f# w; H3 Y/ Q' y+ |
  擅用WMI,必将大大提高访问本机和远程系统资源的效率。不管你信不信,反正我是信了!3 j, D2 z" s/ l8 F, f) c, G9 ?
结语
0 I# l0 C* {5 y+ p: G6 M* H  不管是建立在.Net的基础上,还是兼容COM,再或者是以WMI的方式访问资源,PowerShell一心想成为多面胶,成为大众而非小众的朋友。作为IT人士的你,有没有别粘(电)到?
) I- {) x% G9 T- n, d' x; W8 Q
1 j+ Q1 a# Y3 i. |0 B. a1 K5 {9 r" z( l4 j
7 P2 E2 O( X) |- I/ R! t
上一篇
下一篇


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

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

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

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

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

本版积分规则

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

GMT+8, 2021-9-18 20:43 , Processed in 0.023838 second(s), 20 queries , Redis On.

© 2015-2021 GuHei.Net

Powered by Discuz! X3.4

快速回复 返回列表