Запускать сценарии PowerShell после подключения к удаленному компьютеру - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть одно консольное приложение C #.Я хочу получить доступ к удаленному компьютеру с него, а затем запустить некоторые файлы сценариев PowerShell (доступные на удаленном компьютере), используя тот же сеанс, прежде чем завершить сеанс.

Теперь я могу подключиться к удаленному компьютеру, обратившись к этому сообщение * * 1004.Это код, который я пробовал ...

ConnectionOptions options = new ConnectionOptions();
options.Username = "user1";
options.Password = "password123";
options.Impersonation = System.Management.ImpersonationLevel.Impersonate;

ManagementScope scope = new ManagementScope("\\\\compName\\root\\cimv2", options);
scope.Connect();

//Query system for Operating System information
ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_OperatingSystem");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);

ManagementObjectCollection queryCollection = searcher.Get();
foreach (ManagementObject m in queryCollection)
{
    // Display the remote computer information
    Console.WriteLine("Computer Name     : {0}", m["csname"]);
    Console.WriteLine("Windows Directory : {0}", m["WindowsDirectory"]);
}

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

1 Ответ

0 голосов
/ 25 февраля 2019

Это консольное приложение просто воспроизводит то, что делает 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, создайте другое решение.

...