PowerShell與.NET框架之間的點(diǎn)連接
Windows PowerShell***的功能之一就是它對(duì).NET對(duì)象模式的直接訪問。不幸的是,由于我不是開發(fā)人員,且大部分編程概念對(duì)我來說也很陌生,這是我在學(xué)習(xí)PowerShell時(shí)***的障礙。
在我最初用PowerShell工作時(shí),我不知道類別、端口、構(gòu)造或成員的不同,對(duì)對(duì)象的概念(來自一個(gè)程序員的觀點(diǎn))也不是真得了解。但我確實(shí)認(rèn)為這些概念對(duì)學(xué)習(xí)和使用有Windows PowerShell的.NET很重要。我還發(fā)現(xiàn),了解一些C#(或至少能讀懂它)也非常有幫助。
因此,我將試著通過舉例來簡(jiǎn)短地解釋下這些概念并在這個(gè)過程中提供一些代碼來幫助你。我還會(huì)試著(用我有限的能力)來提供一些C# PowerShell轉(zhuǎn)換的基本指導(dǎo)。
讓我們從定義開始。此外,如果你是一個(gè)開發(fā)人員,對(duì)于我接下來說的所有事情都請(qǐng)隨意發(fā)表意見。這些定義都是我對(duì)于這些概念推導(dǎo)出來的意見。
.NET:它是有黑箱代碼的架構(gòu),這些代碼接受特定的輸入并返回一個(gè)值或?qū)ο??;旧?,微軟為你完成了所有編碼——你只須要正確調(diào)用它。MSDN是.NET架構(gòu)的無價(jià)資源。
類別(Class):我在.NET中提及的幾乎所有事情都是一個(gè)類別。我傾向于認(rèn)為一個(gè)類別是一個(gè)樣板,示范對(duì)象應(yīng)該是什么樣子和它應(yīng)該有什么特性和類函數(shù)。舉例來說,一個(gè)Microsoft.Win32.RegistryKey對(duì)象應(yīng)該有命名特性和GetValue方法。
成員(Member):每個(gè)類別都有成員,它們是連結(jié)起來的特性和類函數(shù)。如果你只想看看一個(gè)類別必須提供物的概況,這會(huì)是個(gè)好地方。
特性(Property):特性是類別兩類成員之一。簡(jiǎn)言之,可以認(rèn)為它們是對(duì)象的屬性。舉例來說,Microsoft.Win32.RegistryKey類別有Name、SubKeyCount和Value Count等特性,所以每個(gè)Microsoft.Win32.RegistryKey對(duì)象都能有這些特性。
類函數(shù)(Method):類函數(shù)是類別兩類成員之一。和特性一樣,類函數(shù)也由類別限制,但是和屬性相反,它們更像類別的功能。Microsoft.Win32.RegistryKey類別有CreateSubKey、DeleteSubkey、SetValue等類函數(shù)。和特性一樣,每個(gè)Microsoft.Win32.RegistryKey對(duì)象都能有這些類函數(shù)。
構(gòu)造函數(shù)(Constructor):構(gòu)造函數(shù)是類別的一個(gè)類函數(shù),它收集創(chuàng)建一個(gè)類別實(shí)例所需的信息。我更喜歡將構(gòu)造定義為使對(duì)象有用所需的信息或?qū)ο?。用System.Data.SqlClient.SqlCommand來舉例,有四個(gè)不同方法可以讓你從該類中創(chuàng)建一個(gè)對(duì)象。每一方法創(chuàng)建出的對(duì)象都有些微不同的數(shù)據(jù)。
靜態(tài)域(Static field):它們和特性相似,但無須創(chuàng)建對(duì)象實(shí)例就可以獲得。在PowerShell中,訪問靜態(tài)成員確實(shí)簡(jiǎn)單。你所要做的就是運(yùn)用
[.NET Class]::StaticField。
在接下來的例子中,.NET類別System.Math會(huì)返回PI值:
[System.Math]::PI.
靜態(tài)類函數(shù)(Static method):它們就像類函數(shù),但無須創(chuàng)建對(duì)象實(shí)例就可獲得。和你訪問靜態(tài)域的方式相似,你只須運(yùn)用[.NET Class]::StaticMethods。
接下來的例子中,Microsoft.Win32.RegistryKey將為一個(gè)叫做MyServer的遠(yuǎn)程機(jī)返回Microsoft.Win32.RegistryKey對(duì)象。
[Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine,”MyServer”)
現(xiàn)在我們已經(jīng)涵蓋了基本的.NET框架,讓我們?cè)敿?xì)檢查下某些PowerShell特性,如創(chuàng)建類別并發(fā)現(xiàn)這些類別可得到哪些特性和類函數(shù)。
新對(duì)象(New-Object),創(chuàng)建微軟.NET框架或COM對(duì)象的實(shí)例。
接下來的例子中我會(huì)創(chuàng)建一個(gè)System.DirectoryServices.ActiveDirectory.DirectoryContext實(shí)例:
$Context = new-object System.DirectoryServices.ActiveDirectory.DirectoryContext("DirectoryServer",$Name)
獲取成員(Get-Member),訪問對(duì)象的特性和類函數(shù)。
接下來的例子將返回$Context對(duì)象的所有成員:
$Context | Get-Member
收集所有.NET問題
以下是工作中的.NET實(shí)例。它運(yùn)用新對(duì)象、構(gòu)造函數(shù)和靜態(tài)類函數(shù)返回活動(dòng)目錄域控制器對(duì)象。
function Get-DC { Param($Name,$Domain) if($Name) { $Context = new-object System.DirectoryServices. ActiveDirectory.DirectoryContext("DirectoryServer",$Name)
[System.DirectoryServices.
ActiveDirectory.DomainController]
::GetDomainController($Context)
}
if($Domain)
{
$Context = new-object
System.DirectoryServices.
ActiveDirectory.DirectoryContext
("Domain",$Domain)
[System.DirectoryServices.ActiveDirectory.
DomainController]::FindAll($Context)
}
if(!$Name -and !$Domain)
{
$DCName = ([adsi]"LDAP://rootDSE")
.dnsHostname.ToString()
$Context = new-object
System.DirectoryServices.ActiveDirectory.
DirectoryContext("DirectoryServer",$DCName)
[System.DirectoryServices.ActiveDirectory.
DomainController]::GetDomainController($Context)
}
}
【編輯推薦】