Как запустить PowerShell script с С# в качестве пользователя без повышения

Я пытаюсь запустить PowerShell script из приложения С#, и мне нужен script для запуска, когда мое приложение С# работает как пользователь, не являющийся администратором (например, сетевая служба или другая учетная запись домена).

Раньше я использовал следующий код:

using (RunspaceInvoke invoker = new RunspaceInvoke())
{
    // load the powershell module
    invoker.Invoke("Import-Module MyModule");

    // run the cmdlet defined in the module 
    invoker.Invoke("MyCmdlet");
}

Я не знаю, лучший ли это подход для выполнения командлетов, определенных в модуле (пожалуйста, научите меня, если есть лучший способ!). В любом случае это работает отлично, если я работаю как административный пользователь. Однако я попытался запустить это как сетевую службу, и у меня возникла недружественная ошибка в конструкторе RunspaceInvoke:

Запрошенный доступ к реестру не разрешен.

Есть ли способ, которым я могу запускать мои командлеты PowerShell в качестве не-повышенного пользователя, такого как Network Service? Мне не нужен или не нужен доступ к реестру. Сам командлет также не требует повышенных привилегий.

Ответ 1

Мы используем версию ниже. Параметр "script" - это PS script для запуска. Мы используем это из командной строки, чтобы мы могли смешивать команды С# с некоторыми написанными в PS. "Результаты" могут быть использованы для оценки оценки вашего script. Строка "out-default" означает, что вывод PS script записывается на консоль. Версия этого может вместо этого захватить вывод в TextBox или аналогичный, если у вас есть приложение WinForm для WPF.

public void run(string script)
{
    IEnumerable<PSObject> results;
    var config = RunspaceConfiguration.Create();
    var host = new ScriptHost();
    using (var runspace = RunspaceFactory.CreateRunspace(host, config))
    {
        runspace.Open();
        runspace.SessionStateProxy.SetVariable("prog", this);

        using (var pipeline = runspace.CreatePipeline())
        {
            if (!string.IsNullOrEmpty(scriptPath))
                pipeline.Commands.AddScript(string.Format("$env:path = \"{0};\" + $env:path", scriptPath));

            pipeline.Commands.AddScript(script);

            var outDefault = new Command("out-default");
            outDefault.MergeMyResults(PipelineResultTypes.Error, PipelineResultTypes.Output);
            pipeline.Commands.Add(outDefault);

            results = pipeline.Invoke();
        }
    }
}

Ответ 2

больше на lkaso answer

это показывает вам, как запускать его как никто, а не только администратора. Вы должны запускать его как кто-то, служба работает как сильно ограниченная учетная запись, которая ничего не может сделать.

или запустить службу как пользователя joe

Ответ 3

Можете ли вы использовать инструмент SysInternals procmon, чтобы узнать, какой доступ к реестру он пытается выполнить? Возможно, это даст вам некоторое представление о том, что вы можете сделать, чтобы решить эту проблему.

Ответ 4

Я думаю, что этот будет отвечать на ваш вопрос.