2

尝试使用模拟从 MVC 3 控制器执行 Powershell cmdlet,但一直收到“不允许请求的注册表访问”。调用 Runspace.Open() 时出现异常

StringBuilder stringBuilder = new StringBuilder();   

RunspaceConfiguration rsConfig = RunspaceConfiguration.Create();

using (new Impersonator("username", "domain", "password"))
{
    Runspace runspace = RunspaceFactory.CreateRunspace(rsConfig);

    runspace.Open();

    Pipeline pipeLine = runspace.CreatePipeline();

    string script = "get-process";
    pipeLine.Commands.AddScript(script);

    Collection<PSObject> commandResults = pipeLine.Invoke();                

    foreach (PSObject obj in commandResults)
    {
        stringBuilder.AppendLine(obj.Properties["ProcessName"].Value.ToString());
    }

调试显示注册表错误是由于在 HKCU\Environment 上尝试读取注册表项所致。在没有模拟的情况下运行上述成功。

注意:在此处找到模拟类:http: //platinumdogs.wordpress.com/2008/10/30/net-c-impersonation-with-network-credentials/

关于为什么会发生这种情况或可以做些什么来解决它的任何想法?

更新:

睡了一会儿后,我推断将 Runspace.Open() 移动到模拟行上方将允许运行空间访问所需的注册表数据(环境变量),这确实有帮助。

现在代码可以与内置的 cmdlet 一起正常工作,但是当我加载“Microsoft.Exchange.Management.PowerShell.Admin”并尝试任何 Exchange Cmdlet 时,应用程序就会崩溃。

4

1 回答 1

1

成功!

如果这对其他人有用,这就是我如何让它工作的:

  1. 安装 Exchange 管理工具
  2. 应用最新的服务包
  3. 确保为域控制器添加参数 (Microsoft - KB943937)
于 2012-02-07T04:09:44.057 回答