Как запустить 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
Я думаю, что этот будет отвечать на ваш вопрос.