【发布时间】:2013-09-05 01:55:06
【问题描述】:
我已经编写了一些东西来使用 RunspaceFactory 通过 C# 执行 Powershell。
我正在像这样加载默认的 Powershell 配置文件:
Runspace runspace = RunspaceFactory.CreateRunspace();
runspace.Open();
string scriptText = @". .\" + scriptFileName + "; " + command;
Pipeline pipeline = runspace.CreatePipeline(scriptText);
Command = 我知道的配置文件中的一个函数。
所有这些 Powershell 的东西都包裹在 Impersonator 中。
为免生疑问,$profile = C:\Users\Administrator\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
这是在 IIS 7.5 下运行的 Web 应用程序
如果我的 IIS 应用程序在“管理员”帐户下运行,它可以工作。在任何其他帐户下都会引发错误:
“术语 '.\Microsoft.PowerShell_profile.ps1' 未被识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,或者如果包含路径,请确认路径正确,然后重试。”
当我冒充“管理员”帐户时,我认为该位置是正确的。
使用调用的“获取位置”进行一些日志记录会报告该目录应该是什么。
出于血腥的想法,我试图强迫它:
System.Environment.CurrentDirectory = dir;
... 并且还尝试调用“set-location”。这些工作,但如果我从运行空间调用“get-location”,它会报告与以前相同的目录(正确的目录)。
我认为,也许,模拟可能存在问题,所以我编写了一些测试,以应用程序池不应该做的方式接触文件系统。这些工作。
我也检查了这个:
string contextUserName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
当代码被“包装”在模拟程序中以及通过应用程序池身份执行时,它都会报告正确的用户。然后我绝望了,尝试调用:
@"cmd /c dir"
...(还有 get-Childitem)。两个命令都返回:
{}
...当以应用程序池身份运行时(无论模拟如何),但当应用程序池以“管理员”身份运行时,正确目录的完整且准确的目录列表。
我确信我在这里遗漏了一些愚蠢和基本的东西,如果有人可以就我在思考(和代码)中犯错误的地方给我一些指导,那就太好了。
【问题讨论】:
标签: c# powershell