gpt4 book ai didi

c# - 如何以非提升用户身份从 C# 运行 PowerShell 脚本

转载 作者:可可西里 更新时间:2023-11-01 09:15:57 24 4
gpt4 key购买 nike

我正在尝试从 C# 应用程序运行 PowerShell 脚本,并且我需要在我的 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");
}

我不知道这是否是运行模块中定义的 cmdlet 的最佳方法(如果有更好的方法,请教我!)。无论如何,如果我以管理用户身份运行,这将非常有效。然而,我尝试将其作为网络服务运行,但在 RunspaceInvoke 的构造函数中遇到了一个不友好的错误:

不允许请求的注册表访问权限。

有没有一种方法可以让我以非权限用户(例如网络服务)的身份运行我的 PowerShell cmdlet?我不需要也不希望访问注册表。该 cmdlet 本身也不需要提升的权限。

最佳答案

我们使用以下版本。 “脚本”参数是要运行的 PS 脚本。我们从自定义命令行使用它,以便我们可以将 c# 命令与一些用 PS 编写的命令混合使用。 “结果”可用于捕获脚本的评估。 “out-default”行表示 PS 脚本的输出被写入控制台。如果您有 WPF 应用程序的 WinForm,则此版本可以改为将输出捕获到 TextBox 或类似内容。

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();
}
}
}

关于c# - 如何以非提升用户身份从 C# 运行 PowerShell 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2256408/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com