0

我正在尝试从托管在 Windows 2008R2 上的 IIS 7.5 上的 ASP.NET 站点运行 powershell 脚本。

该站点有两个字段,用于用户名和密码以及一个按钮。
按下按钮时,将执行以下代码,并将输出写入站点。

登录该站点的第一个用户一切正常。
第一个用户可以无限次运行 cmdlet。
但是,当我使用其他用户(kerberos 身份验证)登录站点时,第二个用户(以及所有其他用户)无法运行该脚本。
RunspaceFactory.CreateRunspace() 因异常而失败。
有什么例外?好问题, Message 和 innerException 是空白的。
事件日志也为空。
在 iisreset 命令之后,第一个用户再次能够运行脚本,而所有其他用户都无法运行。

此外,我构建了一个 WinForms 应用程序,它使用用户名和密码字段执行完全相同的操作,并且一切正常!
所以我假设,问题出在 IIS 与 powershell 的连接上。

每次按下按钮时都会执行以下代码:(
可能包含轻微的语法错误,用记事本编写(无法复制过去))

string serverNameFQDN = "myserver.mydomain.com";

char[] cArray = passwordClearText.ToCharArray();
SecureString secString = new SecureString();

foreach(char c in cArray)
{
        secString.AppendChar(c);
}

PSCredential psCred = new PSCredential(Username, secString);

WSManConnectionInfo connectionInfo = 
    new WSManConnectionInfo(new Uri(String.Format("http://{0}:5985/wsman", serverNameFQDN)),
                    "http://schemas.microsoft.com/powershell/Microsoft.Powershell", psCred)
    {
        AuthenticationMechanism = AuthenticationMechanism.Kerberos,
        OpenTimeout = 10000,
        OperationTimeout = 30*60*1000;
    };

using (Runspace remoteRunspace = RunspaceFactory.CreateRunspace(connectionInfo))
{
    var pipe = remoteRunspace.CreatePipeline();
    remoteRunspace.Open();

    pipe.Commands.AddScript("some-cmdlet");
    var res = pipe.Invoke();

    // Get the output, irrelevent.

    pipe.Stop();
    pipe.Dispose();
    remoteRunSpace.Close();
}

将appriciate任何帮助!
先谢谢了。

4

1 回答 1

0

好的,所以问题实际上是 powershell 库中的错误(或功能)。即使您强制 GC,该对象也不会死。

这是微软在与微软顾问进行了数小时的 windbg 之后的回答。

您可以通过为每个运行空间打开一个新进程来绕过此问题,并且可以使用 win32api 传递用户。

于 2013-11-12T18:21:08.650 回答