如何从C#运行PowerShell脚本作为非升级用户
问题描述:
我想从C#应用程序运行PowerShell脚本,并且需要脚本在我的C#应用程序以非管理员用户身份运行时运行(例如网络服务或其他域帐户)。如何从C#运行PowerShell脚本作为非升级用户
以前,我用的是下面的代码:(!请教我,如果有一个更好的办法)
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本身也不需要提升特权。
答
更多lkaso答案
此向您展示如何运行它的任何人,而不仅仅是管理。你必须像其他人一样运行它,该服务作为一个严重受限帐户运行,无法做任何事情。
或运行服务本身乔用户
答
我们使用一个版本的下方。 “script”参数是要运行的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();
}
}
}
谢谢,但我不想提升或模仿。我试图将PowerShell脚本作为*低权限*用户运行,而不是高权限用户。 – 2010-02-14 17:34:49