Подтвердить что ты не робот

Как разместить приложение Powershell script или приложение, чтобы оно было доступно через WSManConnectionInfo? (например, Office 365)

Единственными способами, которые я знаю для подключения к удаленному рабочему пространству, являются следующие параметры

   WSManConnectionInfo connectionInfo = 
     new WSManConnectionInfo(false, "localhost", 80, "/Powershell", "http://schemas.microsoft.com/powershell/Microsoft.Exchange", credential);

или

   WSManConnectionInfo connectionInfo = 
     new WSManConnectionInfo(false, "localhost", 5985, "/wsman", "http://schemas.microsoft.com/powershell/Microsoft.Powershell", credential);
  • Как настроить собственный пользовательский объект Powershell, чтобы я мог разоблачить его через HTTP?

  • Каковы правильные параметры для использования и как их настроить?

4b9b3361

Ответ 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

Но вам может потребоваться дополнительная настройка и управление с помощью конфигурации сеанса, так что до вас. Это как обмен делает это, но это может быть излишним для ваших целей.