我有一个Windows窗体应用程序,它使用Powershell和Exchange2007 cmdlet在Exchange中配置用户帐户。此应用程序只有一个表单,它为新用户提供信息,然后运行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导致错误,我不知道什么是Disposed。当代码在表单的代码隐藏中时,这段代码完全正常。我还有一些Active Directory方法,我将它们分成一个单独的类库,它们似乎工作正常。
我该怎么办才能让这件事停止发生?谢谢!
答案 0 :(得分:2)
确保您的代码实际上看起来像这样......
using (Pipeline thisPipeline = thisRunspace.CreatePipeline())
{
[Set a bunch of pipLine parameters here]
thisPipeline.Invoke();
}
括号是关键,在你的例子中它们是缺失的。
答案 1 :(得分:0)
对不起伙计们,括号等等实际上还好 - 我一定是把它们排除在问题之外。我在create方法中错过了这些代码行:
using (SecureString ss = new SecureString())
{
foreach (char c in Password)
ss.AppendChar(c);
thisPipeline.Commands[0].Parameters.Add("Password", ss);
}
由于在调用Invoke之前使用了dispos,因此没有ss,因为它已经被Disposed。在发布之前应该看得更深一些: - (