一直注视着你,似近似远,总是触碰不到。 收藏本站
登陆 / 注册 搜索

阅读: 3.7K   回复: 3

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

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

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

本帖最后由 soarcloud 于 2016-8-2 21:28 编辑
! j2 U9 R4 R! u5 {4 T. W; b8 U% M6 S- ^/ E/ v) L( F% d) ]! a1 R
  PowerShell可以设计的大而全,重新实现一切;也可以像现在一样设计成胶水语言,利用现有的资源。特别是,与.Net、COM和WMI三大豪门的联姻,使得PowerShell必将在Windows世界里大放光彩。
0 g- b. S( t8 v" p3 @( n9 M, M& x5 p# [1 P
与新锐.Net联姻
' O$ F8 ?6 R# t8 ?0 ~8 v; {; L. }  在Windows的世界里,.Net代表着现在和将来,是新生力量。与.Net联姻,就意味着榜上了粗腿,迈上了快车道。号称基于.Net Framework,那么使用.Net的基类就易如反掌。基本步骤如下:1、添加类所在程序集;2、创建类的实例;3、调用实例的函数或者属性。以StringBuilder类为例,代码如下:0 r1 x1 t- Z/ \0 W

; |+ |% Z, {7 C复制代码
/ W* X1 O# H1 R! ]; K+ ]( z' sAdd-Type -AssemblyName mscorlib
2 E  |# Q9 Q: Z. N( e$str = New-Object System.Text.StringBuilder
3 Y9 H' {9 T- ^/ n& w( D$str.Append("Hello")
: v! E6 m0 V! h1 i2 J$str.ToString()1 L, J+ i2 Y6 H0 F$ C
复制代码
: X" \) T( @* b' {7 X5 I其结果是输出Hello字符串。* _7 j6 o2 D2 U6 ]! A* z
  其实最让人开心的,是PowerShell能够使用自定义的.Net类库。这意味着我们的产品或者工具都能在PowerShell中继续有效。基本步骤是:写一个类库,编译成DLL,导入到PowerShell会话中,然后所定义的函数和属性都可以使用了。示例如下:. [# |, e# E8 G" Y
首先写好代码,编译成DLL,假设路径是D:\PowerShellDemo\PowerShellDemo.dll。
$ F& K- D6 j: V, r8 n  @% T复制代码
, ^+ W1 j4 W- |4 x  ^( T; lusing System;2 l- y- H3 P) `: R
namespace PowerShellDemo
' j0 T% U8 @" m0 Z{
# o- Z  ]' n( u7 O0 J    public class PowerShellDemo
& p8 a% P( y( W, @+ ]$ j    {
4 h! i- p  f/ X7 l* z        public void Greet()
  E/ S/ X$ Z, |        {' d* c( k- Q- _4 L. z
            Console.WriteLine("Hello!");
1 Y- U& Z% K" |: S% ^        }0 {, n. m# e6 Z* Y
    }
" l1 ^7 E( V# P}- U# w/ u6 |- N- h
复制代码0 A2 k2 c+ k2 q  V# F' F
然后将其导入到PowerShell会话中,并使用其函数或者属性。3 e% u5 Z9 v! X/ \' A# ?% d
Add-Type –Path “D:\PowerShellDemo\PowerShellDemo.dll”$ e$ c7 X* ]  h( _: n
$obj = New-Object PowerShellDemo.PowerShellDemo
( M& G  M; L" u$ X* A$obj.Greet()
: s9 |( ?1 {& R以上调用的输出是Hello字符串.
# }! K2 k4 A: }0 |4 \- i  如此容易就能使用.Net的托管程序集,必然为它招徕一大票簇拥。
( m0 @4 j! i3 R  l/ n% Z与贵族COM为伍
0 a% X. P6 g0 ~0 J3 I& B6 L; _COM就像没落的贵族一样,虽然过气,但那个范儿还在。作为遗产,它们还在放光发热。PowerShell没有嫌弃它,而是选择与他们兼容。这也让现在依旧战斗在Native C++的程序员颇为欣慰。PowerShell对COM的访问方式是通过其ProgID来进行。示例如下:
8 j: T( L8 H! q% h% y) P复制代码
. w3 ]- A+ g. w8 `# S% [# C$ie = New-Object -ComObject InternetExplorer.Application* v+ U" [$ |4 m# h  J3 a( C
$ie.Visible = $true' A/ Y4 A: `# g; v+ k
$ie.Navigate(“www.bing.com”). w$ j' {+ I$ K# Z3 N: s
$ie.Quit()
. I! ^% l4 X. \' o5 Q复制代码
( b# b! m) `1 `6 ?7 g  @) q* Q4 i6 g以上这个示例演示了对IE的启动、显示、导航和退出等操作,非常简便。与COM的良好关系,也让PowerShell操作一些系统接口变得简单而其直接。这绝对是个加分的设计。 " O# e. Z) @  d( R% S% g& K
与实力派WMI结盟
0 ^& z+ J& t4 w  WMI是访问本机和域内标准资源的强大武器,接管了WMI的资源访问,PowerShell也从此迈入豪门。它没有做多余的工作,只是轻巧的通过几个WMIObejct命令,就拥有了WMI的一整套访问机制。对于域内其他机器的访问,甚至不用利用PowerShell的远程基础结构。访问WMI的示例如下:
9 `" }& f$ P# m  b2 G3 FGet-WmiObject -Namespace "root\cimv2" -Class Win32_Process% a$ ?, a, G& w/ n6 F: G
  这个命令的功能跟Get-Process一样,获取本机上正在运行的进程,只是它们得到的结果的形式有一点点小的区别。真正的区别在于当从远程计算机上获取进程信息时,Get-Process必须用Invoke-Command命令,在PowerShell远程基础结构下运行,而Get-WmiObject命令只需加上-ComputerName参数即可。这份从容,是从WMI娘家带来的。
1 A' X' J& s. ^- z6 J  擅用WMI,必将大大提高访问本机和远程系统资源的效率。不管你信不信,反正我是信了!% _/ q" h- c( r' z: x
结语
7 w$ M* ^! m9 U  O  a  不管是建立在.Net的基础上,还是兼容COM,再或者是以WMI的方式访问资源,PowerShell一心想成为多面胶,成为大众而非小众的朋友。作为IT人士的你,有没有别粘(电)到?2 h  D% F" C2 ~5 v- `  b
& a& E$ h3 l4 t, M$ J' H

- V4 e: D- p9 E8 k* v
/ U+ ~: c3 ~( K* V! B. b" b


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

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

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

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

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

本版积分规则

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

GMT+8, 2020-9-22 17:46 , Processed in 0.038817 second(s), 21 queries , Redis On.

© 2015-2020 GuHei.Net

Powered by Discuz! X3.4

快速回复 返回列表