Ответ 1
Для этого есть несколько частей, поэтому я объясню их отдельно, а затем соберу их вместе.
Неявное удаление
Exchange использует Implicit Remoting.
Как это работает, вы устанавливаете PSSession на удаленную машину, а затем импортируете некоторые из команд, доступных из удаленного экземпляра, в свой собственный.
Это делается с помощью Import-Module -Session $session
или Import-PSSession
.
Вы можете попробовать это для себя исключительно в Powershell. Используйте рабочую станцию, на которой нет установленного Active Directory RSAT (у нее нет командлетов PowerWall ActiveDirectory), затем подключитесь к машине, которая делает это (позвоните на нее DC1
):
$s = New-PSSession -ComputerName DC1
Invoke-Command -Session $s -ScriptBlock { Import-Module ActiveDirectory }
Import-PSSession -Session $s -Module ActiveDirectory
Ограничение вызова Import-PSSession
только одним модулем позволяет импортировать только эти командлеты. На этом этапе вы могли бы выполнить Get-ADComputer
, например, как если бы он был доступен локально, даже если фактический вызов выполняется на DC1
.
Конфигурации сеансов
Когда вы подключаете соединение с PowerShell, вы подключаетесь к конфигурации сеанса. Если вы не укажете один, вы подключитесь к одному вызываемому Microsoft.PowerShell
. Чтобы просмотреть все конфигурации, определенные на машине, вызовите Get-PSSessionConfiguration
. Вы можете увидеть некоторые другие, например Microsoft.PowerShell32
- это способ подключения к сеансу силовой панели 32 бит.
Чтобы подключиться к определенной конфигурации, используйте New-PSSession -ConfigurationName
или New-PSSession -ConnectionUri
.
Определение конфигураций сеансов
В конфигурации сеанса вы можете указать много материала; версия powershell, битность, какие модули предварительно импортированы, вы можете заранее определить функции и код, вы можете запретить языковые функции и т.д.
Этот ответ дает хороший обзор того, как создать свою собственную конфигурацию.
Вы также можете поместить информацию о конфигурации внутри сборки, которая будет хорошо работать для того, что вы пытаетесь сделать.
Код упаковки в модулях
Как вы видели с помощью Import-PSSession
, проще импортировать именно тот код, который вы хотите, если он существует в модуле. Поэтому вы должны убедиться, что ваш командлет открыт через модуль.
Вы сказали в комментарии, что хотите написать свой командлет на С#. Это не то, что я сделал, но в этой статье содержатся подробные инструкции по как создать модуль PowerShell на С#.
Это то, что я сделал (и эта статья хорошая). Написание командлета в С# является неявным, уже модулем. Фактически, вы можете использовать Import-Module
для загрузки скомпилированной сборки .NET, независимо от того, содержит ли она командлеты PowerShell или нет.
Например, если вы создали открытый класс и скомпилировали его в DLL, вы можете сделать Import-Module MyAssembly.dll
, и этот класс теперь доступен в сеансе PowerShell.
Определение командлета в С# означает включение ссылки на System.management.Automation
, а затем создание класса, наследующего от Cmdlet
или PSCmdlet
.
Определение манифеста модуля рекомендуется, но технически необязательно, так же, как и с модулем script.
Однако я не включил информацию о конфигурации сеанса в сборку (пока?), и я не видел ссылку для того, как это сделать.
Приведение его вместе
Шаги должны примерно напоминать следующее:
- Скомпилируйте модуль и сделайте его доступным на удаленном конце, чтобы его можно было импортировать в powershell из локального сеанса на этом компьютере.
- Создайте новый файл конфигурации PSSession и укажите либо
-AssembliesToLoad
, либо-ModulesToImport
(или оба, если необходимо), или укажите информацию о конфигурации в самой сборки (вероятно, здесь предпочтительнее). - Зарегистрируйте конфигурацию на компьютере.
- На стороне клиента вы хотели сделать его доступным для PowerShell, поэтому вы просто создадите сеанс, а затем импортируете его:
$s = New-PSSession -ComputerName RemoteMachine -ConfigurationName MyConfig
# The configuration was defined in such a way
# that your module will already be imported in the remote session.
Import-PSSession -Module MyModule
Упрощение его?
Вам не нужно создавать настраиваемую конфигурацию на удаленной стороне. Пока ваш модуль доступен для любого сеанса powershell на удаленном компьютере, вы можете пропустить шаги настройки сеанса, а затем просто выполните:
$s = New-PSSession -ComputerName RemoteMachine
Invoke-Command -Session $s -ScriptBlock { Import-Module MyModule }
Import-PSSession -Session $s -Module MyModule
Но вам может потребоваться дополнительная настройка и управление с помощью конфигурации сеанса, так что до вас. Это как обмен делает это, но это может быть излишним для ваших целей.