Это консольное приложение просто воспроизводит то, что делает PowerShell Remoting или что делает MS SysInternals psexec.
Зачем воссоздавать это?
Я понимаю, что это требование, но это чрезмерное осложнение, с которым вам не придется справляться в долгосрочной перспективе.
Звучит так, будто PSRemoting не включен, поэтому причина этого консольного приложения.
В любом случае, вы по-прежнему будете создавать экземпляр хоста PowerShell для запуска PowerShell.Итак, вы просто размещаете PowerShell в своем приложении C #.
Запуск PowerShell из C # является обычным делом и хорошо документирован.Быстрый поиск даст вам множество хитов и примеров для использования.
Как запускать скрипты PowerShell из C #
Вызов C # кода в Powershell и наоборот
добавьте следующие операторы using для импорта требуемых типов:
using System.Collections.ObjectModel;
using System.Management.Automation;
using System.Management.Automation.Runspaces;
В следующем блоке кода показан метод RunScript, который выполняетвся тяжелая работа.Он берет текст сценария, выполняет его и возвращает результат в виде строки.
private string RunScript(string scriptText)
{
// create Powershell runspace
Runspace runspace = RunspaceFactory.CreateRunspace();
// open it
runspace.Open();
// create a pipeline and feed it the script text
Pipeline pipeline = runspace.CreatePipeline();
pipeline.Commands.AddScript(scriptText);
// add an extra command to transform the script
// output objects into nicely formatted strings
// remove this line to get the actual objects
// that the script returns. For example, the script
// "Get-Process" returns a collection
// of System.Diagnostics.Process instances.
pipeline.Commands.Add("Out-String");
// execute the script
Collection<psobject /> results = pipeline.Invoke();
// close the runspace
runspace.Close();
// convert the script result into a single string
StringBuilder stringBuilder = new StringBuilder();
foreach (PSObject obj in results)
{
stringBuilder.AppendLine(obj.ToString());
}
return stringBuilder.ToString();
}
Как позволить сценарию взаимодействовать с вашей программой
Перед выполнениемсценария с помощью вызова pipe.Invoke (), можно представить объекты вашей программы сценарию с помощью метода runspace.SessionStateProxy.SetVariable ("someName", someObject).
Это создаст именованную переменную, к которой скрипт сможет получить доступ (получение / установка свойств и даже вызов методов).
В качестве примера предположим, что мы предоставили бы скрипту основную форму примера, добавив вызов SetVariable () следующим образом:
...
// open it
runspace.Open();
runspace.SessionStateProxy.SetVariable("DemoForm", this);
....
Then, the following script would print the caption of the window:
$DemoForm.Text
The following script would show all the properties and methods of the window:
$DemoForm | Get-Member
Обратите вниманиеоднако любые вызовы, которые скрипт выполняет с вашими объектами, будут происходить из другого контекста потока, так как pipe.Invoke (), похоже, запускает свой собственный рабочий поток.Это означает, что ваши открытые объекты должны быть поточно-ориентированными.
Это может даже рассматриваться как дубликат этого Q & A
Запуск PowerShell-Script из приложения C #
Обновление для OP
Что касается ...
Консольное приложение c #требуется действовать как центр для обработки нескольких файлов сценариев .ps1,
Итак, приложение C # - это C & C, заменяющее сеанс PSRemoting / PSExec.Тем не менее, вы не говорите, где находятся файлы сценариев или как планируете доставлять их в удаленные системы.
, но сначала для этого нужно сначала получить доступ к удаленному компьютеру.
Что и делает PSRemoting ...
$s = New-PSSession -ComputerName (Get-Content Servers.txt) -Credential Domain01\Admin01
Invoke-Command -Session $s -ScriptBlock {
# Run these PowerShell commands or scripts.
Get-Process PowerShell
}
Или как фоновое задание
$s = New-PSSession -ComputerName (Get-Content Servers.txt) -Credential Domain01\Admin01
Invoke-Command -Session $s -ScriptBlock {
# Run these PowerShell commands or scripts.
Get-Process PowerShell
} -AsJob
и PSExec .
psexec \ RemotePCName [-u имя пользователя [-p пароль]] команда [аргументы]
Что касается ...
Только после успешного запуска всех файлов .ps1, он должен выйти из системы с удаленного компьютера и вернуть любой вывод на консоль.
Опять же, именно то, что PSRemoting и PSExec делает.
Вот почему я думаю сначала подключиться к удаленному компьютеру с помощью c #, а затем вызвать все файлы .ps1.
Ваше консольное приложение просто должно выполнить вышеуказанное.Это выполнимо, как отмечается в этих вопросах и ответах, ну, там просто с помощью команды, а не с помощью скриптов, но применяются те же правила ...
Выполнение сценария powershell на удаленном компьютере с использованием C #
Вызов удаленной команды powershell из C #
Пример:
InitialSessionState initial = InitialSessionState.CreateDefault();
Runspace runspace = RunspaceFactory.CreateRunspace(initial);
runspace.Open();
PowerShell ps = PowerShell.Create();
ps.Runspace = runspace;
ps.AddCommand("invoke-command");
ps.AddParameter("ComputerName", "mycomp.mylab.com");
ScriptBlock filter = ScriptBlock.Create("Get-childitem C:\\windows");
ps.AddParameter("ScriptBlock", filter);
foreach (PSObject obj in ps.Invoke())
{
// Do Something
}
, но опять же, он просто повторяет вышеприведенное.Итак, Yeppers, это выбор.Используйте PSRemoting, используйте PSExec, создайте другое решение.