1

這就是我想要實現的功能,我找不到任何關於此的信息。在PowerShell中動態創建cmdlet /模塊

我想爲遠程服務器上可用的模塊創建遠程模塊代理。

我知道如何使用遠程處理,但我想要創建更乾淨的腳本文件。

舉個例子。如果我想在遠程計算機上從模塊MyModule的執行MyCmdlet我會做這個

$block={ 
    # Invoke the cmdlet from a module named MyCmdlet 
    MyCmdlet -Parameter1 -Parameter2 
} 

Invoke-Command -ComputerName "" -ScriptBlock $block 

但我想土地弄成這個樣子

Import-Module MyModuleRemote 
MyCmdlet -ComputerName "" -Parameter1 -Parameter2 

請注意到MyModule的我的客戶機上未安裝

我可以用Invoke-Command包裝器爲每個cmdlet重新編寫模塊,但這不是目的。通過爲每個cmdlet和參數創建一個代理平等代理,我想要做的是遠程處理MyModule。即使是Get-Help也應該至少對參數組合起作用。

我有幾個想法,但我不確定是否有可能。

  1. 創建一個powershell模塊,例如, PSRemotify將檢測遠程服務器上的模塊並生成代碼。
    1. 如果我選擇將文件寫入文件系統,那麼這應該是可能的,如果我可以對cmdlet進行反射。
    2. 如果我不想保存文件,那麼我需要在內存中執行所有操作。我可以在內存中編寫cmdlet的主體嗎?我可以生成一個字符串並導入其嵌入式cmdlet嗎?
  2. 創建一個1.2的腳本。

我的選擇是選項1.2。非常乾淨且不會在文件系統上留下任何痕跡。

任何想法?有沒有人試過類似的東西?我的調查和回答@ Persistent13後

結論:

PowerShell中提供此功能的開箱。它被稱爲IMPLICIT REMOTING。在@ Persistent13的回答之前,我採取了錯誤的部分,因爲我認爲分享我的經驗很有趣,我已經在博客上發表了看法。 import and use module from a remote server

+1

'$ Session = New-PSSession -ComputerName「」;導入模塊-PSSession $會話MyModule'? – PetSerAl

回答

1

這聽起來像你想要的是隱式遠程處理,並且設置起來相當簡單。

請注意我已經從here採取了此說明。

要創建一個你要一個隱含的會話:

PS C:\> $foo = New-PSSession -ComputerName DC1 
PS C:\> Import-Module -PSSession $foo -Name ActiveDirectory 
PS C:\> Get-ADUser 

以上將打開計算機DC1一個PowerShell會話,導入ActiveDirectory中模塊的遠程計算機上,並且命令對遠程計算機同時運行它似乎在本地執行。

在本地模塊與遠程模塊衝突的情況下,也可以使用隱式導入模塊的前綴。

PS C:\> $foo = New-PSSession -ComputerName DC1 
PS C:\> Import-Module -PSSession $foo -Name ActiveDirectory -Prefix DC1 
PS C:\> Get-DC1ADUser 

這樣做的好處是沒有必要REMOT-IFY的模塊,只要它存在於遠程計算機上和PowerShell遠程處理是允許的。

但是,這種方法的一個警告是,返回的對象的類型會改變。

Deserialized.Microsoft.ActiveDirectory.ADUser當使用隱式遠程處理時。

Microsoft.ActiveDirectory.ADUser在本地運行時。

0

當我提出這個問題時,我不知道隱式遠程的概念。

實際上,您使用Import-Module導入模塊,但您也可以使用參數-Session指定到遠程服務器的會話。

例如從服務器$target="SERVER"Microsoft.PowerShell.Management導入執行該

$session=New-PSSession -ComputerName $target 
Import-Module Microsoft.PowerShell.Management -Session $session 

有了這個在於提供了相同的小命令所指定的一個當前會話產生代理模塊。代理cmdlet自動將參數推送到遠程會話$session並捕獲其輸出。從SERVER隱含導入Microsoft.PowerShell.ManagementGet-ServiceSERVER返回服務。

你真的可以通過執行

$module=Get-Module Microsoft.PowerShell.Management 
$module.Definition 

它至少有趣看到代理的cmdlet的執行情況。

+0

關於此的完整說明可以在[https://sarafian.github.io/tips/2016/07/01/Import-Module-Remote.html] –