Как я могу вызвать модуль FailoverClusters PowerShell при работе с C #?

#c# #powershell #hyper-v

#c# #powershell #hyper-v

Вопрос:

Я пытаюсь вызвать сценарий PowerShell из C #, который обычно очень прост, за исключением того, что по какой-то причине команды в модуле FailoverClusters никогда не могут быть найдены при вызове из C # (не в области видимости). Вот что я обнаружил:

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

 PS C:> Get-Cluster -Name DummyCluster

Name
----
DummyCluster
  

Команды никогда не обнаруживаются при использовании локального сеанса PowerShell из C#:

 var ps = PowerShell.Create();
ps.AddCommand("Get-Cluster");
ps.AddParameter("Name", "DummyCluster");
var r = ps.Invoke();
//Exception: command not found
  

Я перепробовал около 6-7 различных способов импорта модуля, и ни один из них не сработал. Вот один из них, взятый из этого руководства по теме:

 var ps = PowerShell.Create();
var ss = InitialSessionState.CreateDefault();
var modules = new string[1]{"FailoverClusters"};
ss.ImportPSModule(modules);
var rs = RunspaceFactory.CreateRunspace(ss);
rs.Open();
var iv = new RunspaceInvoke(rs);
var r = iv.Invoke("Get-Cluster -Name DummyCluster");
//Exception: command not found
  

Интересно, что команды обнаруживаются при использовании удаленного сеанса PowerShell. Это правдоподобный обходной путь для определенных вариантов использования.

 var ci = new WSManConnectionInfo(); //localhost remote connection
var rs = RunspaceFactory.CreateRunspace(ci);
rs.Open();
var iv = new RunspaceInvoke(rs);
var r = iv.Invoke("Get-Cluster -Name DummyCluster");
//Exception: access is denied
  

Модуль FailoverClusters не виден из C#:

 var ps = PowerShell.Create();
ps.AddCommand("Get-Module");
ps.AddParameter("ListAvailable");
ps.AddArgument("FailoverClusters");
var results = ps.Invoke();
Console.WriteLine(results.Count.ToString()); //prints 0
  

Однако он виден из интерактивного сеанса PowerShell:

 PS C:> Get-Module -ListAvailable FailoverClusters


    Directory: C:windowssystem32WindowsPowerShellv1.0Modules


ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Manifest   2.0.0.0    FailoverClusters                    {Add-ClusterCheckpoint, Add-ClusterDisk, Add-ClusterFileSe...
  

Ответ №1:

Модуль FailoverClusters доступен только в 64-разрядных сеансах PowerShell. Убедитесь, что C # DLL, которую вы создаете, является 64-разрядной DLL.

Комментарии:

1. Спасибо!! Эта небольшая информация стала переломным моментом, после почти 2 дней ударов головой о стену…