【问题标题】:Invoking powershell from IIS failed on second attempt第二次尝试从 IIS 调用 powershell 失败
【发布时间】:2013-07-20 05:57:59
【问题描述】:

我正在尝试从托管在 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();
}

希望有任何帮助!
提前致谢。

【问题讨论】:

  • 为什么说 Authentication - ... 而不是 = ?
  • 错字.. 写在记事本上。对不起。

标签: c# asp.net iis powershell w3wp


【解决方案1】:

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

这是微软在与微软顾问的几个小时的 windbg 之后给出的答案。

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

【讨论】:

    猜你喜欢
    • 2012-05-25
    • 1970-01-01
    • 2022-08-15
    • 2011-08-13
    • 1970-01-01
    • 2023-01-25
    • 2020-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多