我们都知道,由于PowerShell是基于.NETFramework建立的所以它能够具备访问.NET的能力,因为.NET提供了庞大的数据类库,所以我们可以很好的使用PowerShell去完成一些PowerShell本身还不能完成的功能。
首先在介绍如何调用.NET 类库前,我们先简单的说下.NET 的一些概念,Class,instances以及members是我们这里着重要说的。
你一定使用过Get-Process来查看进程的信息,其实这个命令所产生的对象类型就是System.Diagnostics.Process,也就是我们所说的Class类。
而instances实例就是这个类一些实际运行和发生的说创建的个体,比如我们有20个进程,这20个进程就是我们的实例。
关于member对象,就是某个类的成员,包含了一些属性,方法,以及它所支持的事件等等。
那么在PowerShell中是如何调用.NET类库的呢?我们以Get-Process为例,它的类其实就是System.Diagnostics.Process,我们在MSDN中搜索到System.Diagnostics.Process的相关信息如下:
我们找到了一个方法GetProcess(),首先看下图,它是属于静态方法。
既然是静态方法,我们就要以静态方法的方式在PowerShell中调用,在PowerShell中调用静态方法可以以这种形式执行[Class]::Method(),执行结果如下:
PS C:\windows\system32> [System.Diagnostics.Process]::GetProcesses() Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 106 11 980 4356 24 0.02 1156 svchost 669 25 9900 22044 141 0.78 1600 vmms 27 4 1464 2368 16 0.00 3492 cmd 430 23 4220 11820 93 0.58 1132 spoolsv 630 26 29844 37728 147 40.22 1912 svchost 212 15 6860 9560 108 0.17 1356 IpOverUsbSvc 397 15 2916 6788 36 1.66 700 svchost 272 32 63016 127188 244 29.88 788 dwm 1109 106 98952 166600 454 419.34 2968 BingDict 216 10 1572 6880 82 1.66 2204 rdpclip 400 34 109080 119712 647 13.06 3804 powershell 588 57 54416 54248 777 9.22 2892 mmc 208 11 1596 3864 64 0.53 420 csrss 106 10 3136 7448 41 0.05 1220 svchost 116 8 1212 5600 73 0.00 2732 ChsIME 981 19 4328 11212 40 1.48 592 lsass 393 46 98440 122912 789 15.84 3348 powershell_ise 422 37 12800 33856 205 11.05 3880 iexplore 484 34 8592 11484 59 0.56 764 svchost 80 8 768 3724 45 0.13 496 wininit 220 9 2336 6616 25 1.28 584 services 60 7 1324 5464 71 0.13 3500 conhost 159 12 2496 6792 41 0.19 840 msdtc 1528 50 18136 32384 167 21.89 936 svchost 1376 44 36876 66204 491 1.73 2576 lync 265 18 2020 40028 203 11.06 488 csrss 107 8 1260 5336 56 0.14 1196 Fuel.Service 57 7 3952 10268 63 5.70 2900 conhost 97 9 1360 5692 40 0.03 1460 sqlwriter 301 15 4336 13764 149 0.39 836 msseces
调用静态方法十分简单,那么如果我们需要创建一个类的实例我们又应该怎么做呢?我们这次拿System.Diagnostics.Eventlog类为例,我们查看下这个类下的构造方法,这个方法接受2个参数,log名以及Machine机器名:
知道方法所需要调用的参数后,我们就可以用New-Object命令来创建一个.NET类以及实例了。
New-Object -TypeName System.Diagnostics.EventLog -ArgumentList ‘Security‘,‘Server1‘
于ArgumentList参数,它能够帮你传递参数给类的构造器,而.NET可以自动识别你所传递给构造器的参数数量和对应数据。
最后,如果你想查看当前PowerShell支持加载的.NET集合可以使用如下代码:
PS C:\Windows\system32> [appdomain]::CurrentDomain.GetAssemblies()|%{$_.fullname.split(",")[0]} mscorlib powershell_ise System.Windows.Forms System System.Drawing System.Management.Automation System.Core Microsoft.PowerShell.ISECommon Microsoft.PowerShell.GPowerShell System.ComponentModel.Composition Microsoft.PowerShell.Editor WindowsBase PresentationFramework PresentationCore System.Xaml System.Configuration System.Xml System.Runtime.Serialization UIAutomationProvider Accessibility MetadataViewProxies_b9dd7b79-8b1d-4f12-827c-e0f7bb8f29db System.Management System.DirectoryServices Microsoft.Management.Infrastructure PresentationFramework.Aero2 PresentationFramework-SystemXml System.Data Anonymously Hosted DynamicMethods Assembly Microsoft.PowerShell.Security System.Transactions System.Numerics Microsoft.CSharp Microsoft.PowerShell.GraphicalHost UIAutomationTypes Microsoft.GeneratedCode PresentationFramework-SystemData PresentationFramework-SystemCore Windows.UI System.Runtime.InteropServices.WindowsRuntime Microsoft.PowerShell.Commands.Utility System.Configuration.Install Microsoft.PowerShell.Activities System.Activities Microsoft.PowerShell.Workflow.ServiceCore System.Activities.Presentation Microsoft.PowerShell.Core.Activities Microsoft.PowerShell.Diagnostics.Activities Microsoft.PowerShell.Management.Activities Microsoft.PowerShell.Security.Activities Microsoft.PowerShell.Utility.Activities Microsoft.WSMan.Management.Activities System.Runtime.DurableInstancing System.ServiceModel.Internals Microsoft.PowerShell.Commands.Management System.Xml.Linq PresentationFramework-SystemXmlLinq Microsoft.PowerShell.Commands.Diagnostics Microsoft.PowerShell.ConsoleHost Microsoft.WSMan.Management System.EnterpriseServices SMDiagnostics Microsoft.PowerShell.ScheduledJob Carbon System.Security Ionic.Zip System.Web Microsoft.Web.Administration Carbon.Iis System.ServiceProcess System.Messaging System.DirectoryServices.AccountManagement Microsoft.Management.Infrastructure.Native Microsoft.Management.Infrastructure.UserFilteredExceptionHandling Microsoft.CertificateServices.PKIClient.Cmdlets System.Dynamic Microsoft.VisualBasic.Activities.Compiler Microsoft.VisualBasic Microsoft.PowerShell.Cmdletization.GeneratedTypes ?C??Windows?system32?WindowsPowerShell?v1.0?Modules?Storage?StorageScripts.psm1 Microsoft.PowerShell.PackageManagement Microsoft.PackageManagement ornhs0lk Microsoft.PackageManagement.MetaProvider.PowerShell Microsoft.PackageManagement.MsuProvider Microsoft.PackageManagement.CoreProviders Microsoft.PackageManagement.MsiProvider Microsoft.PackageManagement.ArchiverProviders Microsoft.PackageManagement.NuGetProvider System.Net.Http DynamicClasses PSEventHandler