Не удалось запустить PS-скрипт - команды не указаны - PullRequest
0 голосов
/ 17 мая 2018

В настоящее время я пытаюсь удаленно вызвать сценарий PowerShell через мой код C #, но почему-то мне постоянно не удается достичь своей цели, и мои поиски в Google пока что оказываются безуспешными.

Я пытался добавитькаждый параметр как «command.AddParameter» и с использованием «.AddParameter», но у меня все еще возникает та же проблема, и у меня заканчиваются идеи.

                    PSCredential credential = new PSCredential(LSUUser, password);
                    var command = new PSCommand();
                    command.AddCommand("Invoke-Command")
                    .AddParameter("ComputerName", computerName)
                    .AddParameter("Credential", credential)
                    .AddParameter("ScriptBlock", ScriptBlock.Create(@"param(${process}) Stop-Process ${process}"))
                    .AddParameter("Argumentlist", new object[] { process });

                    //Tried this as well, but no success :( 
                    //command.AddParameter("Scriptblock", ScriptBlock.Create(@"param($comp, $cred, $pro) -Computername $comp -Credential $cred Stop-Process $pro"));
                    //command.AddParameter("ArgumentList", new object[] {computerName, credential, process});

Сообщение об ошибке: ("vid" - шведское слово для "at", не знаю, почему мой отладчик переводит части моих сообщений об ошибках, поскольку я запускаю VS на английском языке)

Could not run PS-script: System.Management.Automation.PSInvalidOperationException: No commands are specified.
    at System.Management.Automation.PowerShell.Prepare[TInput,TOutput](PSDataCollection`1 input, PSDataCollection`1 output, PSInvocationSettings settings, Boolean shouldCreateWorker)
    at System.Management.Automation.PowerShell.CoreInvokeHelper[TInput,TOutput](PSDataCollection`1 input, PSDataCollection`1 output, PSInvocationSettings settings)
    at System.Management.Automation.PowerShell.CoreInvoke[TInput,TOutput](PSDataCollection`1 input, PSDataCollection`1 output, PSInvocationSettings settings)
    at System.Management.Automation.PowerShell.CoreInvoke[TOutput](IEnumerable input, PSDataCollection`1 output, PSInvocationSettings settings)
    at System.Management.Automation.PowerShell.Invoke(IEnumerable input, PSInvocationSettings settings)
    at System.Management.Automation.PowerShell.Invoke()
    at <projectname>.TerminateProcess(String computerName, String process)

Любойидеи, что я делаю не так, будут с благодарностью!Примечание: я бы предпочел не использовать внешний PS-файл, но я могу быть вынужден использовать его, если решение не найдено.

Редактировать: Вся функция для пояснения.В настоящее время я просто регистрирую PSOutputs, чтобы увидеть, что происходит.

     public void TerminateProcess(string computerName, string process)
    {
        SecureString password = new SecureString();
        foreach(char c in LSUPass)
        {
            password.AppendChar(c);
        }

        try
        {
            //using (Runspace runspace = RunspaceFactory.CreateRunspace())
            //{
                using (PowerShell powerShellInstance = PowerShell.Create())
                {
                    PSCredential credential = new PSCredential(LSUUser, password);
                ScriptBlock scriptBlock = ScriptBlock.Create(@"param(${process}) Stop-Process ${process}");
                    var command = new PSCommand();
                command.AddCommand("invoke-command");
                    command.AddParameter("ComputerName", computerName);
                    command.AddParameter("Credential", credential);
                    command.AddParameter("ScriptBlock", scriptBlock);
                    command.AddParameter("Argumentlist", new object[] { process });

                    //Tried this as well, but no success :( 
                    //command.AddParameter("Scriptblock", ScriptBlock.Create(@"param($comp, $cred, $pro) -Computername $comp -Credential $cred Stop-Process $pro"));
                    //command.AddParameter("ArgumentList", new object[] {computerName, credential, process});
                    string PSDebug = "";
                    foreach(object com in command.Commands)
                    {

                        PSDebug = PSDebug + com.ToString();
                    }
                    Logger("INFO", PSDebug);


                    Collection<PSObject> PSOutput = powerShellInstance.Invoke();
                    if (powerShellInstance.Streams.Error.Count > 0)
                    {
                        foreach(ErrorRecord error in powerShellInstance.Streams.Error)
                        {
                            Logger("ERROR", error.ToString());
                        }
                    }
                    foreach (PSObject outputItem in PSOutput)
                    {
                        if (outputItem != null)
                        {
                            Logger("INFO", outputItem.BaseObject.GetType().FullName);
                        }
                    }
                }
            //}

        }
        catch (Exception e)
        {

            Logger("ERROR", "Could not run PS-script: " + e.ToString());
        }
    }

1 Ответ

0 голосов
/ 17 мая 2018

Как отметил PetSerAI в комментариях, я забыл привязать команду к самому экземпляру.После добавления последней строки кода он, кажется, работает (ну, все же есть ошибки доступа, но это то, что я должен быть в состоянии выяснить).:)

                    PSCredential credential = new PSCredential(LSUUser, password);
                ScriptBlock scriptBlock = ScriptBlock.Create(@"param(${process}) Stop-Process ${process}");
                    var command = new PSCommand();
                command.AddCommand("invoke-command");
                    command.AddParameter("ComputerName", computerName);
                    command.AddParameter("Credential", credential);
                    command.AddParameter("ScriptBlock", scriptBlock);
                    command.AddParameter("Argumentlist", new object[] { process });

                powerShellInstance.Commands = command;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...