第二次尝试从IIS调用powershell失败

本文关键字:调用 powershell 失败 IIS 第二次 | 更新日期: 2023-09-27 18:24:10

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

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

第一个登录该网站的用户一切都很好
第一个用户可以无限次运行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();
}

愿意提供任何帮助
提前感谢。

第二次尝试从IIS调用powershell失败

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

这是微软在与微软顾问闲聊数小时后的回答。

您可以通过为每个运行空间打开一个新进程来解决这个问题,也可以使用win32api传递给用户。