Как запустить сценарий PowerShell из C # как пользователь без повышенных прав - PullRequest
10 голосов
/ 13 февраля 2010

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

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

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 от имени пользователя без повышенных прав, такого как сетевая служба? Мне не нужно или желание получить доступ к реестру. Сам командлет также не требует повышенных привилегий.

Ответы [ 4 ]

2 голосов
/ 20 февраля 2010

Мы используем версию ниже. Параметр «script» - это сценарий PS для запуска. Мы используем это из пользовательской командной строки, чтобы мы могли смешивать команды c # с некоторыми, написанными на PS. «результаты» могут быть использованы для захвата оценки вашего сценария. Строка out-default означает, что вывод сценария PS записывается на консоль. Версия этого может вместо этого захватывать вывод в 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();
        }
    }
}
0 голосов
/ 20 февраля 2010

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

0 голосов
/ 17 февраля 2010

больше на lkaso ответ

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

или запустите сам сервис от имени пользователя joe

0 голосов
/ 13 февраля 2010

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

...