Невозможно получить доступ к удаленной объектной ошибке при вызове внешней библиотеки классов - PullRequest
1 голос
/ 24 апреля 2009

У меня есть приложение Windows Forms, которое обеспечивает учетные записи пользователей в Exchange с помощью командлетов Powershell и Exchange2007. В этом приложении есть только одна форма, которая получает информацию для нового пользователя и затем запускает команды Powershell. Как хороший программист, я просто переработал код, вынул все вызовы Exchange и Active Directory и поместил их в отдельные классы. В форме Windows я вызываю следующий код в событии Click кнопки:

ExchangeMailboxFunctions exFuncs = new ExchangeMailboxFunctions();

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

В самом классе у меня есть следующее:

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)

thisPipeline.Invoke вызывает ошибку, и я понятия не имею, что утилизируется. Этот код прекрасно работал, когда он был в коде позади формы. У меня также есть некоторые методы Active Directory, которые я вырвал в отдельную библиотеку классов, и они, кажется, работают нормально.

Что я должен сделать, чтобы это перестало происходить? Спасибо!

Ответы [ 2 ]

2 голосов
/ 24 апреля 2009

Убедитесь, что ваш код на самом деле выглядит так ...

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

    thisPipeline.Invoke();
}

Скобки - это ключ, и они отсутствуют в вашем примере.

0 голосов
/ 24 апреля 2009

Извините, ребята, скобки и тому подобное были на самом деле хорошими - я, должно быть, оставил их вне вопросов. Я пропустил эти строки кода в методе создания:

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

Так как использование, расположенное до вызова Invoke, было вызвано, ss не было, поскольку оно уже было уничтожено. Должен был посмотреть немного глубже, прежде чем опубликовать это: - (

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...