2009-04-23 8 views
1

J'ai une application Windows Forms qui provisionne les comptes d'utilisateur dans Exchange à l'aide des cmdlets Powershell et Exchange2007. Il existe un seul formulaire pour cette application qui prend les informations pour le nouvel utilisateur, puis exécute les commandes Powershell. Comme un bon programmeur, je viens de refactoriser le code et de sortir tous les appels Exchange et Active Directory et de les mettre dans des classes séparées. Sous la forme Windows, j'appelle le code suivant dans un bouton événement Click:Impossible d'accéder à une erreur d'objet éliminé sur l'appel de la bibliothèque de classes externe

ExchangeMailboxFunctions exFuncs = new ExchangeMailboxFunctions(); 

exFuncs.CreateNewMailbox(username, userPrincipalName, OU, txtDisplayName.Text, txtFirstName.Text, txtInitials.Text, txtLastName.Text, 
    txtPassword1.Text, ckbUserChangePassword.Checked, mailboxLocation); 

Dans la classe elle-même, je donne les résultats suivants:

RunspaceConfiguration config = RunspaceConfiguration.Create(); 
PSSnapInException warning; 
Runspace thisRunspace; 

public ExchangeMailboxFunctions() 
    { 
     InitializePowershell(); 
    } 

    private void InitializePowershell() 
    { 
     try 
     { 
      thisRunspace = RunspaceFactory.CreateRunspace(config); 
      config.AddPSSnapIn("Microsoft.Exchange.Management.PowerShell.Admin", out warning); 
      thisRunspace.Open(); 
     } 
     catch (Exception ex) 
     { 
      throw new Exception(string.Format("Could not initialize Powershell: {0}", ex.Message)); 
     } 
    } 

public void CreateNewMailbox(string username, string userPrincipalName, string OU, string DisplayName, string FirstName, string Initials, 
     string LastName, string Password, bool ChangePasswordNextLogon, string MailboxLocation) 
    { 

     try 
     { 
      using (Pipeline thisPipeline = thisRunspace.CreatePipeline()) 

    [Set a bunch of pipLine parameters here] 

    thisPipeline.Invoke(); 
    } 
    catch (Exception ex) 

Le thisPipeline.Invoke provoque l'erreur et je aucune idée de ce qui est éliminé. Ce code fonctionnait parfaitement quand il était dans le code derrière le formulaire. J'ai également certaines méthodes Active Directory que j'ai déchiré dans une bibliothèque de classes séparée et ils semblent fonctionner correctement. Que dois-je faire pour que cela cesse de se produire?

Merci!

Répondre

2

Assurez-vous que votre code ressemble vraiment à ce ...

using (Pipeline thisPipeline = thisRunspace.CreatePipeline()) 
{ 
    [Set a bunch of pipLine parameters here] 

    thisPipeline.Invoke(); 
} 

Les supports étant la clé, et qu'ils manquent dans votre exemple.

+0

Yup, c'est ce qui se passe Il semble aussi y avoir un autre "}" manquant pour la fonction. – JasonMArcher

0

Désolé les gars, les parenthèses et tels étaient en fait ok - je les ai dû laisser hors des questions. J'ai raté ces lignes de code dans la méthode de création:

using (SecureString ss = new SecureString()) 
{ 
    foreach (char c in Password) 
     ss.AppendChar(c); 
    thisPipeline.Commands[0].Parameters.Add("Password", ss); 
} 

Depuis l'utilisation de l'avant disposé à Invoke été appelé, il n'y avait pas art comme il a été déjà traité. Si vous aviez regardé un peu plus loin avant de poster ceci :-(