2013-07-21 5 views
0

Я пытаюсь запустить сценарий powershell с сайта ASP.NET, размещенного на IIS 7.5 в Windows 2008R2.Вызов powershell из IIS завершился неудачно при второй попытке

На сайте есть два поля для имени пользователя и пароля и кнопки.
При нажатии кнопки выполняется следующий код и вывод, записанный на сайт.

Все работает отлично с первым пользователем, который зашел на сайт.
Первый пользователь может запускать командлет бесконечно много раз.
Но когда я вхожу на сайт с другим пользователем (аутентификация Kerberos), второй пользователь (и все остальные пользователи) не может запустить сценарий.
Ошибка RunspaceFactory.CreateRunspace() с исключением.
Зачем? Хороший вопрос, сообщение и внутреннее исключение пустое.
Журнал событий также пуст.
После команды 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 бы любую помощь!
Спасибо в продвинутом состоянии.

+0

Почему он говорит, что аутентификация - ... вместо =? – Eris

+0

Typo .. Написано на блокноте. Сожалею. –

ответ

0

ОК, поэтому проблема на самом деле является ошибкой (или функцией) в библиотеке powershell. Объект просто не умрет, даже если вы нажмете GC.

Это ответ Microsoft через часы работы windbg с консультантом Microsoft.

Вы можете обойти эту проблему, открыв новый процесс для каждой рабочей области и можете передать пользователя с помощью win32api.