我正在尝试从 ac# 应用程序执行 PowerShell 脚本。该脚本必须在特殊的用户上下文下执行。
我尝试了不同的场景,有些可行,有些不行:
1. PowerShell直接调用
我直接从在正确用户凭据下运行的 ps-console 调用了该脚本。
C:\Scripts\GroupNewGroup.ps1 1
结果:成功运行脚本。
2.来自ac#控制台应用程序
我从 ac# consoleapplication 调用了脚本,该脚本在正确的用户凭据下启动。
代码:
string cmdArg = "C:\\Scripts\\GroupNewGroup.ps1 1"
Runspace runspace = RunspaceFactory.CreateRunspace();
runspace.ApartmentState = System.Threading.ApartmentState.STA;
runspace.ThreadOptions = PSThreadOptions.UseCurrentThread;
runspace.Open();
Pipeline pipeline = runspace.CreatePipeline();
pipeline.Commands.AddScript(cmdArg);
pipeline.Commands[0].MergeMyResults(PipelineResultTypes.Error, PipelineResultTypes.Output);
Collection<PSObject> results = pipeline.Invoke();
var error = pipeline.Error.ReadToEnd();
runspace.Close();
if (error.Count >= 1)
{
string errors = "";
foreach (var Error in error)
{
errors = errors + " " + Error.ToString();
}
}
结果:没有成功。还有很多“空数组”异常。
3. 来自 ac# 控制台应用程序 - 代码端模拟
(http://platinumdogs.me/2008/10/30/net-c-impersonation-with-network-credentials)
我从 ac# consoleapplication 调用了脚本,该脚本在正确的用户凭据下启动,并且代码包含模拟。
代码:
using (new Impersonator("Administrator2", "domain", "testPW"))
{
using (RunspaceInvoke invoker = new RunspaceInvoke())
{
invoker.Invoke("Set-ExecutionPolicy Unrestricted");
}
string cmdArg = "C:\\Scripts\\GroupNewGroup.ps1 1";
Runspace runspace = RunspaceFactory.CreateRunspace();
runspace.ApartmentState = System.Threading.ApartmentState.STA;
runspace.ThreadOptions = PSThreadOptions.UseCurrentThread;
runspace.Open();
Pipeline pipeline = runspace.CreatePipeline();
pipeline.Commands.AddScript(cmdArg);
pipeline.Commands[0].MergeMyResults(PipelineResultTypes.Error, PipelineResultTypes.Output);
Collection<PSObject> results = pipeline.Invoke();
var error = pipeline.Error.ReadToEnd();
runspace.Close();
if (error.Count >= 1)
{
string errors = "";
foreach (var Error in error)
{
errors = errors + " " + Error.ToString();
}
}
}
结果:
- 术语“Get-Contact”未被识别为 cmdlet、函数、脚本文件或可运行程序的名称。检查名称的拼写,或者如果包含路径,请验证路径是否正确并重试。
- 术语“C:\Scripts\FunctionsObjects.ps1”未被识别为 cmdlet、函数、脚本文件或可运行程序的名称。检查名称的拼写,或者如果包含路径,请验证路径是否正确并重试。
- 没有为 Windows PowerShell 版本 2 注册任何管理单元。Microsoft.Office.Server,版本=14.0.0.0,Culture=neutral,PublicKeyToken=71e9bce111e9429c
- System.DirectoryServices.AccountManagement,版本=4.0.0.0,文化=中性,PublicKeyToken=b77a5c561934e089
- 使用“1”参数调用“.ctor”的异常:“
http://XXXX/websites/Test4/
找不到 Web 应用程序。请验证您是否正确键入了 URL。如果 URL 应该提供现有内容,系统管理员可能需要添加映射到预期应用程序的新请求 URL。” - 您不能在空值表达式上调用方法。无法索引到空数组。
直到现在还没有有效的答案
有谁知道为什么存在差异以及如何解决问题?