2013-05-08 4 views
1

Я пытаюсь вызвать файл сценария powershell на удаленном сервере, который в основном получает параметр и создает общий диск с использованием этого параметра. Учетные все правильно, но всякий раз, когда я запускаю это, он возвращает эту ошибку:вызов сценария remote powershell с разными учетными данными в C#

When the runspace is set to use the current thread the apartment state in the invocation settings must match that of the current thread

Это что-то делать с учетными данными, как когда я извлекал удостоверение, он прекрасно работает на моей локальной машине. Может ли кто-нибудь пролить свет на это? Спасибо,

Ниже мой C# сценарий:

PSCredential credential = new PSCredential(_exchangeUsername, password); 

// Set exchange connection details 
WSManConnectionInfo connectionInfo = new WSManConnectionInfo((new Uri(_exchangeConnectionUri)), "http://schemas.microsoft.com/powershell/Microsoft.Exchange", credential); 

connectionInfo.AuthenticationMechanism = AuthenticationMechanism.Default; 
string cmdArg = @"\\servername\\c$\\scripts\\HomeDrive.ps1 "+userID; 

using (Runspace runspace = RunspaceFactory.CreateRunspace(connectionInfo)) 
{ 
    try 
    { 
     runspace.ThreadOptions = PSThreadOptions.UseCurrentThread; 
     runspace.ApartmentState = System.Threading.ApartmentState.STA; 
     runspace.Open(); 

     Pipeline pipeline = runspace.CreatePipeline(); 
     pipeline.Commands.AddScript(cmdArg); 
     pipeline.Commands[0].MergeMyResults(PipelineResultTypes.Error, PipelineResultTypes.Output); 
     Collection<PSObject> results = pipeline.Invoke(); 
     var error = pipeline.Error.ReadToEnd(); 
     // Check for powershell command errors 
     if (error.Count > 0) 
     { 
      throw new Exception(errorMessage.ToString()); 
     } 

     // Check for powershell command results 
     if (results.Count <= 0) 
     { 
      throw new Exception(String.Format("Error. No results after command invoked.", userID)); 
     } 
     runspace.Close(); 
    } 
    catch (Exception ex) 
    { 
     runspace.Close(); 
     throw new ApplicationException(String.Format("Error ", userID), ex); 
    } 
} 
+0

Он не любит 'runspace.ApartmentState = System. Threading.ApartmentState.STA', поскольку текущий поток не является потоком STA. Вам нужно либо удалить эту строку, либо удалить строку над ней ... –

+0

Если я удаляю одну из строк, она выдает ошибку «Метод определения не поддерживается» – user2360891

+0

Какой метод говорит, что он не поддерживается? –

ответ

0

Я думаю, что вы используете неправильные перегрузки конструктора WSManConnectionInfo. вы можете проверить свойство Credential на объекте после его создания, но перед тем, как передать его для создания рабочей области.

Вот отрывок из моего собственного кода, где это работает хорошо, где я использую самый многословный из конструкторов (я думаю)

#region create WSmanconnection 
//Create the PowerShell Remoting WinRM WSMan connection object so we can connect to the remote machine, only using credentials if Not Implicitly negotiated. 
var ci = new WSManConnectionInfo(
    useSSL, trueFQDN , port, appName, shellUri, 
    (authenticationMechanism == AuthenticationMechanism.NegotiateWithImplicitCredential) ? null : credential) 
    { 
     AuthenticationMechanism = authenticationMechanism, 
     OpenTimeout = openTimeoutMinutes * 60 * 1000, 
     OperationTimeout = operationTimeoutMinutes * 60 * 1000, 
     IdleTimeout = idleTimeOut * 60 * 1000 
    }; 
#endregion 
Смежные вопросы