2009-04-23 8 views
1

Ich habe eine Windows Forms App, die Benutzerkonten in Exchange mit Powershell und Exchange2007-Cmdlets bereitstellt. Es gibt nur ein Formular für diese Anwendung, das die Informationen für den neuen Benutzer übernimmt und anschließend die Powershell-Befehle ausführt. Wie ein guter Programmierer habe ich den Code einfach umstrukturiert und alle Exchange- und Active Directory-Aufrufe herausgenommen und in separate Klassen aufgeteilt. In der Windows-Formular, ich den folgenden Code in einer Schaltfläche Click-Ereignis aufrufen:Ich kann nicht auf einen Objektfehler bei externer Klassenbibliothek zugreifen

ExchangeMailboxFunctions exFuncs = new ExchangeMailboxFunctions(); 

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

in der Klasse selbst, ich habe die folgenden:

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) 

Die thisPipeline.Invoke verursacht den Fehler und ich habe keine Ahnung, was disposed ist. Dieser Code funktionierte einwandfrei, wenn er im Codebehind des Formulars enthalten war. Ich habe auch einige Active Directory-Methoden, die ich in eine separate Klassenbibliothek riss und sie scheinen gut zu funktionieren.

Was soll ich tun, damit dies aufhört? Vielen Dank! in Ihrem Beispiel

Antwort

2

Stellen Sie sicher, tatsächlich Ihr Code wie folgt aussieht ...

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

    thisPipeline.Invoke(); 
} 

Die Klammern ist der Schlüssel, und sie fehlen.

+0

Yup, das ist was passiert. Es scheint auch noch ein weiteres "}" für die Funktion zu fehlen. – JasonMArcher

0

Sorry Leute, die Klammern und so waren eigentlich in Ordnung - ich muss sie aus den Fragen herausgelassen haben. Ich vermisste diese Zeilen von Code in der Methode erstellen:

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

Da die angeordnet sind, bevor die Invoke genannt wurde, gab es keine ss, wie es war bereits Angeordnet. Sollte etwas tiefer geschaut haben, bevor ich das poste :-(

Verwandte Themen