Код: Выделить всё
using System.Collections.ObjectModel;
using System.Management.Automation;
namespace PSHosting;
class Program
{
static void Main()
{
using (var powerShell = PowerShell.Create())
{
powerShell.AddScript("Get-ClusterResource -Cluster 'WSFC1'");
Collection result = powerShell.Invoke();
}
}
}
При вызове Get-ClusterResource в сеансе PowerShell PowerShell использует метод неявного удаленного взаимодействия, чтобы создать и загрузить прокси-модуль для исходного модуля FailoverCluster, а затем выполнить команду на удаленном компьютере. Загруженный прокси-модуль кэшируется на время существования сеанса PowerShell (и я думаю, именно по этой причине удаление как прокси-модуля, так и папки исходного модуля, вероятно, не повлияет на текущий сеанс PowerShell), поэтому каждый раз, когда открывается новый сеанс PowerShell, неявное удаленное взаимодействие создает и загружает прокси-модуль заново.
В какой-то момент во время моих попыток получить работая Get-ClusterResource в моем коде C#, я включил следующее в приведенный выше код (перед оператором using):
- Команда Set-ExecutionPolicy, которая позволяет PowerShell выполнять произвольные сценарии (скорее всего, это необходимо, поскольку загрузка модуля (см. ниже) и/или неявное удаленное взаимодействие будут запускать .ps1 и/или .psm скрипты, содержащиеся в папке модуля FailoverCluster)
- Команда Import-Module, которая загружает модуль FailoverCluster в текущий сеанс
Что еще более интересно для меня, так это то, что кэшированный прокси-модуль, похоже, имеет какое-то постоянное состояние при использовании в моем коде C#: я могу повторно запускать приведенный выше код успешно даже после перезагрузки Windows.
Моя конечная цель — опубликовать код, подобный приведенному выше, вместе со всеми необходимыми модулями и другим материалом, чтобы он мог успешно работать на компьютере только со стандартной версией Windows 11 (единственное исключение: установлена среда выполнения .NET, соответствующая моей версии C#, поэтому мне не нужно ее распространять).
Из того, что я знаю на данный момент, это означает, что мне нужно чтобы:
- Включить папку модуля FailoverCluster в мою публикацию и
- Добавить команды 1. и 2. выше в мой код (надеюсь, ссылка на модуль FailoverCluster работает с относительным путем)
Подробнее здесь: https://stackoverflow.com/questions/797 ... t-remoting
Мобильная версия